{"id":20880,"date":"2026-10-27T18:03:00","date_gmt":"2026-10-27T17:03:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=20880"},"modified":"2026-10-25T22:34:29","modified_gmt":"2026-10-25T21:34:29","slug":"wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/","title":{"rendered":"WordPress Playground: Blueprint do podgl\u0105du wtyczki i test\u00f3w"},"content":{"rendered":"<p>Przycisk \u201ePreview\u201d na stronie wtyczki w WordPress.org otwiera tymczasow\u0105 witryn\u0119 testow\u0105 w przegl\u0105darce. PHP i baza danych dzia\u0142aj\u0105 dzi\u0119ki WebAssembly. Plik o nazwie Blueprint opisuje konfiguracj\u0119: na przyk\u0142ad wersj\u0119 PHP, wymagane wtyczki i dane demonstracyjne. Ten sam plik mo\u017ce s\u0142u\u017cy\u0107 do podgl\u0105du w katalogu, lokalnych uruchomie\u0144 Playground i cz\u0119\u015bci automatycznych test\u00f3w korzystaj\u0105cej z Playground.<\/p>\n<p>Przyk\u0142ad dodaje do Contact Form 7 ma\u0142\u0105 wtyczk\u0119 demonstracyjn\u0105. Druga \u015bcie\u017cka testowa korzysta z Dockera i <code>wp-env<\/code>. Ma w\u0142asny plik <code>.wp-env.json<\/code> i nie wykonuje Blueprintu. R\u00f3\u017cnica jest widoczna: Blueprint ustawia opcj\u0119 na 14, a aktywacja bez Blueprintu na 30. Artyku\u0142 rozdziela te dwie \u015bcie\u017cki i dok\u0142adnie opisuje zakres test\u00f3w. Pierwotne wyniki uruchomie\u0144 pochodz\u0105 z 29.09.2026; schemat, \u017ar\u00f3d\u0142a i izolowane kontrole sprawdzono ponownie 25.10.2026.<\/p>\n<h2>Playground, Blueprinty i najwa\u017cniejsze kroki<\/h2>\n<p>Playground w przegl\u0105darce nie potrzebuje osobnego serwera WWW z PHP. PHP dzia\u0142a jako WebAssembly, a baza korzysta z SQLite. Wersja wiersza polece\u0144 u\u017cywa tego \u015brodowiska pod Node.js. Przedstawiony Blueprint w formacie V1 jest plikiem JSON: <code>landingPage<\/code> wybiera pierwsz\u0105 stron\u0119, <code>preferredVersions<\/code> zawiera <code>php<\/code> i <code>wp<\/code>, a <code>steps<\/code> okre\u015bla kolejno\u015b\u0107 czynno\u015bci. Przyk\u0142ad jawnie w\u0142\u0105cza <code>features.networking<\/code>. <code>$schema<\/code> wskazuje regu\u0142y, wed\u0142ug kt\u00f3rych edytor mo\u017ce sprawdzi\u0107 plik.<\/p>\n<p>Obs\u0142ugiwane wersje zale\u017c\u0105 od wydania Playground. Aktualny schemat przyjmuje mi\u0119dzy innymi PHP 7.4 i od 8.0 do 8.5 oraz <code>latest<\/code> i <code>next<\/code>; istniej\u0105 te\u017c specjalne wpisy dla starszych wersji. Dla przyk\u0142adu wa\u017cniejsze s\u0105 konkretne kombinacje ni\u017c rzekomo niezmienna pe\u0142na lista. Macierz podaje wi\u0119c WordPressa 6.7.9, 7.0.6 i 7.1.2. To wybrane wersje testowe, a nie informacja o najnowszym obecnie wydaniu.<\/p>\n<p>Konfiguracja przyk\u0142adu wymaga trzech krok\u00f3w:<\/p>\n<ul>\n<li><code>installPlugin<\/code> przyjmuje zas\u00f3b w <code>pluginData<\/code>, na przyk\u0142ad <code>{\"resource\": \"wordpress.org\/plugins\", \"slug\": \"contact-form-7\"}<\/code>, adres <code>url<\/code> do pliku ZIP albo odwo\u0142anie typu <code>git:directory<\/code>. Aktywacj\u0105 steruje <code>options.activate<\/code>; klucz nale\u017cy umie\u015bci\u0107 w <code>options<\/code>, a nie w <code>pluginData<\/code>. Gdy go brak, kod \u017ar\u00f3d\u0142owy przyjmuje true.<\/li>\n<li><code>login<\/code> potrzebuje tylko <code>username<\/code>, domy\u015blnie <code>admin<\/code>. Pole <code>password<\/code> jest w schemacie oznaczone jako przestarza\u0142e.<\/li>\n<li><code>setSiteOptions<\/code> zapisuje warto\u015bci z <code>options<\/code> jako opcje WordPressa. Przyk\u0142ad ustawia tytu\u0142 witryny i warto\u015b\u0107 demonstracyjn\u0105 14.<\/li>\n<\/ul>\n<p>Inne kroki mog\u0105 wykonywa\u0107 PHP, instalowa\u0107 pakiety j\u0119zykowe lub ustawia\u0107 warto\u015bci w <code>wp-config.php<\/code>. Starsze przyk\u0142ady zawieraj\u0105 <code>pluginZipFile<\/code> i <code>phpExtensionBundles<\/code>; aktualny schemat oznacza te pola jako przestarza\u0142e lub nieu\u017cywane. Kolejno\u015b\u0107 zale\u017cno\u015bci jest zapisana jawnie w <code>steps<\/code>. Publicznie dost\u0119pny Blueprint mo\u017cna otworzy\u0107 przez <code>?blueprint-url=<\/code>; inn\u0105 mo\u017cliwo\u015bci\u0105 jest fragment JSON po <code>https:\/\/playground.wordpress.net\/#<\/code>. Diagram oddziela wsp\u00f3lny Blueprint Playground od osobnej konfiguracji Dockera.<\/p>\n<figure class=\"lw-diagram\">\n<img loading=\"lazy\" decoding=\"async\" alt=\"Blueprint obs\u0142uguje podgl\u0105d, lokalne uruchomienia Playground i Playground w CI. Docker osobno u\u017cywa .wp-env.json i domy\u015blnej warto\u015bci 30 zamiast warto\u015bci demo 14.\" height=\"580\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/playground-reviewed-20880-pl-20261025.png\" width=\"1120\"\/>\n<figcaption>Blueprint obs\u0142uguje podgl\u0105d, lokalne uruchomienia Playground i Playground w CI. Docker osobno u\u017cywa .wp-env.json i domy\u015blnej warto\u015bci 30 zamiast warto\u015bci demo 14.<\/figcaption>\n<\/figure>\n<h2>Blueprint dla podgl\u0105du w katalogu<\/h2>\n<p>Publiczny podgl\u0105d wymaga poprawnego pliku <code>assets\/blueprints\/blueprint.json<\/code> w katalogu SVN. Commiter, czyli konto z prawem zapisu do repozytorium tej wtyczki, musi dodatkowo ustawi\u0107 podgl\u0105d na \u201epublic\u201d w sekcji \u201eAdvanced\u201d. Wcze\u015bniej \u201eTest Preview\u201d jest widoczne tylko dla takich kont. Automatycznie wygenerowany Blueprint testowy mo\u017ce s\u0142u\u017cy\u0107 jako punkt wyj\u015bcia.<\/p>\n<p>Sprawdzony importer przyjmuje pasuj\u0105ce pliki Blueprint z tego folderu, do 102 400 bajt\u00f3w ka\u017cdy, i zachowuje najwy\u017cej dziesi\u0119\u0107. Zwyk\u0142y podgl\u0105d u\u017cywa <code>blueprint.json<\/code>. Niepoprawny JSON jest odrzucany. Dla przyk\u0142adowej wtyczki importer dopisuje na ko\u0144cu instalacj\u0119 w\u0142asnego sluga, je\u015bli brakuje odpowiedniego kroku, i wymusza aktywacj\u0119. Pasuj\u0105ce adresy ZIP z <code>downloads.wordpress.org<\/code> zamienia na zasoby ze slugiem. Wersja wskazana w nazwie pliku mo\u017ce wi\u0119c zosta\u0107 utracona. Import nie przekazuje pliku bez zmian.<\/p>\n<p>Blueprint instaluje zatem Contact Form 7 i ustawia dane demonstracyjne, ale nie pobiera samego dodatku. Katalog dopisuje takie pobranie. Lokalna wersja Playground CLI zamiast tego montuje folder roboczy i aktywuje dodatek po krokach Blueprintu. Osobny krok pobierania m\u00f3g\u0142by zawie\u015b\u0107 dla nieopublikowanej wtyczki albo zast\u0105pi\u0107 zamontowany folder przez domy\u015bln\u0105 opcj\u0119 <code>overwrite<\/code>. \u015acie\u017cka Dockera niezale\u017cnie korzysta z w\u0142asnej listy wtyczek.<\/p>\n<p>W projekcie Git plik znajduje si\u0119 tutaj pod <code>.wordpress-org\/blueprints\/blueprint.json<\/code>. Nazwa folderu jest konwencj\u0105 przyk\u0142adu. Proces wydania kopiuje plik do <code>assets\/blueprints\/<\/code> w SVN. Kropka na pocz\u0105tku nazwy nie wyklucza automatycznie folderu z paczki ZIP wtyczki; proces pakowania musi rzeczywi\u015bcie zastosowa\u0107 takie wykluczenie.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"json\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">JSON<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-json\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">{\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"$schema\"<\/span>: <span class=\"cbb-string\">\"https:\/\/playground.wordpress.net\/blueprint-schema.json\"<\/span>,\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"landingPage\"<\/span>: <span class=\"cbb-string\">\"\/wp-admin\/plugins.php\"<\/span>,\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"preferredVersions\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"php\"<\/span>: <span class=\"cbb-string\">\"8.3\"<\/span>,\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"wp\"<\/span>: <span class=\"cbb-string\">\"latest\"<\/span>\n<\/span><span class=\"cbb-line\">\t},\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"features\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"networking\"<\/span>: <span class=\"cbb-constant\">true<\/span>\n<\/span><span class=\"cbb-line\">\t},\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"steps\"<\/span>: &#91;\n<\/span><span class=\"cbb-line\">\t\t{\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"step\"<\/span>: <span class=\"cbb-string\">\"login\"<\/span>,\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"username\"<\/span>: <span class=\"cbb-string\">\"admin\"<\/span>\n<\/span><span class=\"cbb-line\">\t\t},\n<\/span><span class=\"cbb-line\">\t\t{\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"step\"<\/span>: <span class=\"cbb-string\">\"installPlugin\"<\/span>,\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"pluginData\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t\t<span class=\"cbb-attr\">\"resource\"<\/span>: <span class=\"cbb-string\">\"wordpress.org\/plugins\"<\/span>,\n<\/span><span class=\"cbb-line\">\t\t\t\t<span class=\"cbb-attr\">\"slug\"<\/span>: <span class=\"cbb-string\">\"contact-form-7\"<\/span>\n<\/span><span class=\"cbb-line\">\t\t\t},\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"options\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t\t<span class=\"cbb-attr\">\"activate\"<\/span>: <span class=\"cbb-constant\">true<\/span>\n<\/span><span class=\"cbb-line\">\t\t\t}\n<\/span><span class=\"cbb-line\">\t\t},\n<\/span><span class=\"cbb-line\">\t\t{\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"step\"<\/span>: <span class=\"cbb-string\">\"setSiteOptions\"<\/span>,\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"options\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t\t<span class=\"cbb-attr\">\"blogname\"<\/span>: <span class=\"cbb-string\">\"LW Form Archive Demo\"<\/span>,\n<\/span><span class=\"cbb-line\">\t\t\t\t<span class=\"cbb-attr\">\"lw_form_archive_retention_days\"<\/span>: <span class=\"cbb-number\">14<\/span>\n<\/span><span class=\"cbb-line\">\t\t\t}\n<\/span><span class=\"cbb-line\">\t\t}\n<\/span><span class=\"cbb-line\">\t&#93;\n<\/span><span class=\"cbb-line\">}<\/span><\/code><\/pre><\/figure>\n<p>Stron\u0105 startow\u0105 jest lista wtyczek. WordPress od wersji 6.5 pokazuje tam zale\u017cno\u015b\u0107 mi\u0119dzy dodatkiem a Contact Form 7. Starszy przyk\u0142ad w Handbook zawiera przestarza\u0142e pola Blueprintu i starsze wersje \u015brodowiska. Poni\u017cszy Blueprint u\u017cywa <code>pluginData<\/code> i przeszed\u0142 kontrol\u0119 wed\u0142ug schematu pobranego 25.10.2026.<\/p>\n<h2>Requires Plugins: deklaracja zale\u017cno\u015bci<\/h2>\n<p>Od WordPressa 6.5 nag\u0142\u00f3wek <code>Requires Plugins<\/code> wymienia wymagane wtyczki. Oczekiwane s\u0105 slugi WordPress.org rozdzielone przecinkami, na przyk\u0142ad <code>contact-form-7<\/code>, a nie \u015bcie\u017cki plik\u00f3w. Slug to kr\u00f3tki identyfikator katalogowy wtyczki. B\u0142\u0119dny zapis mo\u017ce wypa\u015b\u0107 z listy zale\u017cno\u015bci. Poni\u017cszy dodatek demonstruje wy\u0142\u0105cznie ten nag\u0142\u00f3wek i zapisan\u0105 opcj\u0119. Mimo nazwy \u201eForm Archive\u201d kod nie archiwizuje formularzy ani nie usuwa danych po podanej liczbie dni.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"php\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">PHP<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-php\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-meta\">&lt;?php<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\">\/**<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Plugin Name:       LW Form Archive<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Description:       Example add-on for Contact Form 7 (dependency and Blueprint demo).<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Version:           1.0.0<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Requires at least: 6.7<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Requires PHP:      7.4<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Requires Plugins:  contact-form-7<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Author:            Lukas Wojcik<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * License:           GPL-2.0-or-later<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * License URI:       https:\/\/www.gnu.org\/licenses\/gpl-2.0.html<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Text Domain:       lw-form-archive<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> *<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * @package LW_Form_Archive<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> *\/<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">defined<\/span>( <span class=\"cbb-string\">'ABSPATH'<\/span> ) || exit;\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\">\/**<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Stores the default retention period on activation.<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> *<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * add_option() leaves an existing value untouched, so a value that a<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Blueprint wrote earlier with setSiteOptions survives activation.<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> *\/<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">function<\/span> <span class=\"cbb-function\">lw_form_archive_activate<\/span>() {\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-function\">add_option<\/span>( <span class=\"cbb-string\">'lw_form_archive_retention_days'<\/span>, <span class=\"cbb-number\">30<\/span> );\n<\/span><span class=\"cbb-line\">}\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">register_activation_hook<\/span>( __FILE__, <span class=\"cbb-string\">'lw_form_archive_activate'<\/span> );\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\">\/**<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Returns the retention period in days.<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> *<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * @return int<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> *\/<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">function<\/span> <span class=\"cbb-function\">lw_form_archive_retention_days<\/span>() {\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-function\">absint<\/span>( <span class=\"cbb-function\">get_option<\/span>( <span class=\"cbb-string\">'lw_form_archive_retention_days'<\/span>, <span class=\"cbb-number\">30<\/span> ) );\n<\/span><span class=\"cbb-line\">}<\/span><\/code><\/pre><\/figure>\n<p>Panel zarz\u0105dzania wtyczkami sprawdza zale\u017cno\u015bci podczas instalacji i aktywacji. Wymagana wtyczka musi by\u0107 obecna i aktywna przed aktywacj\u0105 dodatku. Interfejs blokuje te\u017c niekt\u00f3re operacje usuwania i dezaktywacji, gdy dotycz\u0105 wtyczek potrzebnych innym dodatkom. Nie jest to jednak blokada plik\u00f3w: FTP nadal mo\u017ce usun\u0105\u0107 zawarto\u015b\u0107 folderu. WP-CLI r\u00f3wnie\u017c mo\u017ce najpierw zainstalowa\u0107 wtyczk\u0119 bez zale\u017cno\u015bci; p\u00f3\u017aniejsza aktywacja mo\u017ce wtedy zawie\u015b\u0107.<\/p>\n<p>Dla tego przebiegu istotna jest funkcja <code>activate_plugin()<\/code>. WordPress sprawdza wymagania dotycz\u0105ce WordPressa, PHP i zale\u017cnych wtyczek. B\u0142\u0105d daje wynik <code>WP_Error<\/code>. Playground nast\u0119pnie sprawdza, czy wtyczka rzeczywi\u015bcie sta\u0142a si\u0119 aktywna. Brak Contact Form 7 lub pobrana wersja wymagaj\u0105ca nowszego \u015brodowiska powoduje niepowodzenie konfiguracji. Poprawny przebieg dowodzi pocz\u0105tkowo tylko powodzenia tej konfiguracji.<\/p>\n<p><code>add_option()<\/code> nie zmienia istniej\u0105cej opcji. Dlatego warto\u015b\u0107 14 z Blueprintu pozostaje po aktywacji; \u015bwie\u017ca instalacja bez Blueprintu otrzymuje domy\u015blnie 30. To warto\u015bci przyk\u0142adowe bez powi\u0105zanej procedury usuwania danych. <a href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/cykl-zycia-wtyczki-aktywacja-dezaktywacja-odinstalowanie\/\">Osobny artyku\u0142 z tej serii<\/a> wyja\u015bnia cykl \u017cycia. Nag\u0142\u00f3wek zale\u017cno\u015bci nie podaje minimalnych wersji innych wtyczek ani kolejno\u015bci \u0142adowania. Kod wymagaj\u0105cy konkretnej klasy lub funkcji musi dodatkowo sprawdzi\u0107 dost\u0119pno\u015b\u0107.<\/p>\n<h2>Lokalne uruchomienia z Playground CLI<\/h2>\n<p>Przyk\u0142ady wskazuj\u0105 sta\u0142\u0105 wersj\u0119 <code>@wp-playground\/cli@3.1.56<\/code>, u\u017cywan\u0105 w udokumentowanych pierwotnych testach. <code>start<\/code> zachowuje witryn\u0119 dewelopersk\u0105 mi\u0119dzy uruchomieniami. <code>server<\/code> uruchamia lokalny dost\u0119p przez WWW; <code>run-blueprint<\/code> wykonuje konfiguracj\u0119 bez stale dzia\u0142aj\u0105cego serwera. Dost\u0119pne s\u0105 te\u017c eksport i pojedyncze wywo\u0142ania PHP. \u015awie\u017ce domy\u015blne uruchomienia \u0142atwiej por\u00f3wna\u0107 ni\u017c ju\u017c zmodyfikowan\u0105 witryn\u0119. Zamontowane foldery robocze nadal zawieraj\u0105 prawdziwe lokalne pliki i nie s\u0105 automatycznie przywracane.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"javascript\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">JavaScript<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-javascript\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"># <span class=\"cbb-type\">Run<\/span> <span class=\"cbb-keyword\">from<\/span> the plugin <span class=\"cbb-function\">folder<\/span> (the folder name must match the slug).\n<\/span><span class=\"cbb-line\">cd lw-form-archive\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"># <span class=\"cbb-type\">Interactive<\/span>: fresh site on http:<span class=\"cbb-comment\">\/\/127.0.0.1:9400 with the working copy mounted.<\/span>\n<\/span><span class=\"cbb-line\"># PHP and <span class=\"cbb-type\">WordPress<\/span> come <span class=\"cbb-keyword\">from<\/span> preferredVersions <span class=\"cbb-keyword\">in<\/span> the <span class=\"cbb-function\">Blueprint<\/span> (<span class=\"cbb-number\">8.3<\/span>, latest);\n<\/span><span class=\"cbb-line\"># --php and --wp have no effect together <span class=\"cbb-keyword\">with<\/span> a <span class=\"cbb-type\">Blueprint<\/span> <span class=\"cbb-function\">file<\/span> (CLI 3.1.56).\n<\/span><span class=\"cbb-line\">npx @wp-playground\/cli@3.1.56 server --auto-mount \\\n<\/span><span class=\"cbb-line\">  --blueprint=.wordpress-org\/blueprints\/blueprint.json\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"># <span class=\"cbb-type\">Smoke<\/span> test on the oldest tested <span class=\"cbb-function\">branch<\/span> (patched release): a copy <span class=\"cbb-keyword\">with<\/span> other preferredVersions,\n<\/span><span class=\"cbb-line\"># run without a server, non-zero exit code on failure.\n<\/span><span class=\"cbb-line\">node -e \"<span class=\"cbb-keyword\">const<\/span> fs = <span class=\"cbb-function\">require<\/span>(<span class=\"cbb-string\">'fs'<\/span>);\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">const<\/span> b = JSON.<span class=\"cbb-function\">parse<\/span>(fs.<span class=\"cbb-function\">readFileSync<\/span>(<span class=\"cbb-string\">'.wordpress-org\/blueprints\/blueprint.json'<\/span>, <span class=\"cbb-string\">'utf8'<\/span>));\n<\/span><span class=\"cbb-line\">  b.preferredVersions = { php: <span class=\"cbb-string\">'7.4'<\/span>, wp: <span class=\"cbb-string\">'6.7.9'<\/span> };\n<\/span><span class=\"cbb-line\">  fs.<span class=\"cbb-function\">writeFileSync<\/span>(<span class=\"cbb-string\">'\/tmp\/blueprint-min.json'<\/span>, JSON.<span class=\"cbb-function\">stringify<\/span>(b));\"\n<\/span><span class=\"cbb-line\">npx @wp-playground\/cli@3.1.56 run-blueprint --auto-mount \\\n<\/span><span class=\"cbb-line\">  --blueprint=\/tmp\/blueprint-min.json<\/span><\/code><\/pre><\/figure>\n<p><code>--auto-mount<\/code> bez dodatkowej warto\u015bci montuje bie\u017c\u0105cy folder. CLI rozpoznaje nag\u0142\u00f3wek wtyczki i u\u017cywa nazwy folderu pod <code>\/wordpress\/wp-content\/plugins\/<\/code>. Aktywacja nast\u0119puje po krokach Blueprintu. Dlatego folder ma nazw\u0119 <code>lw-form-archive<\/code>, zgodn\u0105 ze slugiem. Montowanie nie tworzy kopii tylko do odczytu; testy powinny korzysta\u0107 z tymczasowej kopii roboczej.<\/p>\n<p>W udokumentowanym te\u015bcie CLI 3.1.56 opcje <code>--wp<\/code> i <code>--php<\/code> nie mia\u0142y oczekiwanego pierwsze\u0144stwa przy podaniu pliku Blueprint. Rzeczywiste \u015brodowisko korzysta\u0142o z <code>preferredVersions<\/code>, mimo innych warto\u015bci w komunikacie startowym. Dlatego przyk\u0142ad zapisuje dla ka\u017cdego testu kopi\u0119 z w\u0142a\u015bciw\u0105 kombinacj\u0105. B\u0142\u0105d konfiguracji ko\u0144czy <code>run-blueprint<\/code> statusem b\u0142\u0119du. Taki kr\u00f3tki test konfiguracji nie sprawdza jeszcze obs\u0142ugi formularzy. Test w przegl\u0105darce przez <code>?blueprint-url=<\/code> wymaga te\u017c dost\u0119pnego pliku i odpowiedniej zgody CORS na pobranie.<\/p>\n<h2>wp-env: sta\u0142e wersje w Dockerze<\/h2>\n<p>Druga \u015bcie\u017cka u\u017cywa <code>@wordpress\/env@11.16.0<\/code> z Dockerem i MariaDB. Przydaje si\u0119 to przy zapytaniach, kt\u00f3re mog\u0105 zachowywa\u0107 si\u0119 inaczej ni\u017c w SQLite. <code>.wp-env.json<\/code> podaje wersj\u0119 WordPressa, PHP i wtyczki do instalacji. Zmienne <code>WP_ENV_CORE<\/code> i <code>WP_ENV_PHP_VERSION<\/code> przekazuj\u0105 wersje z macierzy. Blueprint nie jest \u0142adowany, wi\u0119c pocz\u0105tkowo brakuje warto\u015bci demonstracyjnych z tego pliku.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"json\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">JSON<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-json\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">{\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"$schema\"<\/span>: <span class=\"cbb-string\">\"https:\/\/schemas.wp.org\/trunk\/wp-env.json\"<\/span>,\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"core\"<\/span>: <span class=\"cbb-string\">\"WordPress\/WordPress#7.1.2\"<\/span>,\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"phpVersion\"<\/span>: <span class=\"cbb-string\">\"8.3\"<\/span>,\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"plugins\"<\/span>: &#91;\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-string\">\"https:\/\/downloads.wordpress.org\/plugin\/contact-form-7.6.1.7.zip\"<\/span>,\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-string\">\".\"<\/span>\n<\/span><span class=\"cbb-line\">\t&#93;,\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"config\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"WP_DEBUG_LOG\"<\/span>: <span class=\"cbb-constant\">true<\/span>\n<\/span><span class=\"cbb-line\">\t}\n<\/span><span class=\"cbb-line\">}<\/span><\/code><\/pre><\/figure>\n<p>Sprawdzona wersja wp-env aktywuje wtyczki w podanej kolejno\u015bci. Contact Form 7 musi wi\u0119c znale\u017a\u0107 si\u0119 przed dodatkiem. Wersjonowany adres ZIP wskazuje 6.1.7. Parser usuwa ko\u0144c\u00f3wk\u0119 z wersj\u0105 i otrzymuje oczekiwany folder <code>contact-form-7<\/code>. Posta\u0107 <code>.latest-stable.zip<\/code> daje w tym parserze inny wynik i nie jest r\u00f3wnowa\u017cnym zamiennikiem. Sta\u0142y ZIP ogranicza zmiany zale\u017cno\u015bci, ale nie gwarantuje dost\u0119pno\u015bci pobierania ani identycznych wynik\u00f3w ca\u0142ego \u015brodowiska.<\/p>\n<p><code>WordPress\/WordPress#7.1.2<\/code> oznacza dok\u0142adny tag w lustrze GitHub. Tag <code>7.1<\/code> nie oznacza automatycznie 7.1.2. W Dockerze <code>wp-env run cli<\/code> uruchamia podane dalej polecenie. Alternatywne \u015brodowisko Playground u\u017cywa SQLite i wed\u0142ug aktualnej dokumentacji nie obs\u0142uguje <code>run<\/code>. Poni\u017cszy workflow pozostaje wi\u0119c jawnie przy Dockerze.<\/p>\n<h2>Macierz CI dla wersji WordPressa i PHP<\/h2>\n<p>Macierz testowa powtarza przebieg dla kilku kombinacji. Oba zadania u\u017cywaj\u0105 dok\u0142adnie WordPressa 6.7.9\/PHP 7.4, WordPressa 7.0.6\/PHP 8.2 oraz WordPressa 7.1.2\/PHP 8.4. Pierwszy wiersz sprawdza wydanie z poprawkami najstarszej wybranej ga\u0142\u0119zi, a nie ka\u017cde wcze\u015bniejsze wydanie 6.7. Playground otrzymuje warto\u015bci w kopii Blueprintu; wp-env dostaje te same numery przez zmienne \u015brodowiskowe. Przyk\u0142ad jawnie podaje r\u00f3wnie\u017c tagi akcji <code>v7<\/code> i Node 24.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"javascript\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">JavaScript<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-javascript\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"># .github\/workflows\/compatibility.yml\n<\/span><span class=\"cbb-line\">name: <span class=\"cbb-type\">Compatibility<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">on:\n<\/span><span class=\"cbb-line\">  push:\n<\/span><span class=\"cbb-line\">    branches: &#91; trunk &#93;\n<\/span><span class=\"cbb-line\">  pull_request:\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">permissions:\n<\/span><span class=\"cbb-line\">  contents: read\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">jobs:\n<\/span><span class=\"cbb-line\">  playground:\n<\/span><span class=\"cbb-line\">    name: <span class=\"cbb-type\">Playground<\/span> \/ WP ${{ matrix.wp }} \/ PHP ${{ matrix.php }}\n<\/span><span class=\"cbb-line\">    runs-on: ubuntu-latest\n<\/span><span class=\"cbb-line\">    strategy:\n<\/span><span class=\"cbb-line\">      fail-fast: <span class=\"cbb-constant\">false<\/span>\n<\/span><span class=\"cbb-line\">      matrix:\n<\/span><span class=\"cbb-line\">        include:\n<\/span><span class=\"cbb-line\">          - { wp: <span class=\"cbb-string\">'6.7.9'<\/span>, php: <span class=\"cbb-string\">'7.4'<\/span> }\n<\/span><span class=\"cbb-line\">          - { wp: <span class=\"cbb-string\">'7.0.6'<\/span>, php: <span class=\"cbb-string\">'8.2'<\/span> }\n<\/span><span class=\"cbb-line\">          - { wp: <span class=\"cbb-string\">'7.1.2'<\/span>, php: <span class=\"cbb-string\">'8.4'<\/span> }\n<\/span><span class=\"cbb-line\">    steps:\n<\/span><span class=\"cbb-line\">      # <span class=\"cbb-type\">Check<\/span> out into a folder named like the slug: auto-mount uses the folder name.\n<\/span><span class=\"cbb-line\">      - uses: actions\/checkout@v7\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">with<\/span>:\n<\/span><span class=\"cbb-line\">          path: lw-form-archive\n<\/span><span class=\"cbb-line\">      - uses: actions\/setup-node@v7\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">with<\/span>:\n<\/span><span class=\"cbb-line\">          node-version: <span class=\"cbb-number\">24<\/span>\n<\/span><span class=\"cbb-line\">      # <span class=\"cbb-type\">For<\/span> a <span class=\"cbb-type\">Blueprint<\/span> file the CLI ignores --wp and --<span class=\"cbb-function\">php<\/span> (CLI 3.1.56),\n<\/span><span class=\"cbb-line\">      # so the matrix versions go into preferredVersions <span class=\"cbb-keyword\">of<\/span> a copy.\n<\/span><span class=\"cbb-line\">      - name: <span class=\"cbb-type\">Write<\/span> the matrix versions into a copy <span class=\"cbb-keyword\">of<\/span> the <span class=\"cbb-type\">Blueprint<\/span>\n<\/span><span class=\"cbb-line\">        working-directory: lw-form-archive\n<\/span><span class=\"cbb-line\">        run: &gt;-\n<\/span><span class=\"cbb-line\">          node -e \"<span class=\"cbb-keyword\">const<\/span> fs = <span class=\"cbb-function\">require<\/span>(<span class=\"cbb-string\">'fs'<\/span>);\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-keyword\">const<\/span> b = JSON.<span class=\"cbb-function\">parse<\/span>(fs.<span class=\"cbb-function\">readFileSync<\/span>(<span class=\"cbb-string\">'.wordpress-org\/blueprints\/blueprint.json'<\/span>, <span class=\"cbb-string\">'utf8'<\/span>));\n<\/span><span class=\"cbb-line\">          b.preferredVersions = { php: <span class=\"cbb-string\">'${{ matrix.php }}'<\/span>, wp: <span class=\"cbb-string\">'${{ matrix.wp }}'<\/span> };\n<\/span><span class=\"cbb-line\">          fs.<span class=\"cbb-function\">writeFileSync<\/span>(process.env.RUNNER_TEMP + <span class=\"cbb-string\">'\/blueprint.json'<\/span>, JSON.<span class=\"cbb-function\">stringify<\/span>(b));\"\n<\/span><span class=\"cbb-line\">      - name: <span class=\"cbb-type\">Run<\/span> the <span class=\"cbb-type\">Blueprint<\/span> against the working copy\n<\/span><span class=\"cbb-line\">        working-directory: lw-form-archive\n<\/span><span class=\"cbb-line\">        run: &gt;-\n<\/span><span class=\"cbb-line\">          npx --yes @wp-playground\/cli@3.1.56 run-blueprint\n<\/span><span class=\"cbb-line\">          --auto-mount\n<\/span><span class=\"cbb-line\">          --blueprint=${{ runner.temp }}\/blueprint.json\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">  wp-env:\n<\/span><span class=\"cbb-line\">    name: wp-env \/ WP ${{ matrix.wp }} \/ PHP ${{ matrix.php }}\n<\/span><span class=\"cbb-line\">    runs-on: ubuntu-latest\n<\/span><span class=\"cbb-line\">    strategy:\n<\/span><span class=\"cbb-line\">      fail-fast: <span class=\"cbb-constant\">false<\/span>\n<\/span><span class=\"cbb-line\">      matrix:\n<\/span><span class=\"cbb-line\">        include:\n<\/span><span class=\"cbb-line\">          - { wp: <span class=\"cbb-string\">'6.7.9'<\/span>, php: <span class=\"cbb-string\">'7.4'<\/span> }\n<\/span><span class=\"cbb-line\">          - { wp: <span class=\"cbb-string\">'7.0.6'<\/span>, php: <span class=\"cbb-string\">'8.2'<\/span> }\n<\/span><span class=\"cbb-line\">          - { wp: <span class=\"cbb-string\">'7.1.2'<\/span>, php: <span class=\"cbb-string\">'8.4'<\/span> }\n<\/span><span class=\"cbb-line\">    env:\n<\/span><span class=\"cbb-line\">      # <span class=\"cbb-type\">Override<\/span> core and phpVersion <span class=\"cbb-keyword\">from<\/span> .wp-env.json <span class=\"cbb-keyword\">for<\/span> <span class=\"cbb-constant\">this<\/span> matrix cell.\n<\/span><span class=\"cbb-line\">      WP_ENV_CORE: <span class=\"cbb-type\">WordPress<\/span>\/<span class=\"cbb-type\">WordPress<\/span>#${{ matrix.wp }}\n<\/span><span class=\"cbb-line\">      WP_ENV_PHP_VERSION: ${{ matrix.php }}\n<\/span><span class=\"cbb-line\">    steps:\n<\/span><span class=\"cbb-line\">      - uses: actions\/checkout@v7\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">with<\/span>:\n<\/span><span class=\"cbb-line\">          path: lw-form-archive\n<\/span><span class=\"cbb-line\">      - uses: actions\/setup-node@v7\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">with<\/span>:\n<\/span><span class=\"cbb-line\">          node-version: <span class=\"cbb-number\">24<\/span>\n<\/span><span class=\"cbb-line\">      - name: <span class=\"cbb-type\">Install<\/span> wp-env\n<\/span><span class=\"cbb-line\">        run: npm install -g @wordpress\/env@11.16.0\n<\/span><span class=\"cbb-line\">      - name: <span class=\"cbb-type\">Start<\/span> <span class=\"cbb-function\">WordPress<\/span> (activates the plugins <span class=\"cbb-keyword\">from<\/span> .wp-env.json)\n<\/span><span class=\"cbb-line\">        working-directory: lw-form-archive\n<\/span><span class=\"cbb-line\">        run: wp-env start\n<\/span><span class=\"cbb-line\">      - name: <span class=\"cbb-type\">Check<\/span> activation and the <span class=\"cbb-keyword\">default<\/span> option\n<\/span><span class=\"cbb-line\">        working-directory: lw-form-archive\n<\/span><span class=\"cbb-line\">        run: |\n<\/span><span class=\"cbb-line\">          wp-env run cli wp plugin is-active contact-form-7\n<\/span><span class=\"cbb-line\">          wp-env run cli wp plugin is-active lw-form-archive\n<\/span><span class=\"cbb-line\">          wp-env run cli wp eval <span class=\"cbb-string\">'if (lw_form_archive_retention_days() !== 30) { WP_CLI::error(\"Unexpected default retention value\"); }'<\/span><\/span><\/code><\/pre><\/figure>\n<p>Zadanie Playground sprawdza konfiguracj\u0119 ze stabiln\u0105 wersj\u0105 Contact Form 7 aktualnie dostarczan\u0105 przez katalog. Zadanie Dockera u\u017cywa zamiast tego sta\u0142ej wersji 6.1.7. Dodatkowo sprawdza aktywno\u015b\u0107 obu wtyczek i wynik 30 z funkcji przyk\u0142adu. <code>wp plugin is-active<\/code> zwraca status b\u0142\u0119du dla nieaktywnej wtyczki. To celowane kontrole aktywacji i opcji, a nie pe\u0142ny test funkcjonalny ani obietnica niezmiennych wynik\u00f3w.<\/p>\n<p>Historyczne testy pokazuj\u0105 sens obu \u015bcie\u017cek: Contact Form 7 6.1.7 mia\u0142o starsze wymagania, a \u00f3wczesna wersja rozwojowa 6.2-rc wymaga\u0142a nowszego WordPressa i PHP. Przysz\u0142e stabilne wydanie zale\u017cno\u015bci z wy\u017cszymi wymaganiami mo\u017ce wi\u0119c spowodowa\u0107 b\u0142\u0105d zadania Playground, podczas gdy zadanie Dockera ze starsz\u0105 sta\u0142\u0105 zale\u017cno\u015bci\u0105 nadal zadzia\u0142a. Sygna\u0142 dotyczy najpierw tych testowanych kombinacji. Poprawno\u015b\u0107 dzia\u0142ania samego dodatku wymaga dodatkowych test\u00f3w.<\/p>\n<p>Podgl\u0105d PR mo\u017cna dodatkowo skonfigurowa\u0107 przez <code>WordPress\/action-wp-playground-pr-preview@v4<\/code>. Rzeczywiste testy PHPUnit wymagaj\u0105 zestawu test\u00f3w w projekcie. Pe\u0142ne wywo\u0142anie podaje tak\u017ce program, na przyk\u0142ad <code>wp-env run cli --env-cwd=wp-content\/plugins\/lw-form-archive phpunit<\/code>. Samo wskazanie kontenera i katalogu roboczego nie uruchamia testu. <a href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/plugin-check-lokalnie-i-w-ci-bledy-wykryte-przed-recenzja\/\">Osobny artyku\u0142 z tej serii<\/a> omawia statyczne kontrole przez Plugin Check.<\/p>\n<h2>Ograniczenia i otwarte kwestie<\/h2>\n<ul>\n<li>Historyczny raport dokumentuje trzy udane lokalne kombinacje Playground z CLI 3.1.56. Nie potwierdza przebiegu na GitHubie ani w Dockerze. Dla poprawionej wersji sprawdzono JSON, YAML, sk\u0142adni\u0119 pow\u0142oki i PHP, cztery kombinacje Blueprintu wed\u0142ug aktualnego schematu oraz warto\u015bci opcji 14 i 30 z izolowanymi funkcjami zast\u0119pczymi. Dodanych kontroli Dockera nie wykonano w prawdziwym \u015brodowisku WordPressa.<\/li>\n<li>Playground u\u017cywa SQLite. Wtyczki z w\u0142asnymi tabelami lub r\u0119cznie pisanym SQL mog\u0105 zachowywa\u0107 si\u0119 inaczej ni\u017c pod MySQL; przy w\u0142asnych tabelach bardziej miarodajne jest zadanie wp-env. Do tematu pasuje <a href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/baza-danych-wordpressa-ograniczenia-wydajnosci-wp_postmeta-i-budowa-wlasnych-tabel\/\">artyku\u0142 o granicach wydajno\u015bci <code>wp_postmeta<\/code> i w\u0142asnych tabelach<\/a>.<\/li>\n<li>Schemat nie dopuszcza pola <code>version<\/code> dla zasob\u00f3w typu <code>wordpress.org\/plugins<\/code> (tylko <code>resource<\/code> i <code>slug<\/code>), a dla zwyk\u0142ego sluga kod \u017ar\u00f3d\u0142owy buduje adres pobierania z <code>latest-stable<\/code>. Slug zako\u0144czony ju\u017c na <code>.zip<\/code>, na przyk\u0142ad <code>contact-form-7.6.1.7.zip<\/code>, s\u0142u\u017cy bez zmian jako nazwa pliku: w te\u015bcie z wersj\u0105 6.1.5 Playground CLI zainstalowa\u0142o dok\u0142adnie t\u0119 wersj\u0119, a import do katalogu przepisuje wy\u0142\u0105cznie zasoby typu <code>url<\/code>. Nie sprawdzono, czy podgl\u0105d w katalogu przyjmuje t\u0119 posta\u0107.<\/li>\n<li>Sta\u0142e wersje narz\u0119dzi ograniczaj\u0105 zmiany mi\u0119dzy przebiegami. Tagi akcji, wydania Node, obrazy, pobierane pliki i us\u0142ugi zewn\u0119trzne nadal mog\u0105 si\u0119 zmienia\u0107. Plik blokady pakiet\u00f3w oraz zapis faktycznych wersji u\u0142atwiaj\u0105 odtworzenie warunk\u00f3w, ale nie gwarantuj\u0105 identycznych wynik\u00f3w.<\/li>\n<li>Katalog importuje do dziesi\u0119ciu plik\u00f3w Blueprint, ale korzysta tylko z <code>blueprint.json<\/code>. Obs\u0142ug\u0119 wielu plik\u00f3w Handbook zapowiada jako mo\u017cliwy przysz\u0142y krok, bez terminu.<\/li>\n<li>Nazwa katalogu <code>.wordpress-org\/blueprints\/<\/code> i przenoszenie pliku do zasob\u00f3w SVN to konwencje tego artyku\u0142u; sam\u0105 struktur\u0119 SVN opisuje <a href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/readme-txt-naglowek-wtyczki-i-svn-jak-wordpress-org-odczytuje-wtyczke\/\">osobny artyku\u0142 z tej serii<\/a>.<\/li>\n<\/ul>\n<div class=\"lw-faq\">\n<h2>Pytania i odpowiedzi<\/h2>\n<h3>Dlaczego przycisk \u201ePreview\u201d si\u0119 nie pojawia, cho\u0107 blueprint.json jest w SVN?<\/h3>\n<p>Poprawny plik <code>assets\/blueprints\/blueprint.json<\/code> pocz\u0105tkowo umo\u017cliwia wewn\u0119trzny test dla commiter\u00f3w. Publiczny przycisk wymaga dodatkowo ustawienia \u201epublic\u201d w sekcji \u201eAdvanced\u201d. Sprawdzony importer odrzuca niepoprawny JSON i pliki ponad 102 400 bajt\u00f3w. Sam udany import nadal nie zast\u0119puje sprawdzenia wykonania Blueprintu.<\/p>\n<h3>Czy w podgl\u0105dzie w katalogu da si\u0119 przypi\u0105\u0107 zale\u017cno\u015b\u0107 do konkretnej wersji?<\/h3>\n<p>Prosty slug <code>contact-form-7<\/code> pobiera stabilne wydanie przez <code>wordpress.org\/plugins<\/code>. Sprawdzony schemat nie dopuszcza dodatkowego pola <code>version<\/code> dla tego zasobu. Importer katalogu mo\u017ce te\u017c zmieni\u0107 wersjonowany adres pobierania na zwyk\u0142y slug.<\/p>\n<p>Historyczny test CLI potwierdzi\u0142 nazw\u0119 ZIP u\u017cywan\u0105 jako slug, na przyk\u0142ad <code>contact-form-7.6.1.5.zip<\/code>. Pozwoli\u0142o to pobra\u0107 konkretn\u0105 wersj\u0119. Nie sprawdzono tego obej\u015bcia w publicznym podgl\u0105dzie katalogu i nie stanowi to gwarancji dla tego \u015brodowiska. Test Dockera korzysta zamiast tego z jawnie wersjonowanego adresu ZIP w <code>.wp-env.json<\/code>.<\/p>\n<h3>Czy Requires Plugins zast\u0119puje sprawdzanie class_exists() w kodzie wtyczki?<\/h3>\n<p>Nie. Nag\u0142\u00f3wek pomaga WordPressowi sprawdzi\u0107, czy wymagana wtyczka jest zainstalowana i aktywna. Nie ustala minimalnej wersji zale\u017cno\u015bci ani sta\u0142ej kolejno\u015bci \u0142adowania. Przed wywo\u0142aniem okre\u015blonej klasy lub funkcji nadal potrzebna jest odpowiednia kontrola dost\u0119pno\u015bci.<\/p>\n<\/div>\n<div class=\"lw-quellen\">\n<h2>\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/plugins\/wordpress-org\/previews-and-blueprints\/\" rel=\"noopener noreferrer\" target=\"_blank\">Plugin Handbook: Previews and Blueprints<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/playground\/blueprints\/data-format\" rel=\"noopener noreferrer\" target=\"_blank\">Playground: Blueprint data format<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/playground\/blueprints\/steps\/\" rel=\"noopener noreferrer\" target=\"_blank\">Playground: Blueprint steps<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/playground.wordpress.net\/blueprint-schema.json\" rel=\"noopener noreferrer\" target=\"_blank\">Schemat JSON dla Blueprint\u00f3w<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/playground\/developers\/local-development\/wp-playground-cli\/\" rel=\"noopener noreferrer\" target=\"_blank\">Playground CLI<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/playground\/developers\/apis\/query-api\/\" rel=\"noopener noreferrer\" target=\"_blank\">Playground Query API<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress-playground\" rel=\"noopener noreferrer\" target=\"_blank\">GitHub: WordPress\/wordpress-playground (CLI, kroki, zasoby, lista wersji)<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress.org\/tree\/trunk\/wordpress.org\/public_html\/wp-content\/plugins\/plugin-directory\" rel=\"noopener noreferrer\" target=\"_blank\">GitHub: kod \u017ar\u00f3d\u0142owy katalogu wtyczek (import Blueprint\u00f3w i punkt ko\u0144cowy)<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-env\/\" rel=\"noopener noreferrer\" target=\"_blank\">Dokumentacja @wordpress\/env<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/trunk\/packages\/env\" rel=\"noopener noreferrer\" target=\"_blank\">GitHub: kod \u017ar\u00f3d\u0142owy packages\/env<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/make.wordpress.org\/core\/2024\/03\/05\/introducing-plugin-dependencies-in-wordpress-6-5\/\" rel=\"noopener noreferrer\" target=\"_blank\">Make WordPress Core: Introducing Plugin Dependencies in WordPress 6.5<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/trunk\/src\/wp-includes\/class-wp-plugin-dependencies.php\" rel=\"noopener noreferrer\" target=\"_blank\">wordpress-develop: class-wp-plugin-dependencies.php<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/trunk\/src\/wp-admin\/includes\/plugin.php\" rel=\"noopener noreferrer\" target=\"_blank\">wordpress-develop: wp-admin\/includes\/plugin.php (validate_plugin_requirements)<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_option\/\" rel=\"noopener noreferrer\" target=\"_blank\">Code Reference: add_option()<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/plugin\/is-active\/\" rel=\"noopener noreferrer\" target=\"_blank\">WP-CLI: wp plugin is-active<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/api.wordpress.org\/core\/version-check\/1.7\/\" rel=\"noopener noreferrer\" target=\"_blank\">API wersji WordPress.org<\/a> oraz <a href=\"https:\/\/github.com\/WordPress\/WordPress\/tags\" rel=\"noopener noreferrer\" target=\"_blank\">tagi lustra WordPressa na GitHubie<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/plugins.svn.wordpress.org\/contact-form-7\/\" rel=\"noopener noreferrer\" target=\"_blank\">Contact Form 7 w SVN wtyczek (tags\/6.1.7 i trunk)<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress-playground\/blob\/trunk\/packages\/docs\/site\/docs\/main\/guides\/github-action-pr-preview.md\" rel=\"noopener noreferrer\" target=\"_blank\">Przewodnik Playground: podgl\u0105d PR w GitHub Actions<\/a> (dost\u0119p 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/actions\/checkout\" rel=\"noopener noreferrer\" target=\"_blank\">actions\/checkout<\/a> oraz <a href=\"https:\/\/github.com\/actions\/setup-node\" rel=\"noopener noreferrer\" target=\"_blank\">actions\/setup-node<\/a> (dost\u0119p 29.09.2026)<\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Blueprint przygotowuje podgl\u0105d w katalogu i testy Playground. Docker u\u017cywa osobnej konfiguracji. Przyk\u0142ad wyja\u015bnia kolejno\u015b\u0107 zale\u017cno\u015bci, sta\u0142e wersje testowe i ograniczenia kontroli aktywacji.<\/p>\n","protected":false},"author":1,"featured_media":20939,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92646],"tags":[92229,92238,92762,92286],"class_list":["post-20880","post","type-post","status-publish","format-standard","hentry","category-tutorials-pl-wordpress-plugins-tricks-pl","tag-devops-pl","tag-tutorial-pl","tag-web-development-pl","tag-wordpress-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>WordPress Playground: Blueprint do podgl\u0105du wtyczki i test\u00f3w | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Blueprint dla podgl\u0105du wtyczki w katalogu WordPress.org, lokalne testy z Playground CLI i wp-env oraz macierz GitHub Actions dla wersji WordPressa i PHP.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WordPress Playground: Blueprint do podgl\u0105du wtyczki i test\u00f3w | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Blueprint dla podgl\u0105du wtyczki w katalogu WordPress.org, lokalne testy z Playground CLI i wp-env oraz macierz GitHub Actions dla wersji WordPressa i PHP.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-27T17:03:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20880-playground-blueprint-podglad-wtyczki-testy.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"WordPress Playground: Blueprint do podgl\u0105du wtyczki i test\u00f3w\",\"datePublished\":\"2026-10-27T17:03:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\\\/\"},\"wordCount\":2211,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20880-playground-blueprint-podglad-wtyczki-testy.png\",\"keywords\":[\"DevOps\",\"Tutorial\",\"Web Development\",\"WordPress\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\\\/\",\"name\":\"WordPress Playground: Blueprint do podgl\u0105du wtyczki i test\u00f3w | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20880-playground-blueprint-podglad-wtyczki-testy.png\",\"datePublished\":\"2026-10-27T17:03:00+00:00\",\"description\":\"Blueprint dla podgl\u0105du wtyczki w katalogu WordPress.org, lokalne testy z Playground CLI i wp-env oraz macierz GitHub Actions dla wersji WordPressa i PHP.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20880-playground-blueprint-podglad-wtyczki-testy.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20880-playground-blueprint-podglad-wtyczki-testy.png\",\"width\":1200,\"height\":630,\"caption\":\"WordPress Playground: Blueprint do podgl\u0105du wtyczki i test\u00f3w\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WordPress Playground: Blueprint do podgl\u0105du wtyczki i test\u00f3w\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WordPress Playground: Blueprint do podgl\u0105du wtyczki i test\u00f3w | Lukas Wojcik","description":"Blueprint dla podgl\u0105du wtyczki w katalogu WordPress.org, lokalne testy z Playground CLI i wp-env oraz macierz GitHub Actions dla wersji WordPressa i PHP.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/","og_locale":"en_US","og_type":"article","og_title":"WordPress Playground: Blueprint do podgl\u0105du wtyczki i test\u00f3w | Lukas Wojcik","og_description":"Blueprint dla podgl\u0105du wtyczki w katalogu WordPress.org, lokalne testy z Playground CLI i wp-env oraz macierz GitHub Actions dla wersji WordPressa i PHP.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-10-27T17:03:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20880-playground-blueprint-podglad-wtyczki-testy.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"WordPress Playground: Blueprint do podgl\u0105du wtyczki i test\u00f3w","datePublished":"2026-10-27T17:03:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/"},"wordCount":2211,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20880-playground-blueprint-podglad-wtyczki-testy.png","keywords":["DevOps","Tutorial","Web Development","WordPress"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/","name":"WordPress Playground: Blueprint do podgl\u0105du wtyczki i test\u00f3w | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20880-playground-blueprint-podglad-wtyczki-testy.png","datePublished":"2026-10-27T17:03:00+00:00","description":"Blueprint dla podgl\u0105du wtyczki w katalogu WordPress.org, lokalne testy z Playground CLI i wp-env oraz macierz GitHub Actions dla wersji WordPressa i PHP.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20880-playground-blueprint-podglad-wtyczki-testy.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20880-playground-blueprint-podglad-wtyczki-testy.png","width":1200,"height":630,"caption":"WordPress Playground: Blueprint do podgl\u0105du wtyczki i test\u00f3w"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/wordpress-playground-blueprint-do-podgladu-wtyczki-i-testow\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"WordPress Playground: Blueprint do podgl\u0105du wtyczki i test\u00f3w"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/20880","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=20880"}],"version-history":[{"count":3,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/20880\/revisions"}],"predecessor-version":[{"id":25945,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/20880\/revisions\/25945"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/20939"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=20880"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=20880"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=20880"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}