wtyczki.pl
Jak stworzyć własną wtyczkę WordPress - podstawy dla początkujących
Wtyczki 20.03.2026 · 19 min czytania

Jak stworzyć własną wtyczkę WordPress - podstawy dla początkujących

Tworzenie własnej wtyczki WordPress to krok, który otwiera zupełnie nowe możliwości — przestajesz być zależny od dostępnych na rynku rozwiązań i możesz zbudować dokładnie to, czego potrzebujesz. Nie wymaga też lat doświadczenia: podstawowa, działająca wtyczka to kilkanaście linii PHP. Ten artykuł przeprowadza przez fundamenty — od struktury pliku po hooki, shortcody i panel ustawień — z przykładami kodu, które możesz uruchomić na swojej stronie już dziś.

 

Artykuł jest częścią przewodnika Wtyczki WordPress — Kompletny Przewodnik.

Wymagania wstępne: Podstawowa znajomość PHP (zmienne, funkcje, tablice), edytor kodu (VS Code, PhpStorm), dostęp do lokalnego środowiska WordPress (LocalWP, DevKinsta, XAMPP). Ten artykuł nie zakłada wcześniejszego doświadczenia z WordPress development — ale zakłada, że umiesz napisać funkcję w PHP.


Czym technicznie jest wtyczka WordPress?

Wtyczka WordPress to w najprostszym ujęciu plik PHP z nagłówkiem rozpoznawanym przez WordPress. Nic więcej. WordPress skanuje folder /wp-content/plugins/, odnajduje pliki z odpowiednim nagłówkiem i wyświetla je na liście dostępnych wtyczek. Po aktywacji WordPress ładuje ten plik przy każdym żądaniu HTTP — i wtyczka może wpinać swój kod w odpowiednie miejsca systemu przez system hooków.

Architektura WordPress opiera się na trzech fundamentalnych konceptach:

Hooki (Hooks)

Mechanizm wpinania własnego kodu w określone momenty działania WordPressa — przy ładowaniu strony, zapisywaniu wpisu, wysyłaniu e-maila. Dzielą się na akcje (wykonaj coś) i filtry (zmodyfikuj coś).

Shortcody

Tagi wpisywane w treści wpisu lub strony ([moja-funkcja]), które WordPress zastępuje dynamicznie generowanym HTML. Sposób na dodanie własnej funkcjonalności do treści bez pisania PHP w edytorze.

API WordPressa

Zestaw funkcji wbudowanych w WordPress — do obsługi bazy danych, użytkowników, plików, opcji, żądań HTTP, REST API. Używasz ich zamiast pisać kod od zera.


Krok 1: Struktura pliku i nagłówek wtyczki

Minimalna wtyczka WordPress to jeden plik PHP w folderze w /wp-content/plugins/. Folder i główny plik powinny mieć tę samą nazwę (slug wtyczki):

/wp-content/plugins/
  moja-wtyczka/
    moja-wtyczka.php

Nagłówek wtyczki to komentarz PHP na początku głównego pliku. WordPress go parsuje i pobiera z niego metadane wtyczki:

<?php
/**
 * Plugin Name:       Moja Wtyczka
 * Plugin URI:        https://example.com/moja-wtyczka
 * Description:       Krótki opis tego, co robi wtyczka — widoczny na liście wtyczek w panelu.
 * Version:           1.0.0
 * Requires at least: 6.0
 * Requires PHP:      8.0
 * Author:            Jan Kowalski
 * Author URI:        https://example.com
 * License:           GPL v2 or later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain:       moja-wtyczka
 */

// Zabezpieczenie przed bezpośrednim dostępem do pliku
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

Jedyne pole obowiązkowe to Plugin Name — bez niego WordPress nie rozpozna pliku. Pozostałe pola są opcjonalne, ale wypełnienie ich to dobra praktyka — szczególnie Requires at least i Requires PHP, które WordPress sprawdza przed aktywacją i ostrzega użytkownika jeśli środowisko nie spełnia wymagań.

Dlaczego if ( ! defined( 'ABSPATH' ) ) exit;? To zabezpieczenie przed sytuacją, gdy ktoś próbuje wejść bezpośrednio na URL pliku PHP (np. twojadomena.pl/wp-content/plugins/moja-wtyczka/moja-wtyczka.php). ABSPATH jest definiowane przez WordPress — jeśli nie jest zdefiniowane, plik jest uruchamiany bezpośrednio, a nie przez WordPress. Każdy plik PHP w wtyczce powinien zaczynać się od tego sprawdzenia.


Krok 2: System hooków — akcje i filtry

Hooki to serce architektury WordPress. Zamiast modyfikować pliki rdzenia (co byłoby nadpisywane przy każdej aktualizacji WP), wpinasz swój kod w odpowiednie miejsca przez add_action() i add_filter().

Akcje — zrób coś w określonym momencie

// Składnia: add_action( 'nazwa_hooka', 'nazwa_twojej_funkcji', $priorytet, $liczba_argumentów );

// Przykład: dodaj tekst na końcu każdej strony
add_action( 'wp_footer', 'moja_wtyczka_stopka' );

function moja_wtyczka_stopka() {
    echo '<p>Stopka dodana przez moją wtyczkę</p>';
}

Najważniejsze akcje, z których będziesz korzystać:

  • init — WordPress zakończył inicjalizację, przed wysłaniem nagłówków HTTP. Tu rejestrujesz typy treści (CPT), taksonomie, shortcody.
  • wp_enqueue_scripts — właściwe miejsce do ładowania skryptów JS i arkuszy CSS na front-endzie.
  • admin_enqueue_scripts — ładowanie zasobów w panelu administracyjnym.
  • admin_menu — dodawanie stron do menu panelu WordPress.
  • save_post — wykona się za każdym razem gdy post jest zapisywany.
  • wp_footer i wp_head — wstrzykiwanie HTML przed </body> i w <head>.

Filtry — zmodyfikuj istniejącą wartość

// Składnia: add_filter( 'nazwa_filtra', 'nazwa_twojej_funkcji', $priorytet, $liczba_argumentów );

// Przykład: dodaj tekst na końcu każdego wpisu
add_filter( 'the_content', 'moja_wtyczka_dodaj_tekst' );

function moja_wtyczka_dodaj_tekst( $content ) {
    // Tylko dla pojedynczych wpisów, nie na listingach
    if ( is_single() ) {
        $content .= '<p><em>Podobał Ci się ten artykuł? Udostępnij go!</em></p>';
    }
    return $content; // Filtr ZAWSZE musi zwrócić wartość
}

Filtry muszą zwracać wartość. Jeśli zapomnisz dodać return w funkcji podpiętej pod filtr — wartość stanie się null. Przy filtrze the_content oznacza to zniknięcie całej treści wpisu. To jeden z najczęstszych błędów początkujących przy pracy z filtrami WordPress.

Priorytety hooków

Trzeci argument add_action() i add_filter() to priorytet — liczba całkowita określająca kolejność wykonania gdy wiele funkcji podpiętych jest pod ten sam hook. Domyślnie: 10. Niższy numer = wcześniej; wyższy = później.

// Ta funkcja wykona się przed innymi podpiętymi pod 'init' (priorytet 5 < 10)
add_action( 'init', 'moja_funkcja_wczesna', 5 );

// Ta funkcja wykona się po innych (priorytet 20 > 10)
add_action( 'init', 'moja_funkcja_pozna', 20 );

Krok 3: Prawidłowe ładowanie skryptów i stylów

Nie dodawaj skryptów JS i CSS przez echo w nagłówku ani bezpośrednio do hooków wp_head. WordPress ma własny system kolejkowania zasobów — wp_enqueue_scripts — który zarządza zależnościami, eliminuje duplikaty i pozwala innym wtyczkom i motywowi usuwać lub nadpisywać zasoby.

add_action( 'wp_enqueue_scripts', 'moja_wtyczka_zasoby' );

function moja_wtyczka_zasoby() {

    // Rejestracja i kolejkowanie arkusza CSS
    wp_enqueue_style(
        'moja-wtyczka-style',              // Unikalna nazwa (handle)
        plugin_dir_url( __FILE__ ) . 'css/style.css',  // Ścieżka do pliku
        array(),                           // Zależności (inne style, które muszą być załadowane pierwsze)
        '1.0.0'                            // Wersja — wymusza odświeżenie cache przeglądarki po aktualizacji
    );

    // Rejestracja i kolejkowanie skryptu JS
    wp_enqueue_script(
        'moja-wtyczka-script',
        plugin_dir_url( __FILE__ ) . 'js/script.js',
        array( 'jquery' ),                 // Zależność: jQuery musi być załadowane wcześniej
        '1.0.0',
        true                               // true = ładuj w stopce (przed ), nie w 
    );

    // Przekaż dane z PHP do JavaScript
    wp_localize_script(
        'moja-wtyczka-script',             // Handle skryptu, do którego dołączamy dane
        'MojaWtyczka',                     // Nazwa globalnego obiektu JS
        array(
            'ajaxUrl' => admin_url( 'admin-ajax.php' ),
            'nonce'   => wp_create_nonce( 'moja-wtyczka-nonce' ),
        )
    );
}

Ładuj skrypty tylko tam, gdzie są potrzebne. Jeśli Twoja wtyczka dodaje formularz tylko na stronie /kontakt, warunkowo sprawdzaj stronę przed kolejkowaniem zasobów:

if ( is_page( 'kontakt' ) ) {
    wp_enqueue_script( 'moja-wtyczka-script', ... );
}

To jeden z najłatwiejszych sposobów na poprawę wydajności własnych wtyczek.


Krok 4: Shortcody — własne tagi w treści

Shortcod to tag wpisywany w treści wpisu lub strony, który WordPress zamienia na HTML wygenerowany przez Twoją funkcję. To najłatwiejszy sposób, żeby właściciel strony mógł osadzić funkcjonalność wtyczki w treści bez pisania kodu.

// Rejestruj shortcody na hooku 'init'
add_action( 'init', 'moja_wtyczka_rejestruj_shortcody' );

function moja_wtyczka_rejestruj_shortcody() {
    add_shortcode( 'moj-shortcode', 'moja_wtyczka_shortcode_callback' );
}

// Callback shortcodu — zawsze musi ZWRACAĆ HTML, nie echo-wać go
function moja_wtyczka_shortcode_callback( $atts, $content = null ) {

    // Domyślne atrybuty shortcodu — nadpisywane przez to co wpisze użytkownik
    $atts = shortcode_atts( array(
        'kolor'  => 'niebieski',
        'rozmiar' => 'normalny',
    ), $atts, 'moj-shortcode' );

    // Zabezpiecz wartości przed XSS
    $kolor  = sanitize_text_field( $atts['kolor'] );
    $rozmiar = sanitize_text_field( $atts['rozmiar'] );

    // Zbuduj HTML używając output buffering lub konkatenacji
    ob_start();
    ?>
    <div class="moj-element kolor-<?php echo esc_attr( $kolor ); ?>">
        <p>Kolor: <?php echo esc_html( $kolor ); ?> | Rozmiar: <?php echo esc_html( $rozmiar ); ?></p>
        <?php if ( $content ) : ?>
            <div class="tresc"><?php echo wp_kses_post( $content ); ?></div>
        <?php endif; ?>
    </div>
    <?php
    return ob_get_clean(); // Zwróć bufor — NIE echo!
}

Użycie w treści wpisu:

[moj-shortcode kolor="czerwony" rozmiar="duzy"]Treść wewnątrz shortcodu[/moj-shortcode]

Shortcody muszą zwracać, nie echo-wać HTML. Jeśli użyjesz echo zamiast return — treść shortcodu pojawi się na początku strony, przed nagłówkiem i całą resztą treści. Zawsze używaj ob_start() / ob_get_clean() lub buduj string i go zwracaj.


Krok 5: Zapisywanie i odczytywanie opcji

WordPress ma wbudowane API do przechowywania ustawień wtyczki w bazie danych — w tabeli wp_options. Trzy kluczowe funkcje:

// Zapisz opcję (tworzy lub aktualizuje)
update_option( 'moja_wtyczka_kolor', 'niebieski' );

// Odczytaj opcję (drugi argument to wartość domyślna jeśli opcja nie istnieje)
$kolor = get_option( 'moja_wtyczka_kolor', 'szary' );

// Usuń opcję
delete_option( 'moja_wtyczka_kolor' );

Używaj prefiksów dla nazw opcji. Zamiast kolor — moja_wtyczka_kolor. Tabela wp_options jest współdzielona przez WordPress, wszystkie wtyczki i motyw — bez prefiksu ryzykujesz kolizję nazw z inną wtyczką.


Krok 6: Strona ustawień w panelu WordPress

Większość wtyczek potrzebuje strony konfiguracyjnej w panelu administracyjnym. WordPress udostępnia Settings API do budowania bezpiecznych stron ustawień z wbudowaną obsługą walidacji i wyświetlania błędów.

// 1. Dodaj pozycję menu
add_action( 'admin_menu', 'moja_wtyczka_menu' );

function moja_wtyczka_menu() {
    add_options_page(
        'Ustawienia Mojej Wtyczki',   // Tytuł strony (w tagu <title>)
        'Moja Wtyczka',               // Tekst w menu bocznym
        'manage_options',             // Wymagane uprawnienie (tylko administratorzy)
        'moja-wtyczka',               // Slug strony (unikalne ID)
        'moja_wtyczka_strona_ustawien' // Funkcja renderująca stronę
    );
}

// 2. Zarejestruj ustawienia przez Settings API
add_action( 'admin_init', 'moja_wtyczka_rejestruj_ustawienia' );

function moja_wtyczka_rejestruj_ustawienia() {
    register_setting(
        'moja_wtyczka_grupa',     // Nazwa grupy opcji
        'moja_wtyczka_kolor',     // Nazwa opcji w bazie danych
        array(
            'sanitize_callback' => 'sanitize_text_field', // Sanityzacja przed zapisem
            'default'           => 'niebieski',
        )
    );

    add_settings_section(
        'moja_wtyczka_sekcja_glowna',
        'Ustawienia ogólne',
        '__return_false', // Opcjonalny opis sekcji
        'moja-wtyczka'
    );

    add_settings_field(
        'moja_wtyczka_pole_kolor',
        'Kolor domyślny',
        'moja_wtyczka_pole_kolor_render',
        'moja-wtyczka',
        'moja_wtyczka_sekcja_glowna'
    );
}

// 3. Renderuj pole formularza
function moja_wtyczka_pole_kolor_render() {
    $wartosc = get_option( 'moja_wtyczka_kolor', 'niebieski' );
    echo '<input type="text" name="moja_wtyczka_kolor" value="' . esc_attr( $wartosc ) . '">';
}

// 4. Renderuj całą stronę ustawień
function moja_wtyczka_strona_ustawien() {
    // Sprawdź uprawnienia
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    ?>
    <div class="wrap">
        <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
        <form method="post" action="options.php">
            <?php
            settings_fields( 'moja_wtyczka_grupa' );
            do_settings_sections( 'moja-wtyczka' );
            submit_button( 'Zapisz ustawienia' );
            ?>
        </form>
    </div>
    <?php
}

Dobre praktyki przy tworzeniu wtyczek WordPress

Bezpieczeństwo — niezbywalne minimum

  • Sanityzuj dane wejściowe — każda wartość z $_POST, $_GET lub bazy danych może zawierać złośliwy kod. Używaj: sanitize_text_field(), sanitize_email(), absint(), wp_kses_post().
  • Escapuj dane wyjściowe — przed wyświetleniem w HTML zawsze escapuj: esc_html() dla zwykłego tekstu, esc_attr() dla atrybutów HTML, esc_url() dla URLi, wp_kses_post() dla HTML z tagami.
  • Sprawdzaj uprawnienia — przed każdą operacją wrażliwą (zapis danych, zmiana konfiguracji) wywołaj current_user_can().
  • Używaj nonce przy formularzach — nonce (number used once) to token weryfikujący, że żądanie pochodzi z Twojego formularza, a nie z zewnętrznej strony:
// W formularzu (generuj nonce)
wp_nonce_field( 'moja_akcja', 'moj_nonce' );

// Przy obsłudze POST (weryfikuj nonce)
if ( ! isset( $_POST['moj_nonce'] ) || ! wp_verify_nonce( $_POST['moj_nonce'], 'moja_akcja' ) ) {
    wp_die( 'Weryfikacja bezpieczeństwa nie powiodła się.' );
}

Namespace i prefiksy — unikaj kolizji

Wszystkie nazwy funkcji, klas, stałych i opcji w bazie danych poprzedzaj unikalnym prefiksem lub używaj przestrzeni nazw PHP (namespace). Bez tego ryzykujesz kolizję z inną wtyczką, która ma funkcję o tej samej nazwie — co kończy się błędem fatalnym PHP.

// Źle — ogólna nazwa łatwa o kolizję
function dodaj_naglowek() { ... }

// Dobrze — unikalny prefiks
function moja_wtyczka_dodaj_naglowek() { ... }

// Jeszcze lepiej — klasa z namespace
namespace MojaFirma\MojaWtyczka;

class NaglowekManager {
    public function dodaj() { ... }
}

Używaj wbudowanych funkcji WordPress zamiast własnych

WordPress oferuje bogaty zestaw API — do obsługi bazy danych ($wpdb), żądań HTTP (wp_remote_get()), plików (WP_Filesystem), e-maili (wp_mail()), cron (wp_schedule_event()). Używaj ich zamiast bezpośrednich zapytań SQL, file_get_contents(), mail() — masz wtedy automatyczną obsługę błędów i kompatybilność z WP.

Przygotuj czystą deinstalację

Zaimplementuj register_uninstall_hook(), który usuwa z bazy danych wszystkie opcje i tabele stworzone przez Twoją wtyczkę gdy użytkownik ją usunie. To sygnał szanującego deweloperstwa:

register_uninstall_hook( __FILE__, 'moja_wtyczka_odinstaluj' );

function moja_wtyczka_odinstaluj() {
    delete_option( 'moja_wtyczka_kolor' );
    delete_option( 'moja_wtyczka_ustawienia' );
    // Jeśli tworzyłeś własne tabele — usuń je tutaj
}

Struktura plików większej wtyczki

Gdy wtyczka rośnie powyżej kilkuset linii kodu — warto podzielić ją na pliki. Popularna struktura:

moja-wtyczka/
  moja-wtyczka.php          ← Główny plik z nagłówkiem, ładuje resztę
  includes/
    class-core.php          ← Główna klasa wtyczki
    class-admin.php         ← Funkcje panelu administracyjnego
    class-frontend.php      ← Funkcje front-endu
    helpers.php             ← Funkcje pomocnicze
  admin/
    css/
      admin-style.css
    js/
      admin-script.js
    views/
      settings-page.php     ← Szablon strony ustawień
  public/
    css/
      style.css
    js/
      script.js
  languages/                ← Pliki tłumaczeń (.pot, .po, .mo)
  readme.txt                ← Wymagany przy publikacji w WordPress.org

Krok 7: Własne typy treści (Custom Post Types)

WordPress obsługuje domyślnie posty i strony. Gdy Twoja wtyczka potrzebuje przechowywać własny rodzaj danych — produkty, oferty pracy, portfolio, recenzje — rejestrujesz własny typ treści (Custom Post Type, CPT). CPT korzysta z całej infrastruktury WordPressa: edytor wpisów, taksonomie, metadane, REST API, zapytania WP_Query.

add_action( 'init', 'moja_wtyczka_rejestruj_cpt' );

function moja_wtyczka_rejestruj_cpt() {
    register_post_type( 'oferta_pracy', array(
        'labels' => array(
            'name'          => 'Oferty pracy',
            'singular_name' => 'Oferta pracy',
            'add_new_item'  => 'Dodaj nową ofertę',
            'edit_item'     => 'Edytuj ofertę',
        ),
        'public'       => true,       // Widoczny na front-endzie i w panelu
        'has_archive'  => true,       // Strona archiwum /oferty-pracy/
        'show_in_rest' => true,       // Dostępny w edytorze Gutenberg i REST API
        'supports'     => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
        'menu_icon'    => 'dashicons-businessman',
        'rewrite'      => array( 'slug' => 'oferty-pracy' ),
    ) );
}

// WAŻNE: po zarejestrowaniu nowego CPT odśwież reguły przepisywania URL
// Najprościej: wejdź w Ustawienia → Bezpośrednie odnośniki i kliknij "Zapisz"
// Programowo (np. przy aktywacji wtyczki):
register_activation_hook( __FILE__, function() {
    moja_wtyczka_rejestruj_cpt();
    flush_rewrite_rules();
} );

Do CPT możesz też dodać własne taksonomie (odpowiednik kategorii lub tagów dla Twojego nowego typu treści):

add_action( 'init', 'moja_wtyczka_rejestruj_taksonomie' );

function moja_wtyczka_rejestruj_taksonomie() {
    register_taxonomy( 'branża', 'oferta_pracy', array(
        'labels'       => array(
            'name'          => 'Branże',
            'singular_name' => 'Branża',
        ),
        'hierarchical' => true,  // true = jak kategorie; false = jak tagi
        'show_in_rest' => true,
        'rewrite'      => array( 'slug' => 'branza' ),
    ) );
}

Krok 8: Meta pola — dodatkowe dane do wpisów

Każdy wpis WordPress może mieć nieograniczoną liczbę dodatkowych pól danych (post meta) — przechowywanych w tabeli wp_postmeta. Dla CPT „Oferta pracy" możesz przechowywać np. lokalizację, typ umowy, widełki wynagrodzenia. Nowoczesny sposób to rejestracja meta pól przez REST API z wbudowaną walidacją i sanityzacją:

add_action( 'init', 'moja_wtyczka_rejestruj_meta' );

function moja_wtyczka_rejestruj_meta() {
    register_post_meta( 'oferta_pracy', 'wynagrodzenie', array(
        'type'              => 'integer',
        'description'       => 'Wynagrodzenie w PLN (brutto)',
        'single'            => true,
        'default'           => 0,
        'show_in_rest'      => true,       // Dostępne przez REST API i w Gutenbergu
        'sanitize_callback' => 'absint',   // Sanityzacja: tylko dodatnie liczby całkowite
        'auth_callback'     => function() {
            return current_user_can( 'edit_posts' );
        },
    ) );

    register_post_meta( 'oferta_pracy', 'lokalizacja', array(
        'type'              => 'string',
        'single'            => true,
        'default'           => '',
        'show_in_rest'      => true,
        'sanitize_callback' => 'sanitize_text_field',
        'auth_callback'     => function() {
            return current_user_can( 'edit_posts' );
        },
    ) );
}

// Odczyt i zapis meta pól
$wynagrodzenie = get_post_meta( $post_id, 'wynagrodzenie', true );
update_post_meta( $post_id, 'wynagrodzenie', 8000 );
delete_post_meta( $post_id, 'wynagrodzenie' );

Krok 9: REST API — udostępnij dane z wtyczki

WordPress REST API pozwala udostępniać i odbierać dane przez endpoint HTTP — np. dla aplikacji mobilnej, headless frontendu w React/Vue lub integracji z zewnętrznym systemem. Rejestracja własnego endpointu to kilkanaście linii kodu:

add_action( 'rest_api_init', 'moja_wtyczka_rejestruj_endpoint' );

function moja_wtyczka_rejestruj_endpoint() {
    register_rest_route(
        'moja-wtyczka/v1',   // Namespace — nazwa_wtyczki/wersja
        '/oferty',            // Ścieżka endpointu
        array(
            'methods'             => WP_REST_Server::READABLE,  // GET
            'callback'            => 'moja_wtyczka_endpoint_oferty',
            'permission_callback' => '__return_true', // Publiczny endpoint
            // Dla chronionych endpointów:
            // 'permission_callback' => function() {
            //     return current_user_can( 'read' );
            // },
        )
    );
}

function moja_wtyczka_endpoint_oferty( WP_REST_Request $request ) {
    $oferty = get_posts( array(
        'post_type'      => 'oferta_pracy',
        'posts_per_page' => 10,
        'post_status'    => 'publish',
    ) );

    $dane = array_map( function( $oferta ) {
        return array(
            'id'           => $oferta->ID,
            'tytul'        => $oferta->post_title,
            'lokalizacja'  => get_post_meta( $oferta->ID, 'lokalizacja', true ),
            'wynagrodzenie' => get_post_meta( $oferta->ID, 'wynagrodzenie', true ),
            'url'          => get_permalink( $oferta->ID ),
        );
    }, $oferty );

    return rest_ensure_response( $dane );
}

// Dostęp przez URL: https://twojadomena.pl/wp-json/moja-wtyczka/v1/oferty

Narzędzia i środowisko pracy

Dobry warsztat skraca czas developmentu i eliminuje całe klasy błędów. Oto zestaw narzędzi, których używają profesjonalni deweloperzy WordPress:

Lokalne środowisko WordPress

LocalWP

Najprostsze w konfiguracji — instalator, jeden klik, gotowe lokalne środowisko WordPress. Wbudowany SSL, możliwość szybkiego przełączania wersji PHP. Darmowe.

DevKinsta

Narzędzie od Kinsta — czyste środowisko Docker, świetna integracja z hostingiem Kinsta, wbudowane narzędzie do zarządzania bazą danych. Darmowe.

Lando / Docker

Dla zaawansowanych — pełna kontrola nad środowiskiem, możliwość odwzorowania dokładnej konfiguracji produkcyjnej. Wyższy próg wejścia.

Edytor i rozszerzenia

  • VS Code z rozszerzeniami: PHP Intelephense (podpowiadanie kodu PHP), WordPress Snippets (snippety WP API), PHP CS Fixer (automatyczne formatowanie według WPCS)
  • PhpStorm — płatny, ale najlepsze wsparcie dla PHP i WordPress w IDE. Szczególnie wartościowy przy większych projektach.

Narzędzia diagnostyczne

  • Query Monitor — błędy PHP, hooki, zapytania SQL, czas wykonania bezpośrednio w pasku WP
  • WP Debug Bar — dodatkowe informacje o środowisku i stanie WordPressa
  • WP-CLI — zarządzanie WordPressem przez terminal, niezastąpione przy automatyzacji i testowaniu
  • PHP_CodeSniffer + WPCS — statyczna analiza kodu pod kątem WordPress Coding Standards

Testowanie

  • WP-CLI scaffold plugin-tests — generuje szkielet testów PHPUnit dla Twojej wtyczki
  • PHPUnit — testy jednostkowe i integracyjne dla kodu PHP
  • Playwright / Cypress — testy end-to-end sprawdzające działanie wtyczki w przeglądarce

Gdzie szukać dalszej wiedzy

  • developer.wordpress.org — Plugin Handbook, Theme Handbook, REST API, Block Editor API. Pierwsze miejsce przy każdym pytaniu o WordPress API.
  • GenerateWP.com — generatory boilerplate dla CPT, taksonomii, shortcode'ów, meta pól — przyspieszają start nowego projektu.
  • WordPress Coding Standards (WPCS) — PHP_CodeSniffer z ruleset WPCS. Obowiązkowe przed publikacją w repozytorium WordPress.org.
  • Query Monitor — debugowanie hooków, zapytań SQL i błędów PHP w czasie rzeczywistym.
  • wp-cli.org — dokumentacja WP-CLI z pełną listą komend do zarządzania WordPress i tworzenia scaffoldingu wtyczek.

Nie chcesz pisać wtyczki samodzielnie?

Tworzenie własnej wtyczki WordPress daje pełną kontrolę — ale wymaga czasu, znajomości PHP i ciągłego utrzymania kodu. Jeśli potrzebujesz konkretnej funkcjonalności na swojej stronie lub w sklepie WooCommerce, a nie chcesz inwestować w naukę WP development — możemy napisać wtyczkę na zamówienie.

Kiedy warto zamówić wtyczkę

  • Potrzebujesz niestandardowej integracji z zewnętrznym systemem (CRM, ERP, API kurierów)
  • Gotowe wtyczki z rynku nie pokrywają Twojego przypadku użycia
  • Zależy Ci na bezpiecznym, utrzymywalnym kodzie bez technicznych kompromisów
  • Potrzebujesz wtyczki, którą będziesz mógł rozwijać i aktualizować długoterminowo

Co oferujemy

  • Analiza wymagań i wycena przed rozpoczęciem prac
  • Kod zgodny z WordPress Coding Standards
  • Dokumentacja i instrukcja użytkowania
  • Wsparcie techniczne po wdrożeniu

Zamów własną wtyczkę WordPress →


FAQ — tworzenie wtyczek WordPress

Czy muszę znać PHP żeby stworzyć wtyczkę WordPress?

Tak — PHP jest językiem, w którym napisany jest WordPress i w którym piszesz wtyczki. Nie musisz być ekspertem: podstawy (zmienne, funkcje, tablice, warunki, pętle) wystarczą do prostych wtyczek. JavaScript jest potrzebny gdy tworzysz interaktywne elementy front-endu lub bloki Gutenberga (React).

Czy mogę opublikować swoją wtyczkę w repozytorium WordPress.org?

Tak — repozytorium jest otwarte dla każdego. Prześlij wtyczkę przez formularz na wordpress.org/plugins/developers/add, przejdź przegląd kodu przez zespół WordPress (kilka tygodni) i spełnij wymagania: licencja GPL, standardy kodowania, brak złośliwego kodu, poprawny plik readme.txt. Publikacja jest bezpłatna.

Jak debugować własną wtyczkę?

Włącz tryb debug w wp-config.php:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false ); // Nie pokazuj błędów odwiedzającym

Błędy PHP lądują w /wp-content/debug.log. Zainstaluj Query Monitor — wyświetla błędy, hooki, zapytania SQL i czas wykonania bezpośrednio w pasku admina.

Jaka jest różnica między wtyczką a motywem potomnym?

Motyw potomny nadpisuje wygląd i szablony — jest powiązany z konkretnym motywem rodzicem i traci sens po jego zmianie. Wtyczka dodaje funkcjonalność niezależnie od aktywnego motywu. Własny kod PHP dodający nowe funkcje powinien zawsze trafiać do wtyczki, nigdy do functions.php motywu — inaczej tracisz go przy zmianie lub aktualizacji motywu.

Jak zarejestrować blok Gutenberga we własnej wtyczce?

Bloki Gutenberga rejestrujesz przez register_block_type() w PHP oraz odpowiadający mu kod JavaScript (React). Najprostszy punkt startowy to scaffolding przez WP-CLI:

wp scaffold block moj-blok --title="Mój Blok" --plugin=moja-wtyczka

Wygeneruje gotowy szkielet bloku z plikami PHP, JS i CSS — gotowy do rozbudowania. Pełna dokumentacja: developer.wordpress.org/block-editor/.

Czy wtyczka napisana samodzielnie jest bezpieczna?

Bezpieczeństwo zależy od przestrzegania zasad: sanityzuj dane wejściowe, escapuj dane wyjściowe, sprawdzaj uprawnienia, używaj nonce przy formularzach. Pomiń choćby jeden z tych kroków i wtyczka może stać się wektorem ataku. Jeśli Twoja wtyczka obsługuje dane wrażliwe lub płatności — zlecenie audytu bezpieczeństwa komuś z doświadczeniem w WP security jest rozsądną inwestycją.


Chcesz zgłębić temat zarządzania wtyczkami od strony użytkownika? Wróć do kompletnego przewodnika po wtyczkach WordPress.

← Wtyczki WordPress — Kompletny Przewodnik

Potrzebujesz wtyczki na zamówienie? Napisz do nas — przeanalizujemy wymagania, wycenimy projekt i napiszemy wtyczkę zgodną ze standardami WordPress, z dokumentacją i wsparciem technicznym.

Zamów wtyczkę WordPress na zamówienie →

Inne wpisy

Wtyczki WordPress Multisite -— zarządzanie siecią stron
Wtyczki 20.03.2026

Wtyczki WordPress Multisite -— zarządzanie siecią stron

WordPress Multisite pozwala uruchamiać wiele stron z jednej instalacji WordPress — wspólna baza kodu, wspólna biblioteka wtyczek, ale osobne bazy danych dla treści, osobni użytkownicy i osobne ustawienia dla każdej podstrony sieci. To potężne narzędzie dla agencji zarządzających dziesiątkami stron klientów, sieci blogów, portali edukacyjnych i firm z rozbudowaną strukturą subdomen. Ale Multisite zmienia fundamentalnie sposób, w jaki działają wtyczki — i to właśnie jest temat tego artykułu.

Wtyczki do social media WordPress - przyciski, feed i udostępnianie
Wtyczki 20.03.2026

Wtyczki do social media WordPress - przyciski, feed i udostępnianie

Social media i WordPress to para, która powinna działać sprawnie — ale często generuje niepotrzebne problemy: wolne ładowanie strony przez zewnętrzne SDK, przyciski udostępniania które nie zliczają poprawnie, feed z Instagrama blokujący się po kolejnej zmianie API Mety. W tym artykule przejdziemy przez każdą kategorię integracji social media z WordPress i dobierzemy narzędzia, które działają bez niepotrzebnego obciążania strony.

Najlepsze wtyczki do formularzy WordPress - porównanie i wybór
Wtyczki 15.03.2026

Najlepsze wtyczki do formularzy WordPress - porównanie i wybór

Formularz kontaktowy to minimum na każdej stronie biznesowej. Ale nowoczesne wtyczki do formularzy WordPress to znacznie więcej niż pole „imię, e-mail, wiadomość, wyślij" — to narzędzia do zbierania leadów, obsługi zgłoszeń serwisowych, rejestracji na wydarzenia, obliczania wycen, przeprowadzania ankiet i integracji z CRM. Wybór właściwej wtyczki zależy od tego, do czego jej naprawdę potrzebujesz. Ten artykuł porównuje najważniejsze opcje i mówi wprost: kiedy wystarczy darmowa, kiedy warto zapłacić i którą wybrać do konkretnego przypadku.