Pełny przewodnik po tworzeniu wtyczek do WordPressa: od zera do profesjonalnego rozszerzenia.

4 minuty na przeczytanie.
2026-03-12
2026-06-03
2,300
Zarabiam prowizję, gdy robisz zakupy poprzez poniższe linki, bez żadnych dodatkowych kosztów dla Ciebie.

Podstawy rozwoju pluginów dla WordPressa

Przed zagłębieniem się w kod istotne jest zrozumienie podstawowych conceptów i struktury pluginów WordPress. Plugin WordPress to w istocie dodatkowy skrypt w języku PHP, który interaguje z core’em platformy za pomocą systemu hooków, umożliwiając rozszerzanie lub modyfikację funkcjonalności witryny. Może to być pojedyny plik, ale także cały katalog zawierający kilka plików, arkusze stylu CSS oraz skrypty JavaScript.

Głównym zadaniem przy rozwijaniu pluginu jest stworzenie standardowego pliku głównego. Zwykle ten plik nosi nazwę pluginu.my-custom-plugin.phpW nagłówku tego pliku musi znajdować się standardowy blok komentarzy zawierający informacje o twoim pluginie. Te komentarze służą nie tylko do opisania twojego pluginu dla WordPress, ale także będą wyświetlone na stronie zarządzania pluginami w tle systemu.

/**
 * Plugin Name: 我的自定义功能扩展
 * Plugin URI:  https://example.com/my-custom-plugin
 * Description: 这是一个用于演示的WordPress插件,用于添加自定义功能。
 * Version:     1.0.0
 * Author:      开发者名称
 * Author URI:  https://example.com
 * License:     GPL v2 or later
 * Text Domain: my-custom-plugin
 */

W komentarzach…Plugin NameTo pola obowiązkowe; wszystkie inne są opcjonalne, ale zaleca się je wypełnić. Po stworzeniu tego pliku umieść go w odpowiednie miejsce./wp-content/plugins/Katalog zawiera osobną folderę (na przykład…).my-custom-pluginMożna go zobaczyć i aktywować na stronie “Dodatki” w panelu administracyjnym WordPress.

Polecamy lekturę. Od podstaw do praktyki: kompleksowy przewodnik po tworzeniu wtyczek WordPressa oraz zaawansowane techniki.

Podstawowy mechanizm działania wtyczek WordPressu bazuje na “hakach” (ang. hooks). Istnieją dwa typy haków: akcyjne haki (action hooks) i haki wydarzeń (event hooks).(Action Hooks)I haki do filtrów.(Filter Hooks)Aktywnie działające „haki” (ang. action hooks) umożliwiają wykonywanie własnego kodu w określonych momencach – na przykład podczas ładowania nagłówka strony lub w momencie publikacji artykułu.add_action()Funkcja umożliwia montaż twojej funkcji na „hook” akcji (action hook).

UltaHost – hostingu dla stron WordPress
Gwarancja zwrotu pieniędzy w ciągu 30 dni, nieograniczony przepustowość sieci i dostęp do bazy danych, bezpłatna ochrona przed atakami typu DDoS. Promocja: 50% przy zakupie na 3 lata.

Filtry hooki umożliwiają modyfikację danych generowanych w trakcie procesu. Na przykład, treść artykułu przechodzi przez serię filtrów przed wyświetleniem.add_filter()Funkcje mogą modyfikować te dane.

Internacjonalizacja i lokalizacja to niezbędne elementy profesjonalnych dodatków (pluginów). Dzięki ich użyciu…__( ‘文本’, ‘text-domain’ )_e( ‘文本’, ‘text-domain’ )Funkcja otacza wszystkie teksty widoczne dla użytkowników i w połączeniu z polami do załadowania tekstu umożliwia, aby plugin obsługiwał kilka języków.Text DomainMusi być zgodne z informacjami zawartymi w nagłówku pliku rozszerzenia; najczęściej jest to nazwa katalogu z plikami rozszerzeń lub nazwa pliku głównego w wersji skróconej („slug”).

Stworz swoje pierwsze funkcjonalne dodatko (plugin).

Zacznijmy od stworzenia prostego pluginu, który dodaje do listy artykułów na stronie internetowej kolumnę zarządzania, umożliwiającą wyświetlenie informacji o ilości słów w poszczególnych tekstach. Ten przykład pokazuje podstawowe kroki przy tworzeniu pluginów, stosowanie „hooków” oraz bezpieczne wyświetlanie danych.

Najpierw, w twoim…/wp-content/plugins/Utworz kopię foldera w katalogu i nazwij ją…my-first-extensionW tym folderze utwórz plik główny.my-first-extension.phpDodaj również informacje o nagłówku pliku z pluginem, opisane w poprzednim rozdziale.

Polecamy lekturę. Przewodnik po rozwoju pluginów dla WordPress: jak stworzyć swoje własne moduły funkcjonalne od zera

Następnie musimy dodać nowy kolumn do listy zarządzania artykulami. To wymaga dwóch akcji:manage_posts_columnsmanage_posts_custom_columnPierwszy element służy do definiowania nagłówka nowego kolumnu, drugi element do wypełnienia zawartości każdej linii w tym kolumnie.

// 为文章列表添加“字数统计”列
function mfe_add_word_count_column( $columns ) {
    $columns['word_count'] = __( '字数统计', 'my-first-extension' );
    return $columns;
}
add_filter( 'manage_posts_columns', 'mfe_add_word_count_column' );

// 填充“字数统计”列的内容
function mfe_display_word_count_column( $column, $post_id ) {
    if ( $column === 'word_count' ) {
        $post_content = get_post_field( 'post_content', $post_id );
        $word_count = str_word_count( strip_tags( $post_content ) );
        echo esc_html( $word_count );
    }
}
add_action( 'manage_posts_custom_column', 'mfe_display_word_count_column', 10, 2 );

W tym kodzie…mfe_add_word_count_columnFunkcja przyjmuje dostępny array kolumn i dodaje nową kolumnę do niego.word_countKlawiszy i zwrócić zmieniony array.add_filterPołącz to z…manage_posts_columnsNa filtrze.mfe_display_word_count_columnFunkcja najpierw sprawdza, czy aktualnie obsługuje się kolumna “word_count”, którą dodaliśmy, a potem pobiera tekst artykułu i używa go dalej w swoim działaniu.strip_tags()Usun wszystkie elementy HTML, a potem użyj tekstu.str_word_count()Rachuj liczbę słów (w przypadku tekstu chińskiego to liczba znaków), a na koniec użyj tego wyniku.esc_html()Po wykonaniu procedur bezpiecznego escapeowania.

Ten prosty plugin już posiada podstawowe funkcje, ale profesjonalniejszy plugin powinien uwzględnić możliwość wykonywania określonych działań w momencie aktywacji lub dezaktywacji. Na przykład można tworzyć własne tabele w bazie danych lub usuwać tymczasowe pliki. To można zrealizować poprzez zarejestrowanie „hooków” (programowych elementów, które są wykonywane w określonych momencie).

hosting.com Hosting współdzielony
Wysoka wydajność dzięki procesorom AMD EPYC, pamięci masowej NVMe SSD i LiteSpeed, wewnętrzne wsparcie ekspertów 24/7, zaawansowane środki bezpieczeństwa, w tym SSL, brute force, ochrona przed złośliwym oprogramowaniem i DDoS, oszczędność do 73%
// 插件激活时执行的操作
function mfe_plugin_activation() {
    // 例如:添加一个版本号选项,用于后续升级判断
    if ( ! get_option( 'mfe_plugin_version' ) ) {
        add_option( 'mfe_plugin_version', '1.0.0' );
    }
    // 触发一个自定义动作,供其他开发者扩展
    do_action( 'mfe_plugin_activated' );
}
register_activation_hook( __FILE__, 'mfe_plugin_activation' );

// 插件停用时执行的操作
function mfe_plugin_deactivation() {
    // 例如:清除计划任务或临时数据
    // 注意:通常不在停用时删除用户数据(如表)
}
register_deactivation_hook( __FILE__, 'mfe_plugin_deactivation' );

Prosz o uwagę.register_activation_hookregister_deactivation_hookKonieczna jest pełna ścieżka do głównego pliku.FILEKonstanta powinna być podana jako pierwszy parametr. Logika aktywowania, dezaktywowania oraz dezinstalowania (dezinstalowanie następuje w momencie usunięcia wtyczki przez użytkownika) powinna być obsługiwana oddzielnie.

Implementacja strony konfiguracji pluginu

Dodatek o pełnej funkcjonalności powinien zapewnić użytkownikom możliwość konfiguracji. Najstandardniejszym sposobem na to jest stworzenie strony ustawień w panelu administracyjnym WordPress. Można to zrobić za pomocą…add_menu_page()add_options_page()Można to zrealizować za pomocą funkcji takich jak…

Najpierw stworzymy element menu najwyższego poziomu. W następującym przykładzie…mfe_create_admin_menuUżywanie funkcjiadd_menu_page()Aby dodać nową stronę, potrzebny jest następujący zestaw informacji: nagłówek strony, nagłówek menu, wymagane upoważnienia, nazwa menu (slug), funkcja obsługująca wyświetlenie treści strony, URL ikony oraz pozycja menu.

Polecamy lekturę. Od zera: kompletny przewodnik po tworzeniu wtyczek do WordPressa oraz dzieleniu się najlepszymi praktykami.

// 创建后台管理菜单
function mfe_create_admin_menu() {
    add_menu_page(
        __( '我的扩展设置', 'my-first-extension' ), // 页面标题
        __( '我的扩展', 'my-first-extension' ),      // 菜单标题
        'manage_options',                           // 权限(管理员)
        'mfe-settings',                             // 菜单slug
        'mfe_settings_page_html',                   // 显示页面内容的函数
        'dashicons-admin-generic',                  // 图标
        80                                          // 位置
    );
}
add_action( 'admin_menu', 'mfe_create_admin_menu' );

Następnie musimy to definiować.mfe_settings_page_htmlFunkcje są potrzebne do renderowania zawartości strony. Profesjonalna strona konfiguracji powinna korzystać ze standardowego API konfiguracji WordPress, które zajmuje się obsługą wysyłania formularzy, weryfikacją poli oraz innymi, czasochłonnymi procedurami. Najpierw musimy…register_setting()Udziel zezwolenia na rejestrację grupy ustawień oraz pola.

// 初始化设置
function mfe_settings_init() {
    // 注册一个新的设置组 “mfe_settings_group” 到页面 “mfe-settings”
    register_setting( 'mfe-settings', 'mfe_settings_options' );

// 在设置组内添加一个区域(Section)
    add_settings_section(
        'mfe_settings_section',
        __( '基本设置', 'my-first-extension' ),
        'mfe_settings_section_cb',
        'mfe-settings'
    );

// 在区域内添加一个字段
    add_settings_field(
        'mfe_field_api_key',
        __( 'API密钥', 'my-first-extension' ),
        'mfe_field_api_key_cb',
        'mfe-settings',
        'mfe_settings_section',
        [ 'label_for' => 'mfe_field_api_key' ]
    );
}
add_action( 'admin_init', 'mfe_settings_init' );

Następnie musimy definiować funkcje obsługi wydarzeń związanych z określonymi obszarami (region callback functions) oraz funkcje obsługi wydarzeń związane z poszczególnymi polami (field callback functions), aby wyświetlić HTML. Funkcje obsługi pol jest szczególnie istotne, ponieważ one renderują pola we formularzu i sprawiają, że ich wartości są zgodne z zapisanymi ustawieniami.

Hosting współdzielony InterServer
Hosting współdzielony $2.50 USD miesięcznie, pierwszy miesiąc $0.1 USD kod promocyjny tryinterserver, 461 skryptów aplikacji w chmurze, instalacja jednym kliknięciem.
// Ustawienia sekcji opisowej obszaru
function mfe_settings_section_cb( $args ) {
    ?>
    <p id="<?php echo esc_attr( $args['id'] ); ?>"><p><strong>Proszę skonfigurować tutaj podstawowe parametry wtyczki.</strong></p></p>
    <?php
}

// API密钥字段的回调函数
function mfe_field_api_key_cb( $args ) {
    // 从已注册的设置选项中获取值
    $options = get_option( 'mfe_settings_options' );
    $value = $options[ $args['label_for'] ] ?? '';
    ?>
    <input type="text"
           id="<?php echo esc_attr( $args['label_for'] ); ?>"
           name="mfe_settings_options[<?php echo esc_attr( $args['label_for'] ); ?>]"
           value="<?php echo esc_attr( $value ); ?>"
           class="regular-text">
    <p class="description"><p><strong> Ostrzeżenie!</strong> Widzę, że nie masz włączonej obsługi JavaScript w przeglądarce. Aby korzystać z tej strony, musisz ją włączyć. Jak to zrobić? Kliknij tutaj.</p></p>
    &lt;?php
}

Na koniec utwórz funkcję dla strony z głównymi ustawieniami, używając…settings_fields()do_settings_sections()Wyślij cały formularz w bezpieczny sposób.

\n// Ustawienie struktury HTML strony z ustawieniami
function mfe_settings_page_html() {
    // Sprawdzenie uprawnień użytkownika
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    ?&gt;
    <div class="wrap">
        <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
        <form action="/pl/options.php/" method="post" data-trp-original-action="options.php">
            <?php
            // 输出安全字段、区域和字段
            settings_fields( 'mfe-settings' );
            do_settings_sections( 'mfe-settings' );
            submit_button( __( '保存设置', 'my-first-extension' ) );
            ?>
        <input type="hidden" name="trp-form-language" value="pl"/></form>
    </div>
    &lt;?php
}

W taki sposób tworzona jest strona z ustawieniami, a wszystkie procedury sprawdzania, przygotowywania i zapisywania danych z form zostają automatycznie wykonywane przez API do konfiguracji WordPress. Dane są przechowywane w…wp_optionsW tabeli nazwa to…mfe_settings_optionsW opcjach dostępnych znacznie zwiększono poziom bezpieczeństwa i wygodę użytkowania.

Bezpieczeństwo wtyczek oraz najlepsze praktyki ich stosowania

Aby stworzyć profesjonalny, bezpieczny i łatwy w utrzymaniu plugin, należy stosować szereg najlepszych praktyk. Najważniejszym zasadą jest nigdy nie ufać wprowadzonym przez użytkownika danym. Wszystkie dane pochodzące z zewnętrznych źródeł…$_GET$_POST$_COOKIEDane z bazy danych, a także z innych źródeł, muszą zostać odpowiednio sprawdzone, przygotowane (wymazane niepotrzebne informacje) i zabezpieczone przed użyciem lub przechowaniem.

Weryfikacja i przygotowanie danych: Przed użyciem danych do realizacji logicznych operacji należy sprawdzić, czy odpowiadają oczekiwanemu formacie. Na przykład, jeśli pola ma zawierać tylko liczby, należy użyć odpowiednich metod weryfikacji.intval()is_numeric()WordPress oferuje wiele pomocniczych funkcji, np.sanitize_text_field()Znaczek używany do czyszczenia ciągu tekstowego.sanitize_email()Służy do czyszczenia adresów e-mail.

Ucieleśnienie danych: Przed wyświetleniem jakichkolwiek danych w HTML, JavaScript lub URL należy je ucieleśnić, aby zapobiec atakom typu XSS (Cross-Site Scripting).esc_html()Wyświetl tekst w formie zwykłego pliku tekstowego w formacie HTML.esc_attr()Wystaw to w atrytuty HTML.esc_url()Wyświetl adres URL.wp_json_encode()Połączeniewp_slash()Wykonaj to w JavaScript.

Częsty błąd bezpieczeństwa to wykorzystywanie niezweryfikowanych zmiennych w zapytach do bazy danych, co może doprowadzić do ataku typu SQL injection. Zawsze unikaj ręcznego łączenia zdań SQL – zamiast tego używaj funkcji dostępnych w WordPress.$wpdbKlasy oraz metody przygotowujące zapytania.

global $wpdb;
$user_input = $_POST['search_term'];
// 错误做法:直接拼接
// $sql = “SELECT * FROM {$wpdb->posts} WHERE post_title LIKE ‘%$user_input%’”;
// 正确做法:使用prepare方法
$sql = $wpdb->prepare(
    “SELECT * FROM {$wpdb->posts} WHERE post_title LIKE %s”,
    ‘%’ . $wpdb->esc_like( $user_input ) . ‘%’
);
$results = $wpdb->get_results( $sql );

Sprawdzenie upoważnień: Przed wykonaniem jakiejkolwiek operacji administracyjnej, modyfikacji danych lub wyświetleniem informacji poufnych przez dodatek należy sprawdzić, czy aktualny użytkownik posiada uprawnienia do wykonywania tej operacji.current_user_can( $capability )check_admin_referer()It is necessary to conduct verifications, including checking the following aspects:

Skrypty i arkusze stylu powinny być ładowane w kolejności – nigdy nie należy tego robić bezpośrednio w pluginie.<link><script>Tagi są używane do włączenia plików z kodem CSS i JS.wp_enqueue_style()wp_enqueue_script()Funkcja, zadbaj o to, aby została wykorzystana w odpowiednich punktach interakcji (ang. hooks)…wp_enqueue_scriptsWykorzystywane w frontendzie.admin_enqueue_scriptsWykonywa się w tle (w środowisku serwerowym). To zapobiega konfliktom oraz gwarantuje poprawne ładowanie zależności.

Zasady organizacji kodu i nazewania: używaj unikalnych prefiksów dla funkcji, klas, zmiennych oraz nazw opcji w swoim pluginie (na przykład:mfe_Aby uniknąć konfliktów z tematem, innymi wtyczkami lub core’em WordPressa, zorganizuj złożone wtyczki w kilka plików. Używanie programowania obiektowego (OOP) może poprawić czytelność i powtarzalność kodu.

Można udostępnić funkcję dezinstalacji i czyszczenia: jeśli plugin tworzy tabele w bazie danych lub ma ustawienia dostosowane do potrzeb użytkownika, należy zabezpieczyć możliwość usunięcia wszystkich pozostałych elementów po wykluczeniu pluginu (a nie tylko jego dezaktywacji). To można zrealizować poprzez stworzenie osobnego pliku do dezinstalacji. W głównym pliku pluginu można umieścić instrukcje dotyczące tego procesu.register_uninstall_hook( FILE, ‘mfe_plugin_uninstall’ )Można zarejestrować funkcję odinstalowania, ale bardziej powszechnym sposobem jest stworzenie takiej funkcji w katalogu pluginów.uninstall.phpWordPress automatycznie wykona ten plik po usunięciu wtyczki.

Podsumowanie.

Rozwoj pluginów dla WordPressu wymaga połączenia strukturalnego myślenia z głębokim zrozumieniem architektury serwisu WordPress. Od pisania standardowych informacji w nagłówku pluginu po zrozumienie i skuteczne wykorzystanie aktywnych („action”) oraz filtrowych („filter”) hooków – to wszystko stanowi fundament budowy każdej rozszerzalności funkcjonalnej. Aby stworzyć przydatny plugin, konieczne jest nie tylko implementowanie funkcji na stronie frontend, ale także przygotowanie jasnego i bezpiecznego interfejsu konfiguracji na stronie backend, co można efektywnie zrealizować za pomocą API dostępnego w WordPressie.

Bezpieczeństwo to kluczowy element w każdym etapie rozwoju pluginu – od weryfikacji wprowadzanych danych, poprzez bezpieczne formatowanie wyświetlanych informacji, aż po kontrolę uprawień użytkowników i bezpieczne operacje z bazą danych. Żaden z tych kroków nie może zostać ignorowany. Dodanie najlepszych praktyk, takich jak poprawne zarządzanie procesem ładowania skryptów, używanie unikalnych prefiksów oraz organizowanie kodu w jasny, zrozumiały sposób, sprawi, że twój plugin będzie bardziej wytrzymały, łatwiejszy w obsłudze i będzie dobrze integrowany z całą ekosystemem WordPress. Dzięki krokom opisanym w tym przewodniku poznasz już podstawowe informacje i umiejętności niezbędne do stworzenia profesjonalnego pluginu dla WordPress.

FAQ – najczęściej zadawane pytania.

Jak dodać krótki kod do mojego pluginu?

Krótkie kody umożliwiają użytkownikom łatwe wstawianie funkcji dodatkowych (pluginów) do artykułów lub stron internetowych.add_shortcode()Funkcja służy do rejestracji twojego krótkiego kodu.

Stwórz funkcję typu callback, która obsługuje logikę obsługi krótkich kodów (shortcodes). Ta funkcja przyjmuje jako parametr określone atryuty.$atts)i treść ($content)参数,并返回处理后的HTML。记住,短码回调函数必须返回(return)内容,而不是直接输出(echo)。返回的内容也需要进行适当的转义以确保安全。

W jakim miejscu powinny być przechowywane opcje dodatków (plug-inów)?

Dla prostych ustawień par kluczy–wartości mocnie zaleca się używać API Options w WordPress.add_option()get_option()update_option()Funkcje. Te dane będą automatycznie przechowywane.wp_optionsW tabeli bazy danych.

Jeśli twoje wtyczka wymaga przechowywania dużych ilości strukturalizowanych danych (na przykład danych z formularzy lub logów), warto zastanowić się nad stworzeniem własnych tabel w bazie danych.dbDelta()Funkcje są przygotowane, aby zapewnić, że proces tworzenia i aktualizacji struktury tabeli jest bezpieczny i kompatybilny z wymaganiami systemu. Tworzenie własnych tabel zwykle odbywa się w ramach aktywacji pluginów (w związku z wykonywaniem określonych procedur).

Jak moja wtyczka będzie kompatybilna z innymi wtyczkami lub tematami?

Kluczowym elementem poprawienia zgodności jest stosowanie standardów kodowania WordPress, używanie unikalnych prefiksów oraz wykorzystywanie hooków do dodawania nowych funkcjonalności. Unikaj bezpośrednich modyfikacji plików core lub globalnych zmiennych.

W twoim pluginie użyj…do_action()apply_filters()Można stworzyć własne „haki” (custom hooks), które umożliwiają innym programistom modyfikację lub rozszerzenie działania twojego pluginu. Ponadto, przed wykonywaniem operacji, które mogą powodować konflikty (np. dodawanie stylów lub skryptów), należy używać sprawdzeń warunkowych lub udostępniać opcję ich wykluczenia.

Jak dodać mechanizm aktualizacji do pluginu?

W przypadku pluginów umieszczonych w oficjalnym katalogu dodatków do WordPress aktualizacje są przeprowadzane automatycznie. Jeśli chodzi o pluginy prywatne lub komercyjne, konieczne jest implementowanie własnego narzędzia do sprawdzania dostępności aktualizacji.

Zwykle chodzi o stworzenie klasy, która regularnie sprawdza na twoim zdalnym serwerze dostępność nowych wersji i umożliwia użytkownikom aktualizację w jednym kliku. Możesz skorzystać z bibliotek typu “Plugin Update Checker” albo zrealizować to samodzielnie, przy czym kluczowym elementem jest używanie odpowiednich mechanizmów komunikacji z serwerem.set_site_transient()Hakówki (np.)pre_set_site_transient_update_pluginsMożna użyć tego sposobu, aby wgrać informacje o aktualizacjach. Upewnij się, że serwer obsługujący aktualizacje jest bezpieczny i niepowoduje żadnych problemów.