{"id":20856,"date":"2026-10-07T17:36:00","date_gmt":"2026-10-07T15:36:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=20856"},"modified":"2026-09-30T12:13:32","modified_gmt":"2026-09-30T10:13:32","slug":"plugin-check-lokalnie-i-w-ci","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/plugin-check-lokalnie-i-w-ci\/","title":{"rendered":"Plugin Check lokalnie i w CI: b\u0142\u0119dy wykryte przed recenzj\u0105"},"content":{"rendered":"<p>Ka\u017cda wtyczka zg\u0142oszona do katalogu WordPress.org przechodzi najpierw automatyczne skanowanie, a dopiero potem jej kod czyta kto\u015b z Plugins Team. Cz\u0119\u015b\u0107 uwag z recenzji da si\u0119 wykry\u0107 maszynowo: brak nag\u0142\u00f3wka z licencj\u0105, dane wypisywane bez escapowania, skrypt \u0142adowany z publicznego CDN, Text Domain niezgodna ze slugiem. Plugin Check, w skr\u00f3cie PCP, to narz\u0119dzie, kt\u00f3re WordPress.org publikuje w\u0142a\u015bnie w tym celu. Wed\u0142ug opisu uruchamia wi\u0119kszo\u015b\u0107 test\u00f3w stosowanych przy nowych zg\u0142oszeniach, i to na dowolnej instalacji WordPressa, zanim cokolwiek trafi do katalogu.<\/p>\n<p>Artyku\u0142 pokazuje Plugin Check 2.1.0 w trzech miejscach: w panelu administracyjnym, w wierszu polece\u0144 z WP-CLI oraz w workflow GitHub Actions opartym na oficjalnej akcji. Obiektem testu jest ma\u0142a wtyczka z celowo wprowadzonymi b\u0142\u0119dami. Przy ka\u017cdym b\u0142\u0119dzie podano test i kod wyniku zg\u0142oszony przez przebieg Plugin Check 2.1.0 w WordPressie 7.1.2, a nast\u0119pnie pokazano poprawion\u0105 wersj\u0119.<\/p>\n<h2>Co sprawdza Plugin Check<\/h2>\n<p>Aktualna wersja w katalogu to 2.1.0 z 16 sierpnia 2026 roku. Wymaga WordPressa 6.3 i PHP 7.4; strona wtyczki podaje \u201eTested up to\u201d 7.0.6, podczas gdy bie\u017c\u0105ce wydanie WordPressa to 7.1.2. Wersja 2.1.0 wprowadzi\u0142a mi\u0119dzy innymi test wykrywaj\u0105cy zmiany raportowania b\u0142\u0119d\u00f3w PHP w czasie dzia\u0142ania.<\/p>\n<p>W kodzie wersji 2.1.0 klasa <code>Default_Check_Repository<\/code> rejestruje 34 testy. Ka\u017cdy ma slug, na przyk\u0142ad <code>late_escaping<\/code>, i nale\u017cy do jednej lub kilku kategorii. Istniej\u0105 dwa rodzaje test\u00f3w. Testy statyczne czytaj\u0105 kod bez jego wykonywania, najcz\u0119\u015bciej za pomoc\u0105 sniff\u00f3w PHP_CodeSniffer z WordPress Coding Standards lub z w\u0142asnego zestawu Plugin Check, a cz\u0119\u015bciowo za pomoc\u0105 w\u0142asnej logiki. Testy uruchomieniowe wykonuj\u0105 wtyczk\u0119, kt\u00f3ra musi by\u0107 aktywna, na wydzielonym zestawie tabel bazy danych i obserwuj\u0105 jej dzia\u0142anie; w 2.1.0 jest to pi\u0119\u0107 test\u00f3w wydajno\u015bci dotycz\u0105cych zasi\u0119gu i rozmiaru skrypt\u00f3w oraz arkuszy styl\u00f3w, a tak\u017ce strategii \u0142adowania.<\/p>\n<table>\n<thead>\n<tr>\n<th>Kategoria (slug)<\/th>\n<th>Przyk\u0142adowe testy w 2.1.0<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>General (<code>general<\/code>)<\/td>\n<td><code>i18n_usage<\/code>, <code>php_error_reporting<\/code>, <code>ai_provider<\/code><\/td>\n<\/tr>\n<tr>\n<td>Plugin Repo (<code>plugin_repo<\/code>)<\/td>\n<td><code>plugin_readme<\/code>, <code>plugin_header_fields<\/code>, <code>file_type<\/code>, <code>offloading_files<\/code>, <code>setting_sanitization<\/code>, <code>prefixing<\/code>, <code>plugin_review_phpcs<\/code>, <code>trademarks<\/code><\/td>\n<\/tr>\n<tr>\n<td>Security (<code>security<\/code>)<\/td>\n<td><code>late_escaping<\/code>, <code>direct_file_access<\/code>, <code>safe_redirect<\/code>, <code>direct_db_queries<\/code>, <code>direct_db<\/code><\/td>\n<\/tr>\n<tr>\n<td>Performance (<code>performance<\/code>)<\/td>\n<td><code>enqueued_scripts_in_footer<\/code>, <code>performant_wp_query_params<\/code>, <code>enqueued_scripts_scope<\/code>, <code>non_blocking_scripts<\/code><\/td>\n<\/tr>\n<tr>\n<td>Accessibility (<code>accessibility<\/code>)<\/td>\n<td>brak: kategoria jest zdefiniowana, ale \u017caden wbudowany test wersji 2.1.0 nie jest do niej przypisany<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Wszystkie testy bezpiecze\u0144stwa zarejestrowane w 2.1.0 maj\u0105 dodatkowo kategori\u0119 <code>plugin_repo<\/code>, wi\u0119c przebieg ograniczony do Plugin Repo obejmuje ju\u017c escapowanie i bezpo\u015bredni dost\u0119p do plik\u00f3w. Ma to znaczenie, bo FAQ wtyczki stwierdza, \u017ce do przyj\u0119cia do katalogu wtyczka zazwyczaj musi przej\u015b\u0107 wszystkie testy kategorii Plugin Repo. Pozosta\u0142e kategorie opisano jako dodatkowe.<\/p>\n<p>Ka\u017cdy wynik ma typ <code>ERROR<\/code> albo <code>WARNING<\/code> oraz wag\u0119 (severity); domy\u015blnie wynosi ona 5, a brak licencji w nag\u0142\u00f3wku wtyczki test zg\u0142asza z wag\u0105 9. B\u0142\u0119dy oznaczaj\u0105 naruszenie wymaga\u0144 katalogu. Ostrze\u017cenia wskazuj\u0105 kod, kt\u00f3ry cz\u0119sto, cho\u0107 nie zawsze, stanowi problem: odczyt <code>$_GET<\/code> bez Nonce jest nieszkodliwy przy parametrze s\u0142u\u017c\u0105cym tylko do wy\u015bwietlenia, a w obs\u0142udze formularza oznacza realn\u0105 luk\u0119. Typ ustala sam test. Zestaw regu\u0142 PHPCS w Plugin Check celowo obni\u017ca niekt\u00f3re sniffy do ostrze\u017ce\u0144, na przyk\u0142ad weryfikacj\u0119 Nonce i sanityzacj\u0119 danych wej\u015bciowych.<\/p>\n<h2>Uruchamianie lokalne: panel i WP-CLI<\/h2>\n<p>Plugin Check jest instalowany tak jak ka\u017cda inna wtyczka. README projektu odradza u\u017cywanie go na stronie produkcyjnej, poniewa\u017c testy uruchomieniowe faktycznie wykonuj\u0105 sprawdzan\u0105 wtyczk\u0119. Po aktywacji w menu Narz\u0119dzia \u2192 Plugin Check pojawia si\u0119 ekran dost\u0119pny dla u\u017cytkownik\u00f3w z prawem zarz\u0105dzania wtyczkami. Zawiera list\u0119 wyboru wtyczki oraz pola wyboru kategorii i typ\u00f3w wynik\u00f3w. Wyniki s\u0105 grupowane wed\u0142ug plik\u00f3w, z wierszem, kolumn\u0105, typem, kodem i komunikatem; od wersji 1.8.0 da si\u0119 je wyeksportowa\u0107 do CSV, JSON lub Markdown.<\/p>\n<p>Przy cz\u0119stych przebiegach wygodniejsze jest polecenie WP-CLI. Jako argument przyjmuje slug wtyczki, \u015bcie\u017ck\u0119 albo adres URL pliku ZIP. Domy\u015blnie uruchamia tylko testy statyczne. Dla test\u00f3w uruchomieniowych README opisuje obej\u015bcie: <code>--require<\/code> wczytuje plik <code>cli.php<\/code> z Plugin Check, zanim wystartuje WordPress. Ponadto sprawdzana wtyczka musi by\u0107 aktywna; przy nieaktywnej wtyczce Plugin Check bez \u017cadnego komunikatu pomija testy uruchomieniowe, a <code>--checks=enqueued_scripts_scope<\/code> ko\u0144czy si\u0119 wtedy komunikatem \u201edoes not exist\u201d.<\/p>\n<pre><code># Install and activate Plugin Check (2.1.0 at the time of writing).\nwp plugin install plugin-check --activate\n\n# All static checks for wp-content\/plugins\/lw-hello-banner.\nwp plugin check lw-hello-banner\n\n# Include runtime checks (plugin must be active): load cli.php before WordPress boots.\nwp plugin check lw-hello-banner --require=.\/wp-content\/plugins\/plugin-check\/cli.php\n\n# Limit the run to categories or to single checks.\nwp plugin check lw-hello-banner --categories=plugin_repo,security\nwp plugin check lw-hello-banner --checks=late_escaping,i18n_usage\n\n# Errors only, as one JSON array for scripts.\nwp plugin check lw-hello-banner --ignore-warnings --format=strict-json\n\n# Show result codes, then ignore one specific code.\nwp plugin check lw-hello-banner --format=csv --fields=code,message\nwp plugin check lw-hello-banner --ignore-codes=textdomain_mismatch\n\n# Checks for an update of an existing directory plugin.\nwp plugin check lw-hello-banner --mode=update\n\n# What is available in the installed version.\nwp plugin list-checks --format=csv\nwp plugin list-check-categories<\/code><\/pre>\n<p>Najwa\u017cniejsze opcje <code>wp plugin check<\/code> w wersji 2.1.0:<\/p>\n<table>\n<thead>\n<tr>\n<th>Opcja<\/th>\n<th>Dzia\u0142anie<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>--checks=<\/code>, <code>--exclude-checks=<\/code><\/td>\n<td>uruchamia tylko wymienione testy albo je pomija<\/td>\n<\/tr>\n<tr>\n<td><code>--categories=<\/code><\/td>\n<td>ogranicza przebieg do kategorii, rozdzielonych przecinkami<\/td>\n<\/tr>\n<tr>\n<td><code>--ignore-codes=<\/code><\/td>\n<td>ukrywa pojedyncze kody wynik\u00f3w, np. <code>textdomain_mismatch<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>--ignore-warnings<\/code>, <code>--ignore-errors<\/code><\/td>\n<td>ukrywa jeden z dw\u00f3ch typ\u00f3w wynik\u00f3w<\/td>\n<\/tr>\n<tr>\n<td><code>--format=<\/code><\/td>\n<td><code>table<\/code> (domy\u015blnie), <code>csv<\/code>, <code>json<\/code>, <code>ctrf<\/code> oraz <code>strict-table<\/code>, <code>strict-csv<\/code>, <code>strict-json<\/code>, <code>strict-ctrf<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>--fields=<\/code><\/td>\n<td>wyb\u00f3r kolumn, np. <code>code,message<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>--exclude-directories=<\/code>, <code>--exclude-files=<\/code><\/td>\n<td>pomija \u015bcie\u017cki przy skanowaniu plik\u00f3w; <code>.git<\/code>, <code>vendor<\/code>, <code>vendor_prefixed<\/code>, <code>vendor-prefixed<\/code> i <code>node_modules<\/code> s\u0105 wykluczone domy\u015blnie<\/td>\n<\/tr>\n<tr>\n<td><code>--severity=<\/code>, <code>--error-severity=<\/code>, <code>--warning-severity=<\/code><\/td>\n<td>pokazuje tylko wyniki od okre\u015blonej wagi<\/td>\n<\/tr>\n<tr>\n<td><code>--mode=<\/code><\/td>\n<td><code>new<\/code> (domy\u015blnie) lub <code>update<\/code>; w trybie aktualizacji nieaktualne \u201eTested up to\u201d jest ostrze\u017ceniem, a nie b\u0142\u0119dem<\/td>\n<\/tr>\n<tr>\n<td><code>--slug=<\/code><\/td>\n<td>nadpisuje slug, z kt\u00f3rym por\u00f3wnywane s\u0105 Text Domain i readme<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Slugi test\u00f3w i kody wynik\u00f3w to dwie r\u00f3\u017cne rzeczy. <code>--checks=i18n_usage<\/code> wybiera test, a <code>--ignore-codes=WordPress.WP.I18n.TextDomainMismatch<\/code> ukrywa pojedyncze zg\u0142oszenie z tego testu. Do wyszukiwania kod\u00f3w dokumentacja CLI zaleca <code>--format=csv --fields=code,message<\/code>. Dla skrypt\u00f3w wa\u017cny jest jeszcze jeden szczeg\u00f3\u0142: w kodzie wersji 2.1.0 polecenie wypisuje wyniki, ale z ich powodu nie ustawia kodu wyj\u015bcia oznaczaj\u0105cego b\u0142\u0105d. Skrypt pow\u0142oki, kt\u00f3ry ma si\u0119 zatrzyma\u0107 przy zg\u0142oszeniach, musi wi\u0119c sam przeanalizowa\u0107 wynik; w te\u015bcie polecenie zg\u0142osi\u0142o dla b\u0142\u0119dnego przyk\u0142adu dwana\u015bcie b\u0142\u0119d\u00f3w i mimo to zako\u0144czy\u0142o si\u0119 kodem wyj\u015bcia 0. Akcja dla GitHuba robi dok\u0142adnie to. Przy <code>--format=json<\/code> przed ka\u017cdym plikiem stoi wiersz <code>FILE: \u2026<\/code> z osobn\u0105 tablic\u0105 JSON, wi\u0119c ca\u0142o\u015b\u0107 nie jest poprawnym JSON-em; <code>--format=strict-json<\/code> zwraca jedn\u0105 tablic\u0119, ale bez nazw plik\u00f3w. Bez zg\u0142osze\u0144 oba formaty wypisuj\u0105 tylko wiersz o powodzeniu.<\/p>\n<h2>Przyk\u0142adowa wtyczka z wbudowanymi b\u0142\u0119dami<\/h2>\n<p>Przyk\u0142ad to jeden plik w katalogu <code>wp-content\/plugins\/lw-hello-banner\/<\/code>, wi\u0119c slug brzmi <code>lw-hello-banner<\/code>. Wtyczka wy\u015bwietla powitanie u g\u00f3ry strony, odczytuje opcjonalne imi\u0119 z adresu URL, dodaje pole notatki w Ustawienia \u2192 Og\u00f3lne i \u0142aduje ozdobny skrypt. Zawiera dziewi\u0119\u0107 celowych b\u0142\u0119d\u00f3w: brak <code>readme.txt<\/code>, brak nag\u0142\u00f3wka licencji, Text Domain inn\u0105 ni\u017c slug, brak ochrony przed bezpo\u015brednim wywo\u0142aniem pliku, wywo\u0142anie <code>error_reporting()<\/code>, <code>register_setting()<\/code> bez sanityzacji, wypisywanie danych bez escapowania, t\u0142umaczony tekst z symbolem zast\u0119pczym, ale bez komentarza dla t\u0142umaczy, oraz skrypt z CDN bez wersji i bez argument\u00f3w \u0142adowania.<\/p>\n<pre><code>&lt;?php\n\/**\n * Plugin Name: LW Hello Banner\n * Description: Shows a greeting banner at the top of the front page.\n * Version:     0.1.0\n * Author:      Lukas Wojcik\n * Text Domain: hello-banner\n *\/\n\n\/\/ Intentionally faulty example for Plugin Check. Do not use on a live site.\n\nerror_reporting( E_ALL );\n\nfunction lw_hello_banner_register_setting() {\n\tregister_setting( 'general', 'lw_hello_banner_note' );\n\n\tadd_settings_field(\n\t\t'lw_hello_banner_note',\n\t\t__( 'Banner note', 'hello-banner' ),\n\t\t'lw_hello_banner_field',\n\t\t'general'\n\t);\n}\nadd_action( 'admin_init', 'lw_hello_banner_register_setting' );\n\nfunction lw_hello_banner_field() {\n\techo '&lt;input type=\"text\" name=\"lw_hello_banner_note\" value=\"' . get_option( 'lw_hello_banner_note' ) . '\"&gt;';\n}\n\nfunction lw_hello_banner_assets() {\n\twp_enqueue_script( 'lw-hello-banner', 'https:\/\/cdn.jsdelivr.net\/npm\/canvas-confetti@1.9.3\/dist\/confetti.browser.min.js' );\n}\nadd_action( 'wp_enqueue_scripts', 'lw_hello_banner_assets' );\n\nfunction lw_hello_banner_render() {\n\t$name = isset( $_GET['lw_name'] ) ? $_GET['lw_name'] : 'Guest';\n\t$note = get_option( 'lw_hello_banner_note', '' );\n\n\techo '&lt;div class=\"lw-hello-banner\"&gt;&lt;p&gt;' . sprintf( __( 'Hello, %s!', 'hello-banner' ), $name ) . ' ' . $note . '&lt;\/p&gt;&lt;\/div&gt;';\n}\nadd_action( 'wp_body_open', 'lw_hello_banner_render' );<\/code><\/pre>\n<h2>Co zg\u0142asza Plugin Check<\/h2>\n<p>Tabela zawiera zg\u0142oszenia, kt\u00f3re <code>wp plugin check lw-hello-banner<\/code> z Plugin Check 2.1.0 w WordPressie 7.1.2 wypisuje dla tego przyk\u0142adu, \u0142\u0105cznie dwana\u015bcie b\u0142\u0119d\u00f3w i dziewi\u0119\u0107 ostrze\u017ce\u0144; przebieg z <code>--require<\/code> daje t\u0119 sam\u0105 list\u0119. Numery wierszy pomini\u0119to; <code>OutputNotEscaped<\/code> pojawia si\u0119 cztery razy, <code>TextDomainMismatch<\/code> i <code>NonceVerification.Recommended<\/code> po dwa razy.<\/p>\n<table>\n<thead>\n<tr>\n<th>Kod wyniku<\/th>\n<th>Test (kategoria)<\/th>\n<th>Typ<\/th>\n<th>Przyczyna w przyk\u0142adzie<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>no_plugin_readme<\/code><\/td>\n<td><code>plugin_readme<\/code> (plugin_repo)<\/td>\n<td>ERROR<\/td>\n<td>brak <code>readme.txt<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>plugin_header_no_license<\/code><\/td>\n<td><code>plugin_header_fields<\/code> (plugin_repo)<\/td>\n<td>ERROR<\/td>\n<td>brak nag\u0142\u00f3wka <code>License<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>textdomain_mismatch<\/code><\/td>\n<td><code>plugin_header_fields<\/code> (plugin_repo)<\/td>\n<td>WARNING<\/td>\n<td>nag\u0142\u00f3wek podaje <code>hello-banner<\/code>, slug to <code>lw-hello-banner<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>missing_direct_file_access_protection<\/code><\/td>\n<td><code>direct_file_access<\/code> (security, plugin_repo)<\/td>\n<td>ERROR<\/td>\n<td>funkcje i Hooki bez warunku <code>ABSPATH<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>WordPress.WP.I18n.TextDomainMismatch<\/code><\/td>\n<td><code>i18n_usage<\/code> (general, plugin_repo)<\/td>\n<td>ERROR<\/td>\n<td>wywo\u0142ania <code>__()<\/code> z niew\u0142a\u015bciw\u0105 Text Domain<\/td>\n<\/tr>\n<tr>\n<td><code>WordPress.WP.I18n.MissingTranslatorsComment<\/code><\/td>\n<td><code>i18n_usage<\/code> (general, plugin_repo)<\/td>\n<td>ERROR<\/td>\n<td><code>%s<\/code> bez komentarza <code>translators:<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>PluginCheck.CodeAnalysis.PHPErrorReporting.DirectErrorReportingCall<\/code><\/td>\n<td><code>php_error_reporting<\/code> (general)<\/td>\n<td>WARNING<\/td>\n<td><code>error_reporting( E_ALL )<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>WordPress.PHP.DevelopmentFunctions.prevent_path_disclosure_error_reporting<\/code><\/td>\n<td><code>plugin_review_phpcs<\/code> (plugin_repo)<\/td>\n<td>WARNING<\/td>\n<td><code>error_reporting( E_ALL )<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>PluginCheck.CodeAnalysis.SettingSanitization.register_settingMissing<\/code><\/td>\n<td><code>setting_sanitization<\/code> (plugin_repo)<\/td>\n<td>ERROR<\/td>\n<td><code>register_setting()<\/code> bez trzeciego argumentu<\/td>\n<\/tr>\n<tr>\n<td><code>WordPress.Security.EscapeOutput.OutputNotEscaped<\/code><\/td>\n<td><code>late_escaping<\/code> (security, plugin_repo)<\/td>\n<td>ERROR<\/td>\n<td><code>get_option()<\/code>, <code>__()<\/code>, <code>$name<\/code> i <code>$note<\/code> w <code>echo<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>PluginCheck.CodeAnalysis.EnqueuedResourceOffloading.OffloadedContent<\/code><\/td>\n<td><code>offloading_files<\/code> (plugin_repo)<\/td>\n<td>ERROR<\/td>\n<td>adres skryptu na <code>cdn.jsdelivr.net<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>WordPress.WP.EnqueuedResourceParameters.MissingVersion<\/code>, <code>.NotInFooter<\/code><\/td>\n<td><code>enqueued_scripts_in_footer<\/code> (performance)<\/td>\n<td>WARNING<\/td>\n<td>brak wersji i pi\u0105tego argumentu<\/td>\n<\/tr>\n<tr>\n<td><code>WordPress.Security.NonceVerification.Recommended<\/code><\/td>\n<td><code>plugin_review_phpcs<\/code> (plugin_repo)<\/td>\n<td>WARNING<\/td>\n<td><code>$_GET['lw_name']<\/code> bez weryfikacji Nonce<\/td>\n<\/tr>\n<tr>\n<td><code>WordPress.Security.ValidatedSanitizedInput.MissingUnslash<\/code>, <code>.InputNotSanitized<\/code><\/td>\n<td><code>plugin_review_phpcs<\/code> (plugin_repo)<\/td>\n<td>WARNING<\/td>\n<td><code>$_GET['lw_name']<\/code> u\u017cyte bez obr\u00f3bki<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<figure class=\"lw-diagram\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/wp-plugin-check-pl.png?v=20260930\" width=\"1120\" height=\"580\" alt=\"Od b\u0142\u0119dnej przyk\u0142adowej wtyczki do czystego przebiegu Plugin Check\"><figcaption>Plugin Check 2.1.0 dzieli testy na kategorie; b\u0142\u0119dy zatrzymuj\u0105 CI, ostrze\u017cenia trafiaj\u0105 do adnotacji<\/figcaption><\/figure>\n<p>Z tabeli wynikaj\u0105 trzy obserwacje. Po pierwsze, Text Domain jest zg\u0142aszana dwukrotnie, przez dwa r\u00f3\u017cne testy: test nag\u0142\u00f3wka por\u00f3wnuje pole <code>Text Domain<\/code> ze slugiem i zg\u0142asza ostrze\u017cenie, a sniff i18n por\u00f3wnuje ze slugiem ka\u017cde wywo\u0142anie funkcji t\u0142umacz\u0105cej i zg\u0142asza b\u0142\u0105d. Po drugie, zg\u0142oszenia dotycz\u0105ce Nonce i sanityzacji nie pochodz\u0105 z kategorii Security, lecz z <code>plugin_review_phpcs<\/code>, czyli przebiegu PHPCS z zestawem regu\u0142 recenzji Plugin Check; przebieg z <code>--categories=security<\/code> ich nie poka\u017ce. Po trzecie, zestaw regu\u0142 zawiera r\u00f3wnie\u017c grup\u0119 sniff\u00f3w <code>WordPress.PHP.DevelopmentFunctions<\/code> jako ostrze\u017cenie. Rzeczywi\u015bcie zg\u0142asza ona wiersz z <code>error_reporting()<\/code> po raz drugi, jako <code>prevent_path_disclosure_error_reporting<\/code>.<\/p>\n<p>Skrypt z CDN prowadzi do jeszcze jednej kwestii: testy uruchomieniowe zasi\u0119gu i strategii \u0142adowania skrypt\u00f3w oceniaj\u0105 wy\u0142\u0105cznie skrypty, kt\u00f3rych adres URL le\u017cy w katalogu wtyczki. Skrypt z CDN zg\u0142aszaj\u0105 wi\u0119c tylko testy statyczne, a przebieg z <code>--require<\/code> daje t\u0119 sam\u0105 list\u0119 co przebieg bez niego. Testy uruchomieniowe maj\u0105 znaczenie dopiero dla poprawionej wersji z do\u0142\u0105czonym skryptem: bez warunku <code>is_front_page()<\/code> Plugin Check zg\u0142asza go jako <code>EnqueuedScriptsScope<\/code> (\u201eThis script is being loaded in all frontend contexts.\u201d), ale tylko w przebiegu z <code>--require<\/code>.<\/p>\n<h2>Poprawiona wersja<\/h2>\n<p>Poprawiona wtyczka sk\u0142ada si\u0119 z trzech plik\u00f3w: pliku g\u0142\u00f3wnego, <code>readme.txt<\/code> i ma\u0142ego lokalnego skryptu w <code>assets\/<\/code>. Plik g\u0142\u00f3wny dostaje pe\u0142ny nag\u0142\u00f3wek z licencj\u0105, <code>Requires at least<\/code> i Text Domain <code>lw-hello-banner<\/code>, a tak\u017ce warunek <code>ABSPATH<\/code>. Wywo\u0142anie <code>error_reporting()<\/code> znika. <code>register_setting()<\/code> otrzymuje typ, <code>sanitize_callback<\/code> i warto\u015b\u0107 domy\u015bln\u0105. Dane s\u0105 escapowane dopiero w miejscu wypisania, za pomoc\u0105 <code>esc_attr()<\/code>, <code>esc_html()<\/code> i <code>esc_html__()<\/code>. Skrypt jest do\u0142\u0105czony do wtyczki, ma wersj\u0119 i \u0142aduje si\u0119 tylko na stronie g\u0142\u00f3wnej z <code>in_footer<\/code> i <code>strategy<\/code>. Tablicowa posta\u0107 pi\u0105tego argumentu <code>wp_enqueue_script()<\/code> istnieje od WordPressa 6.3, co zgadza si\u0119 z zadeklarowan\u0105 wersj\u0105 minimaln\u0105.<\/p>\n<pre><code>&lt;?php\n\/**\n * Plugin Name:       LW Hello Banner\n * Description:       Shows a greeting banner at the top of the front page.\n * Version:           0.2.0\n * Requires at least: 6.3\n * Requires PHP:      7.4\n * Author:            Lukas Wojcik\n * License:           GPLv2 or later\n * License URI:       https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\n * Text Domain:       lw-hello-banner\n *\/\n\nif ( ! defined( 'ABSPATH' ) ) {\n\texit;\n}\n\ndefine( 'LW_HELLO_BANNER_VERSION', '0.2.0' );\n\n\/**\n * Registers the banner note setting and its field on Settings &gt; General.\n *\/\nfunction lw_hello_banner_register_setting() {\n\tregister_setting(\n\t\t'general',\n\t\t'lw_hello_banner_note',\n\t\tarray(\n\t\t\t'type'              =&gt; 'string',\n\t\t\t'sanitize_callback' =&gt; 'sanitize_text_field',\n\t\t\t'default'           =&gt; '',\n\t\t)\n\t);\n\n\tadd_settings_field(\n\t\t'lw_hello_banner_note',\n\t\t__( 'Banner note', 'lw-hello-banner' ),\n\t\t'lw_hello_banner_field',\n\t\t'general',\n\t\t'default',\n\t\tarray( 'label_for' =&gt; 'lw_hello_banner_note' )\n\t);\n}\nadd_action( 'admin_init', 'lw_hello_banner_register_setting' );\n\n\/**\n * Prints the input field for the banner note.\n *\/\nfunction lw_hello_banner_field() {\n\tprintf(\n\t\t'&lt;input type=\"text\" class=\"regular-text\" id=\"lw_hello_banner_note\" name=\"lw_hello_banner_note\" value=\"%s\"&gt;',\n\t\tesc_attr( get_option( 'lw_hello_banner_note', '' ) )\n\t);\n}\n\n\/**\n * Loads the bundled script on the front page only.\n *\/\nfunction lw_hello_banner_assets() {\n\tif ( ! is_front_page() ) {\n\t\treturn;\n\t}\n\n\twp_enqueue_script(\n\t\t'lw-hello-banner',\n\t\tplugins_url( 'assets\/lw-hello-banner.js', __FILE__ ),\n\t\tarray(),\n\t\tLW_HELLO_BANNER_VERSION,\n\t\tarray(\n\t\t\t'in_footer' =&gt; true,\n\t\t\t'strategy'  =&gt; 'defer',\n\t\t)\n\t);\n}\nadd_action( 'wp_enqueue_scripts', 'lw_hello_banner_assets' );\n\n\/**\n * Prints the banner on the front page.\n *\/\nfunction lw_hello_banner_render() {\n\tif ( ! is_front_page() ) {\n\t\treturn;\n\t}\n\n\t\/\/ phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only display value, nothing is stored.\n\t$name = isset( $_GET['lw_name'] ) ? sanitize_text_field( wp_unslash( $_GET['lw_name'] ) ) : '';\n\tif ( '' === $name ) {\n\t\t$name = __( 'Guest', 'lw-hello-banner' );\n\t}\n\n\t$greeting = sprintf(\n\t\t\/* translators: %s: visitor name *\/\n\t\t__( 'Hello, %s!', 'lw-hello-banner' ),\n\t\t$name\n\t);\n\n\t$note = get_option( 'lw_hello_banner_note', '' );\n\n\techo '&lt;div class=\"lw-hello-banner\"&gt;&lt;p&gt;' . esc_html( $greeting );\n\tif ( '' !== $note ) {\n\t\techo ' ' . esc_html( $note );\n\t}\n\techo '&lt;\/p&gt;&lt;button type=\"button\"&gt;' . esc_html__( 'Dismiss', 'lw-hello-banner' ) . '&lt;\/button&gt;&lt;\/div&gt;';\n}\nadd_action( 'wp_body_open', 'lw_hello_banner_render' );<\/code><\/pre>\n<p>Imi\u0119 z adresu URL pozosta\u0142o celowo, w parametrze <code>lw_name<\/code>: WordPress sam odczytuje <code>name<\/code> jako slug wpisu, wi\u0119c <code>?name=Anna<\/code> zamienia stron\u0119 g\u0142\u00f3wn\u0105 w stron\u0119 404, na kt\u00f3rej <code>is_front_page()<\/code> zwraca false. Przechodzi przez <code>wp_unslash()<\/code> i <code>sanitize_text_field()<\/code>, a pozosta\u0142e ostrze\u017cenie o Nonce wycisza komentarz <code>phpcs:ignore<\/code>, kt\u00f3ry wskazuje sniff i podaje uzasadnienie. FAQ Plugin Check opisuje takie adnotacje jako przewidziany spos\u00f3b obs\u0142ugi fa\u0142szywych alarm\u00f3w PHPCS w konkretnym wierszu. Uzasadnienie jest tu zasadne tylko dlatego, \u017ce warto\u015b\u0107 niczego nie zmienia: nie jest zapisywana i nie uruchamia \u017cadnej akcji. W formularzu zapisuj\u0105cym dane potrzebne s\u0105 Nonce oraz sprawdzenie Capability, czym szczeg\u00f3\u0142owo zajmuje si\u0119 <a href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/sanityzacja-escaping-nonce-capability-wtyczki\/\">osobny artyku\u0142 z tej serii<\/a>.<\/p>\n<pre><code>=== LW Hello Banner ===\nContributors: lukaswojcik\nTags: banner, greeting\nRequires at least: 6.3\nTested up to: 7.1\nRequires PHP: 7.4\nStable tag: 0.2.0\nLicense: GPLv2 or later\nLicense URI: https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\n\nShows a short, dismissible greeting banner at the top of the front page.\n\n== Description ==\n\nLW Hello Banner prints a greeting on the front page. An optional note can be set under Settings &gt; General.\n\n== Changelog ==\n\n= 0.2.0 =\n* Fix all findings reported by Plugin Check.\n\n= 0.1.0 =\n* Initial version.<\/code><\/pre>\n<p>Dwa szczeg\u00f3\u0142y readme wynikaj\u0105 bezpo\u015brednio z kodu testu. \u201eTested up to\u201d musi odpowiada\u0107 bie\u017c\u0105cej g\u0142\u00f3wnej wersji WordPressa, obecnie 7.1. Starsza warto\u015b\u0107 to b\u0142\u0105d dla nowych wtyczek i ostrze\u017cenie w trybie aktualizacji, a warto\u015b\u0107 z numerem poprawki, np. 7.1.2, jest zg\u0142aszana jako <code>invalid_tested_upto_minor<\/code>. Test por\u00f3wnuje te\u017c licencj\u0119 w readme z licencj\u0105 w nag\u0142\u00f3wku wtyczki i zg\u0142asza r\u00f3\u017cnic\u0119 jako <code>license_mismatch<\/code>, dlatego w obu plikach widnieje identyczny zapis. Pola readme i nag\u0142\u00f3wka wtyczki omawia <span class=\"lw-artikel-geplant\">osobny artyku\u0142 z tej serii<\/span>.<\/p>\n<pre><code>\/\/ assets\/lw-hello-banner.js\n( function () {\n\tconst banner = document.querySelector( '.lw-hello-banner' );\n\tif ( ! banner ) {\n\t\treturn;\n\t}\n\n\tconst button = banner.querySelector( 'button' );\n\tif ( button ) {\n\t\tbutton.addEventListener( 'click', function () {\n\t\t\tbanner.hidden = true;\n\t\t} );\n\t}\n} )();<\/code><\/pre>\n<h2>Plugin Check w GitHub Actions<\/h2>\n<p>Oficjaln\u0105 integracj\u0105 jest repozytorium WordPress\/plugin-check-action. Najnowsze wydanie to v1.1.9 z 11 sierpnia 2026 roku, a ruchomy tag <code>v1<\/code> wskazuje obecnie na ten sam commit. To akcja typu composite. Kolejno konfiguruje Node 24, instaluje <code>@wordpress\/env<\/code>, uruchamia instancj\u0119 WordPressa z katalogiem wtyczki zmapowanym do <code>wp-content\/plugins<\/code>, instaluje Plugin Check z katalogu, a tak\u017ce wtyczki wymienione w <code>Requires Plugins<\/code>, po czym wywo\u0142uje <code>wp plugin check<\/code> z <code>--format=json<\/code> i <code>--require=.\/wp-content\/plugins\/plugin-check\/cli.php<\/code>. Testy uruchomieniowe s\u0105 wi\u0119c uwzgl\u0119dnione. Wed\u0142ug dokumentacji wp-env domy\u015blnie dzia\u0142a na Dockerze, dlatego standardowy runner Ubuntu jest naturalnym wyborem.<\/p>\n<p>Plik JSON analizuje skrypt Node. Ka\u017cdy wynik staje si\u0119 adnotacj\u0105 przy pliku, z kodem wyniku jako tytu\u0142em. Ka\u017cdy <code>ERROR<\/code> ustawia kod wyj\u015bcia 1 i ko\u0144czy zadanie niepowodzeniem, ostrze\u017cenia pojawiaj\u0105 si\u0119 tylko jako adnotacje. Przy <code>strict: true<\/code> ka\u017cdy wynik liczy si\u0119 jako b\u0142\u0105d. W pull requestach akcja dodaje lub aktualizuje komentarz z podsumowaniem, a surowy wynik zapisuje jako artefakt <code>plugin-check-results<\/code>.<\/p>\n<p>Parametry wej\u015bciowe w v1.1.9: <code>build-dir<\/code> (domy\u015blnie <code>.\/<\/code>), <code>checks<\/code>, <code>exclude-checks<\/code>, <code>categories<\/code>, <code>exclude-files<\/code>, <code>exclude-directories<\/code>, <code>ignore-codes<\/code>, <code>ignore-warnings<\/code>, <code>ignore-errors<\/code>, <code>include-experimental<\/code>, <code>wp-version<\/code> (<code>latest<\/code> lub <code>trunk<\/code>), <code>severity<\/code>, <code>error-severity<\/code>, <code>warning-severity<\/code>, <code>include-low-severity-errors<\/code>, <code>include-low-severity-warnings<\/code>, <code>slug<\/code>, <code>strict<\/code> i <code>repo-token<\/code>. Parametry listowe przyjmuj\u0105 jeden wpis w wierszu.<\/p>\n<p>O sensowno\u015bci wynik\u00f3w decyduj\u0105 dwa szczeg\u00f3\u0142y. Akcja wyprowadza slug z ostatniego cz\u0142onu <code>build-dir<\/code>. Przy domy\u015blnym <code>.\/<\/code> jest to nazwa katalogu roboczego, kt\u00f3ra wed\u0142ug dokumentacji GitHuba odpowiada nazwie repozytorium, np. <code>\/home\/runner\/work\/my-repo-name\/my-repo-name<\/code>. Je\u015bli repozytorium nazywa si\u0119 inaczej ni\u017c wtyczka, ka\u017cde wywo\u0142anie funkcji t\u0142umacz\u0105cej zostanie zg\u0142oszone. Ponadto test <code>file_type<\/code> w 2.1.0 ostrzega przed katalogiem <code>.github<\/code> wewn\u0105trz wtyczki i zg\u0142asza inne ukryte pliki. Sprawdzanie katalogu g\u0142\u00f3wnego repozytorium oznacza zatem testowanie plik\u00f3w, kt\u00f3re nigdy nie trafi\u0105 do wydania. Poni\u017cszy workflow buduje wi\u0119c za pomoc\u0105 <code>git archive<\/code> katalog, kt\u00f3ry faktycznie zosta\u0142by wys\u0142any, z uwzgl\u0119dnieniem wpis\u00f3w <code>export-ignore<\/code> w <code>.gitattributes<\/code>, i przekazuje go jako <code>build-dir<\/code>.<\/p>\n<pre><code># .github\/workflows\/plugin-check.yml\nname: Plugin Check\n\non:\n  pull_request:\n  push:\n    branches:\n      - main\n\npermissions:\n  contents: read\n  pull-requests: write # only for the summary comment on pull requests\n\njobs:\n  plugin-check:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions\/checkout@v7\n\n      # Build the folder that would be shipped, without .github and other\n      # development files (see export-ignore in .gitattributes).\n      - name: Build distributable plugin folder\n        run: |\n          mkdir -p build\n          git archive --format=tar --prefix=lw-hello-banner\/ HEAD | tar -x -C build\n\n      - name: Run Plugin Check\n        uses: wordpress\/plugin-check-action@v1\n        with:\n          # The folder name becomes the slug (text domain check, readme check).\n          build-dir: .\/build\/lw-hello-banner\n          wp-version: latest\n          # Optional filters, one entry per line:\n          # categories: |\n          #   plugin_repo\n          #   security\n          # exclude-checks: |\n          #   enqueued_scripts_scope\n          # ignore-codes: |\n          #   textdomain_mismatch\n          # Fail on warnings as well:\n          # strict: true<\/code><\/pre>\n<pre><code># .gitattributes: files that git archive leaves out of the build\n\/.gitattributes export-ignore\n\/.github        export-ignore\n\/.gitignore     export-ignore\n\/build          export-ignore<\/code><\/pre>\n<p>Uprawnienie <code>pull-requests: write<\/code> jest potrzebne tylko do komentarza z podsumowaniem; wed\u0142ug tabel uprawnie\u0144 GitHuba obejmuje ono endpoint komentarzy. Bez niego akcja zapisze w logu ostrze\u017cenie przy komentowaniu, ale wyniki i tak przeanalizuje. Przy preferencji sta\u0142ych wersji warto zamiast <code>v1<\/code> wskaza\u0107 <code>wordpress\/plugin-check-action@v1.1.9<\/code> albo hash jego commitu.<\/p>\n<h2>Ograniczenia i otwarte kwestie<\/h2>\n<ul>\n<li>Plugin Check nie zast\u0119puje r\u0119cznej recenzji. Strona wtyczki m\u00f3wi to wprost, a czysty przebieg nie gwarantuje akceptacji.<\/li>\n<li>Tabela zg\u0142osze\u0144 dla przyk\u0142adowej wtyczki pochodzi z lokalnego przebiegu <code>wp plugin check<\/code> w WordPressie 7.1.2. Sam workflow nie by\u0142 uruchamiany na GitHubie; lokalnie krok z <code>git archive<\/code> utworzy\u0142 oczekiwany katalog, a skrypt oceniaj\u0105cy akcji (v1.1.9) zako\u0144czy\u0142 si\u0119 kodem wyj\u015bcia 1 dla b\u0142\u0119dnego przyk\u0142adu i 0 dla poprawionej wersji.<\/li>\n<li>Niekt\u00f3re testy opieraj\u0105 si\u0119 na heurystykach. Test prefiks\u00f3w wyprowadza oczekiwane prefiksy z kodu wtyczki, dlatego liczy si\u0119 konsekwentny prefiks, taki jak <code>lw_hello_banner_<\/code>.<\/li>\n<li>Akcja instaluje t\u0119 wersj\u0119 Plugin Check, kt\u00f3r\u0105 katalog oferuje w chwili przebiegu, i nie ma parametru, kt\u00f3ry by j\u0105 zamrozi\u0142. Pipeline mo\u017ce wi\u0119c zmieni\u0107 kolor na czerwony po wydaniu nowego Plugin Check, cho\u0107 we wtyczce nic si\u0119 nie zmieni\u0142o.<\/li>\n<li>Brak parametru dla wersji PHP, a <code>wp-version<\/code> rozr\u00f3\u017cnia tylko najnowsze wydanie i trunk. Testy ze starszymi wersjami WordPressa lub PHP wymagaj\u0105 osobnej konfiguracji, np. z wp-env lub Playground, czemu po\u015bwi\u0119cony jest <span class=\"lw-artikel-geplant\">osobny artyku\u0142 z tej serii<\/span>.<\/li>\n<li>Zg\u0142oszenia wydajno\u015bciowe dotycz\u0105ce zasi\u0119gu skrypt\u00f3w zale\u017c\u0105 od sposobu, w jaki wtyczka do\u0142\u0105cza pliki; drug\u0105 stron\u0119 problemu pokazuje <a href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/optymalizacja-wydajnosci-przez-functions-php-selektywne-wyrejestrowywanie\/\">artyku\u0142 o selektywnym wy\u0142\u0105czaniu skrypt\u00f3w wtyczek<\/a>.<\/li>\n<\/ul>\n<div class=\"lw-faq\">\n<h2>Pytania i odpowiedzi<\/h2>\n<h3>Czy przebieg bez zg\u0142osze\u0144 gwarantuje przyj\u0119cie wtyczki do katalogu?<\/h3>\n<p>Nie. Wed\u0142ug FAQ Plugin Check wtyczka zazwyczaj musi przej\u015b\u0107 wszystkie testy kategorii <code>plugin_repo<\/code>, ale akceptacja nadal zale\u017cy od r\u0119cznej recenzji. Strona wtyczki wprost zaznacza, \u017ce Plugin Check nie zast\u0119puje r\u0119cznej recenzji; czysty przebieg jedynie j\u0105 przyspiesza.<\/p>\n<h3>Dlaczego akcja GitHub zg\u0142asza wi\u0119cej ni\u017c lokalne wywo\u0142anie wp plugin check?<\/h3>\n<p>Zwykle z trzech powod\u00f3w:<\/p>\n<ul>\n<li>Akcja zawsze wczytuje <code>cli.php<\/code> przez <code>--require<\/code> i aktywuje wtyczk\u0119, a lokalnie bez tego obej\u015bcia lub przy nieaktywnej wtyczce dzia\u0142aj\u0105 tylko testy statyczne.<\/li>\n<li>Akcja instaluje bie\u017c\u0105c\u0105 wersj\u0119 Plugin Check z katalogu, lokalnie mo\u017ce by\u0107 aktywna starsza.<\/li>\n<li>Przy <code>build-dir: .\/<\/code> sprawdza ca\u0142e repozytorium, \u0142\u0105cznie z <code>.github<\/code> i ukrytymi plikami.<\/li>\n<\/ul>\n<h3>Kiedy wyciszenie ostrze\u017cenia jest uzasadnione?<\/h3>\n<p>Gdy zg\u0142oszenie w danym przypadku faktycznie nie stanowi problemu, np. oczyszczony parametr URL, kt\u00f3ry jest tylko wy\u015bwietlany i nigdzie nie zapisywany. Wtedy przy tym wierszu nale\u017cy umie\u015bci\u0107 komentarz <code>phpcs:ignore<\/code> z nazw\u0105 sniffa i uzasadnieniem. <code>--ignore-codes<\/code> lub parametr akcji <code>ignore-codes<\/code> ukrywaj\u0105 kod w ca\u0142ej wtyczce, a wi\u0119c tak\u017ce prawdziwe problemy.<\/p>\n<h3>Dlaczego ta sama Text Domain jest zg\u0142aszana dwa razy?<\/h3>\n<p>Ze slugiem por\u00f3wnuj\u0105 j\u0105 dwa testy: <code>plugin_header_fields<\/code> sprawdza nag\u0142\u00f3wek <code>Text Domain<\/code> i zg\u0142asza <code>textdomain_mismatch<\/code> jako ostrze\u017cenie, a <code>i18n_usage<\/code> sprawdza ka\u017cde wywo\u0142anie funkcji t\u0142umacz\u0105cej i zg\u0142asza <code>WordPress.WP.I18n.TextDomainMismatch<\/code>. Slug to nazwa katalogu; w CI da si\u0119 go ustali\u0107 parametrem <code>slug<\/code>, lokalnie opcj\u0105 <code>--slug<\/code>.<\/p>\n<\/div>\n<div class=\"lw-quellen\">\n<h2>\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/plugin-check\/\" target=\"_blank\" rel=\"noopener noreferrer\">Plugin Check (PCP) na WordPress.org<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/plugin-check\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress\/plugin-check, README<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/plugin-check\/releases\/tag\/2.1.0\" target=\"_blank\" rel=\"noopener noreferrer\">Wydanie Plugin Check 2.1.0<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/plugin-check\/blob\/2.1.0\/docs\/CLI.md\" target=\"_blank\" rel=\"noopener noreferrer\">Plugin Check: dokumentacja WP-CLI (docs\/CLI.md)<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/plugin-check\/blob\/2.1.0\/docs\/checks.md\" target=\"_blank\" rel=\"noopener noreferrer\">Plugin Check: dost\u0119pne testy (docs\/checks.md)<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/plugin-check\/blob\/2.1.0\/includes\/Checker\/Default_Check_Repository.php\" target=\"_blank\" rel=\"noopener noreferrer\">Default_Check_Repository.php (tag 2.1.0)<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/plugin-check\/blob\/2.1.0\/includes\/Checker\/Check_Categories.php\" target=\"_blank\" rel=\"noopener noreferrer\">Check_Categories.php (tag 2.1.0)<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/plugin-check\/blob\/2.1.0\/includes\/CLI\/Plugin_Check_Command.php\" target=\"_blank\" rel=\"noopener noreferrer\">Plugin_Check_Command.php (tag 2.1.0)<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/plugin-check\/blob\/2.1.0\/phpcs-rulesets\/plugin-check.ruleset.xml\" target=\"_blank\" rel=\"noopener noreferrer\">plugin-check.ruleset.xml (tag 2.1.0)<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/plugin-check\/tree\/2.1.0\/includes\/Checker\/Checks\" target=\"_blank\" rel=\"noopener noreferrer\">Kod \u017ar\u00f3d\u0142owy test\u00f3w (tag 2.1.0)<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/plugin-check\/tree\/2.1.0\/tests\/phpunit\/tests\/Checker\/Checks\" target=\"_blank\" rel=\"noopener noreferrer\">Testy jednostkowe (tag 2.1.0)<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/plugin-check-action\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress\/plugin-check-action, README<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/plugin-check-action\/blob\/v1.1.9\/action.yml\" target=\"_blank\" rel=\"noopener noreferrer\">plugin-check-action: action.yml (v1.1.9)<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/plugin-check-action\/blob\/v1.1.9\/src\/main.ts\" target=\"_blank\" rel=\"noopener noreferrer\">plugin-check-action: src\/main.ts (v1.1.9)<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/plugin-check-action\/releases\/tag\/v1.1.9\" target=\"_blank\" rel=\"noopener noreferrer\">Wydanie plugin-check-action v1.1.9<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_enqueue_script\/\" target=\"_blank\" rel=\"noopener noreferrer\">wp_enqueue_script() \u2013 Developer Resources<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-env\/\" target=\"_blank\" rel=\"noopener noreferrer\">@wordpress\/env \u2013 Block Editor Handbook<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/api.wordpress.org\/core\/version-check\/1.7\/\" target=\"_blank\" rel=\"noopener noreferrer\">API wersji WordPress.org (bie\u017c\u0105ce wydanie 7.1.2)<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/github.com\/actions\/checkout\/releases\" target=\"_blank\" rel=\"noopener noreferrer\">Wydania actions\/checkout (v7.0.1)<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/docs.github.com\/en\/actions\/reference\/workflows-and-actions\/variables\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub Docs: zmienne (GITHUB_WORKSPACE)<\/a>, dost\u0119p 29.09.2026<\/li>\n<li><a href=\"https:\/\/docs.github.com\/en\/rest\/authentication\/permissions-required-for-github-apps\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub Docs: uprawnienia dla GitHub Apps<\/a>, dost\u0119p 29.09.2026<\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Plugin Check 2.1.0 w panelu, przez WP-CLI i w GitHub Actions, pokazany na celowo b\u0142\u0119dnej przyk\u0142adowej wtyczce i jej poprawionej wersji.<\/p>\n","protected":false},"author":1,"featured_media":20891,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92646],"tags":[92229,92280,92238,92077,92286],"class_list":["post-20856","post","type-post","status-publish","format-standard","hentry","category-tutorials-pl-wordpress-plugins-tricks-pl","tag-devops-pl","tag-php-pl","tag-tutorial-pl","tag-web-security-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>Plugin Check lokalnie i w CI: b\u0142\u0119dy wykryte przed recenzj\u0105 | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Plugin Check 2.1.0 z wp plugin check i oficjaln\u0105 akcj\u0105 GitHub: kategorie, kody wynik\u00f3w oraz przyk\u0142adowa wtyczka z b\u0142\u0119dami i jej poprawiona wersja.\" \/>\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\/plugin-check-lokalnie-i-w-ci\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Plugin Check lokalnie i w CI: b\u0142\u0119dy wykryte przed recenzj\u0105 | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Plugin Check 2.1.0 z wp plugin check i oficjaln\u0105 akcj\u0105 GitHub: kategorie, kody wynik\u00f3w oraz przyk\u0142adowa wtyczka z b\u0142\u0119dami i jej poprawiona wersja.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/plugin-check-lokalnie-i-w-ci\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-07T15:36:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20856-plugin-check-lokalnie-i-w-ci.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=\"19 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\\\/plugin-check-lokalnie-i-w-ci\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/plugin-check-lokalnie-i-w-ci\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Plugin Check lokalnie i w CI: b\u0142\u0119dy wykryte przed recenzj\u0105\",\"datePublished\":\"2026-10-07T15:36:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/plugin-check-lokalnie-i-w-ci\\\/\"},\"wordCount\":2525,\"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\\\/plugin-check-lokalnie-i-w-ci\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20856-plugin-check-lokalnie-i-w-ci.png\",\"keywords\":[\"DevOps\",\"PHP\",\"Tutorial\",\"Web Security\",\"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\\\/plugin-check-lokalnie-i-w-ci\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/plugin-check-lokalnie-i-w-ci\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/plugin-check-lokalnie-i-w-ci\\\/\",\"name\":\"Plugin Check lokalnie i w CI: b\u0142\u0119dy wykryte przed recenzj\u0105 | 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\\\/plugin-check-lokalnie-i-w-ci\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/plugin-check-lokalnie-i-w-ci\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20856-plugin-check-lokalnie-i-w-ci.png\",\"datePublished\":\"2026-10-07T15:36:00+00:00\",\"description\":\"Plugin Check 2.1.0 z wp plugin check i oficjaln\u0105 akcj\u0105 GitHub: kategorie, kody wynik\u00f3w oraz przyk\u0142adowa wtyczka z b\u0142\u0119dami i jej poprawiona wersja.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/plugin-check-lokalnie-i-w-ci\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/plugin-check-lokalnie-i-w-ci\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/plugin-check-lokalnie-i-w-ci\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20856-plugin-check-lokalnie-i-w-ci.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20856-plugin-check-lokalnie-i-w-ci.png\",\"width\":1200,\"height\":630,\"caption\":\"Plugin Check lokalnie i w CI: b\u0142\u0119dy wykryte przed recenzj\u0105\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/plugin-check-lokalnie-i-w-ci\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Plugin Check lokalnie i w CI: b\u0142\u0119dy wykryte przed recenzj\u0105\"}]},{\"@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":"Plugin Check lokalnie i w CI: b\u0142\u0119dy wykryte przed recenzj\u0105 | Lukas Wojcik","description":"Plugin Check 2.1.0 z wp plugin check i oficjaln\u0105 akcj\u0105 GitHub: kategorie, kody wynik\u00f3w oraz przyk\u0142adowa wtyczka z b\u0142\u0119dami i jej poprawiona wersja.","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\/plugin-check-lokalnie-i-w-ci\/","og_locale":"en_US","og_type":"article","og_title":"Plugin Check lokalnie i w CI: b\u0142\u0119dy wykryte przed recenzj\u0105 | Lukas Wojcik","og_description":"Plugin Check 2.1.0 z wp plugin check i oficjaln\u0105 akcj\u0105 GitHub: kategorie, kody wynik\u00f3w oraz przyk\u0142adowa wtyczka z b\u0142\u0119dami i jej poprawiona wersja.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/plugin-check-lokalnie-i-w-ci\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-10-07T15:36:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20856-plugin-check-lokalnie-i-w-ci.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"19 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\/plugin-check-lokalnie-i-w-ci\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/plugin-check-lokalnie-i-w-ci\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Plugin Check lokalnie i w CI: b\u0142\u0119dy wykryte przed recenzj\u0105","datePublished":"2026-10-07T15:36:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/plugin-check-lokalnie-i-w-ci\/"},"wordCount":2525,"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\/plugin-check-lokalnie-i-w-ci\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20856-plugin-check-lokalnie-i-w-ci.png","keywords":["DevOps","PHP","Tutorial","Web Security","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\/plugin-check-lokalnie-i-w-ci\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/plugin-check-lokalnie-i-w-ci\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/plugin-check-lokalnie-i-w-ci\/","name":"Plugin Check lokalnie i w CI: b\u0142\u0119dy wykryte przed recenzj\u0105 | 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\/plugin-check-lokalnie-i-w-ci\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/plugin-check-lokalnie-i-w-ci\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20856-plugin-check-lokalnie-i-w-ci.png","datePublished":"2026-10-07T15:36:00+00:00","description":"Plugin Check 2.1.0 z wp plugin check i oficjaln\u0105 akcj\u0105 GitHub: kategorie, kody wynik\u00f3w oraz przyk\u0142adowa wtyczka z b\u0142\u0119dami i jej poprawiona wersja.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/plugin-check-lokalnie-i-w-ci\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/plugin-check-lokalnie-i-w-ci\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/plugin-check-lokalnie-i-w-ci\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20856-plugin-check-lokalnie-i-w-ci.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20856-plugin-check-lokalnie-i-w-ci.png","width":1200,"height":630,"caption":"Plugin Check lokalnie i w CI: b\u0142\u0119dy wykryte przed recenzj\u0105"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/plugin-check-lokalnie-i-w-ci\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Plugin Check lokalnie i w CI: b\u0142\u0119dy wykryte przed recenzj\u0105"}]},{"@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\/20856","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=20856"}],"version-history":[{"count":1,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/20856\/revisions"}],"predecessor-version":[{"id":21695,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/20856\/revisions\/21695"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/20891"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=20856"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=20856"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=20856"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}