Ultimátní průvodce vývojem pluginů pro WordPress: Vytvoření profesionálních rozšíření od nuly

Čtení za 4 minuty.
2026-03-12
2026-06-03
2,315
Získávám provize, když nakupujete prostřednictvím níže uvedených odkazů, aniž by vás to něco stálo navíc.

Základy vývoje pluginů pro WordPress

Než se pustíte do hlubšího procházení kódu, je zásadní pochopit základní koncepty a strukturu WordPress pluginů. WordPress plugin je v podstatě další PHP skript, který interaguje s jádrem WordPress prostřednictvím systému hooků (hooků), čímž rozšiřuje nebo upravuje funkce webové stránky. Může se jednat o jediný soubor, nebo o kompletní adresář obsahující více souborů, CSS styly a JavaScript skripty.

Primární úkol při vývoji pluginu je vytvořit hlavní soubor, který splňuje stanovené standardy. Tento hlavní soubor se obvykle jmenuje podle názvu samotného pluginu.my-custom-plugin.phpV hlavě tohoto souboru musí být obsažen standardní blok poznámek s informacemi o vašem pluginu. Tyto poznámky slouží nejen k popisu vašeho pluginu pro WordPress, ale také se zobrazí na stránce pro správu pluginů v pozadí.

/**
 * 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
 */

„In the comments“Plugin NameJedná se o povinný položku; ostatní jsou volitelné, ale doporučujeme je vyplnit. Po vytvoření tohoto souboru jej umístěte do…/wp-content/plugins/Nezávislá složka v adresáři (například…)my-custom-pluginV tomto dokumentu můžete plugin najít a aktivovat na stránce “Pluginy” v administraci WordPressu.

Doporučujeme k přečtení. Od začátku až po praxi: Kompletní průvodce vývojem pluginů pro WordPress a pokročilé tipy.

Kerní princip fungování WordPress pluginů je založen na “hookech”. Hooky existují ve dvou typech: akční hooky (action hooks) a obsahové hooky (content hooks).(Action Hooks)A filter hooks(Filter Hooks)Akční háčky vám umožňují spouštět vlastní kód v určitých okamžicích – například při načítání hlavy stránky nebo při zveřejnění článku.add_action()Funkce nahraje vaši funkci na akční hook.

UltaHost – hosting služby pro weby postavené na platformě WordPress
Záruka vrácení peněz do 30 dnů, neomezený šířka pásma a databáze, bezplatná ochrana proti DDoS útokům. Sleva 501 TP4T při nákupu na 3 roky.

Filtrovací hooky vám umožňují upravovat data, která jsou v průběhu procesu generována. Například obsah článků prochází před zobrazením řadou filtrů.add_filter()Funkce mohou tyto data upravovat.

Internationalizace a lokalizace jsou nezbytnou součástí profesionálních pluginů. Pomocí jejich využití…__( ‘文本’, ‘text-domain’ )_e( ‘文本’, ‘text-domain’ )Funkce obaluje všechny řetězce viditelné pro uživatele a ve spojení s polem na načítání textu umožňuje pluginu podporovat více jazyků.Text DomainMusí být v souladu s informacemi definovanými v hlavičce pluginu; obvykle se jedná o název adresáře s pluginy nebo o verzi hlavního souboru (zobrazenou ve formátu „slug“).

Vytvořte svůj první funkční plugin.

Začněme vytvořením jednoduchého pluginu, který přidá do seznamu článků na webových stránkách vlastní řádek v administračním panelu určený k zobrazení počtu slov v článku. Tento příklad pokrývá základní postupy při vytváření pluginů, použití „hooků“ (speciálních funkcí) a bezpečného zobrazování dat.

Nejprve, ve vašem…/wp-content/plugins/V adresáři vytvořte novou složku a pojmenujte ji…my-first-extensionV této složce vytvořte hlavní soubor.my-first-extension.phpA přidejte informace o hlavičce pluginu uvedené v předchozí části.

Doporučujeme k přečtení. Průvodce vývojem pluginů pro WordPress: Vytvořte si vlastní funkční moduly od nuly

Dále potřebujeme přidat nový sloupec do seznamu pro správu článků. To zahrnuje dvě akce:manage_posts_columnsmanage_posts_custom_columnPrvní se používá k definování záhlaví nového sloupce, druhý k naplnění obsahu každého řádku tohoto sloupce.

// 为文章列表添加“字数统计”列
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 );

V tomto kódu…mfe_add_word_count_columnFunkce přijímá existující pole sloupců a přidává do něj nový sloupec.word_countZadejte klíč a vrátí se upravený seznam.add_filterPřipojte to k…manage_posts_columnsNa filtru.mfe_display_word_count_columnFunkce nejprve zkontroluje, zda je aktuálně zpracovávaná sloupec ten, který jsme přidali (“word_count”), poté získá obsah článku a použije…strip_tags()Odstraňte HTML značky a poté použijte obsah znovu.str_word_count()Počítejte počet slov (u čínštiny jde o počet znaků), a nakonec to použijte.esc_html()Po provedení bezpečného escapeování se výstup zobrazí.

Tento jednoduchý plugin již obsahuje základní funkce, ale profesionálnější plugin by měl také zvážit provádění určitých akcí při aktivaci nebo deaktivaci pluginu. Například bychom mohli vytvořit vlastní databázové tabulky nebo vyčistit dočasné údaje. To lze dosáhnout registrací hooků pro aktivaci a deaktivaci pluginu.

Shared hosting na hosting.com
Vysoký výkon, vybavený procesorem AMD EPYC, úložištěm NVMe SSD a LiteSpeedem, nepřetržitá interní podpora odborníků 24 hodin denně a 7 dní v týdnu, pokročilá bezpečnostní opatření včetně SSL, ochrany proti útokům hrubou silou, malwaru a DDoS, úspora až 731 TB/měsíc.
// 插件激活时执行的操作
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' );

Všimněte si, že…register_activation_hookregister_deactivation_hookPotřebujete úplnou cestu k hlavnímu souboru.FILEKonstanta by měla být použita jako první parametr. Logika pro aktivaci, deaktivaci a odinstalaci (odinstalace probíhá, když uživatel odstraní plugin) by měla být zpracovávána odděleně.

Implementace stránky pro nastavení pluginů

Plug-in s kompletní funkcionalitou obvykle musí poskytovat uživatelům možnosti konfigurace. Nejstandardnější způsob je vytvoření stránky nastavení v administraci WordPressu. To lze dosáhnout pomocí…add_menu_page()add_options_page()Tyto funkce jsou implementovány pomocí různých metod a algoritmů.

Nejprve vytvoříme hlavní položku menu. V níže uvedeném příkladu…mfe_create_admin_menuPoužití funkceadd_menu_page()Přidejme novou stránku. Tato funkce potřebuje název stránky, název menu, požadovaná oprávnění, „slug“ menu, funkci na výstup obsahu stránky, URL ikony a pozici menu.

Doporučujeme k přečtení. Začínáme od nuly: Kompletní průvodce vývojem pluginů pro WordPress a sdílení osvědčených postupů.

// 创建后台管理菜单
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' );

Dále potřebujeme definovat…mfe_settings_page_htmlFunkce slouží k renderování obsahu stránky. Profesionální nastavovací stránka by měla využívat standardní API WordPressu pro nastavení, které zajišťuje zpracování odeslání formulářů, ověřování polí a řešení dalších komplikovaných aspektů. Nejprve tedy musíme…register_setting()Zaregistrujte skupinu nastavení a pole.

// 初始化设置
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' );

Poté potřebujeme definovat funkce pro regionální zpětné volání (region callback functions) a funkce pro zpětné volání polí (field callback functions), které budou sloužit k výstupu HTML kódu. Funkce pro zpětné volání polí jsou obzvláště důležité, protože zobrazují pole v formuláři a zajišťují, že jejich hodnoty odpovídají uloženým nastavením.

Shared hosting od InterServeru
Sdílený hosting za 1 TB + 5 TB měsíčně za 2,50 USD, slevový kód tryinterserver pro první měsíc za 1 TB + 5 TB za 0,1 USD, a 461 skriptů cloudových aplikací k jednoduché instalaci.
// 设置区域的说明文本
function mfe_settings_section_cb( $args ) {
    ?>
    <p id="<?php echo esc_attr( $args['id'] ); ?>"><?php esc_html_e( '请在此配置插件的基本参数。', 'my-first-extension' ); ?></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"><?php esc_html_e( '请输入您的服务API密钥。', 'my-first-extension' ); ?></p>
    <br />&lt;?php
}

Na závěr vytvořte funkci pro hlavní stránku nastavení a použijte ji…settings_fields()do_settings_sections()Zajistěte bezpečné vystavení celého formuláře.

// 设置页面的HTML结构
function mfe_settings_page_html() {
    // 检查用户权限
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    ?&gt;
    <div class="wrap">
        <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
        <form action="/cs/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="cs"/></form>
    </div>
    <br />&lt;?php
}

Tímto způsobem vytvořené nastavení stránky zajišťuje WordPress API automatickou validaci, úpravu a uložení všech dat z formulářů; data jsou poté uložena…wp_optionsVe tabulce se jedná o položku s názvem…mfe_settings_optionsMezi možnostmi bylo výrazně zvýšeno bezpečnostní a pohodlné používání tohoto produktu.

Bezpečnost pluginů a osvědčené postupy

Vytvořte profesionální, bezpečný a snadno udržovatelný plugin, který bude dodržovat řadu osvědčených postupů (best practices). Hlavním principem je nikdy nedůvěřovat vstupním datům od uživatelů. Všechna data pocházející z externích zdrojů…$_GET$_POST$_COOKIEData z databází a dalších zdrojů musí být před výstupem, použitím nebo ukládáním řádně ověřena, očištěna a přeformátována (např. pomocí speciálních znaků – tzv. „escape characters“).

Ověřování a čištění dat: Před použitím dat k logickému posuzování je třeba zkontrolovat, zda odpovídají očekávanému formátu. Pokud například pole očekává čísla, je nutné je použít.intval()is_numeric()WordPress poskytuje mnoho pomocných funkcí, jako například…sanitize_text_field()Slouží k čištění textových řetězců.sanitize_email()Slouží k čištění e-mailových adres.

Data escape: Při výstupu jakýchkoli dat do HTML, JavaScriptu nebo URL je nutné provést jejich escape, aby se zabránilo útokům typu cross-site scripting (XSS). Použijte vhodné metody k označení speciálních znaků, jako jsou uvozovky, čárky atd.esc_html()Vyexportujte čistý text do HTML formátu.esc_attr()Vyexportujte do atributů HTML,esc_url()Výstupní URL:wp_json_encode()Kombinacewp_slash()Výstup do JavaScriptu:

Běžnou bezpečnostní chybou je použití neověřených proměnných přímo v dotazech na databázi, což může vést k útokům typu SQL injection. Nikdy nesmíte ručně skládat SQL příkazy. Měli byste používat funkce a nástroje poskytované systémem WordPress.$wpdbTřídy a jejich metody pro přípravu dotazů.

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 );

Příjem oprávnění: Před provedením jakékoli správní operace, úpravou dat nebo zobrazením citlivých informací pomocí pluginu je nutné ověřit, zda má aktuální uživatel oprávnění k provedení této operace.current_user_can( $capability )check_admin_referer()Provedou se kontroly atd.

Načítání skriptů a stylů po sobě: Nikdy neprovádějte to přímo v pluginu.<link><script>Pro zavádění souborů CSS a JS pomocí tagů se doporučuje použít následující způsob:wp_enqueue_style()wp_enqueue_script()Funkce, a ujistěte se, že jsou použity ve správných časech (v odpovídajících „hookech“), např.wp_enqueue_scriptsPoužívá se pro front-end.admin_enqueue_scriptsSlouží k provádění úloh na pozadí (v backendu). To umožňuje vyhnout se konfliktům a zajistit správné načtení závislostí.

Organizace kódu a pojmenovací konvence: Používejte pro názvy funkcí, tříd, proměnných a možností svých pluginů jedinečné předpony (napříkladmfe_To zabrání konfliktům s tématem, dalšími pluginy nebo samotným jádrem WordPressu. Komplexní pluginy by měly být rozděleny do více souborů a použití objektově orientovaného programování (OOP) může zvýšit čitelnost a znovupoužitelnost kódu.

Poskytněte funkci odinstalace a úklidu: Pokud plugin vytvořil databázové tabulky nebo vlastní nastavení, mělo by být zváženo poskytnutí funkce úklidu při odstranění (nikoli pouhém deaktivování) pluginu uživatelem. Toto lze realizovat pomocí samostatného souboru určeného k odinstalaci. V hlavním souboru pluginu lze k tomu použít vhodné kódy.register_uninstall_hook( FILE, ‘mfe_plugin_uninstall’ )Chcete registrovat funkci pro odinstalování, ale běžnější postup je vytvořit ji v adresáři s pluginy.uninstall.phpPři odstranění pluginů WordPress automaticky spustí tento soubor.

Závěr

Vývoj pluginů pro WordPress je proces, který kombinuje strukturované myšlení s hlubokým porozuměním základní architektuře WordPressu. Od psaní standardních informací v hlavičce pluginu po pochopení a obratné používání akčních a filtrovacích hooků – to vše jsou základy pro vytvoření jakékoli funkční rozšíření. Vytvoření užitečného pluginu vyžaduje nejen implementaci front-end funkcí, ale také vytvoření jasného a bezpečného rozhraní pro nastavení v pozadí, což lze efektivně provést pomocí API pro nastavení WordPressu.

Bezpečnost je klíčovou složkou celého procesu vývoje – od ověřování vstupních dat, přes escape operace u výstupních hodnot, až po kontrolu oprávnění uživatelů a bezpečné operace s databází. Žádný z těchto kroků nesmí být přehlížen. Dodržování osvědčených postupů, jako je správné načítání skriptů, používání jedinečných předpon a organizovaná struktura kódu, vytvoří vaši pluginovou sadu robustnější, snadněji udržovatelnou a umožní jí harmonické soužití s rozsáhlou WordPress ekosystémem. Díky krokům uvedeným v této příručce jste nyní získali základní znalosti a dovednosti potřebné k vytvoření profesionálního WordPress pluginu od nuly.

Časté dotazy

Jak přidat krátký kód do svého pluginu?

Krátké kódy umožňují uživatelům snadno vkládat funkce pluginů do článků nebo stránek.add_shortcode()Funkce slouží k registraci vašeho zkráceného kódu.

Vytvořte funkci na zpracování logiky krátkých kódů (shortcodes), která přijímá určité atributy.$atts)a obsah ($content)参数,并返回处理后的HTML。记住,短码回调函数必须返回(return)内容,而不是直接输出(echo)。返回的内容也需要进行适当的转义以确保安全。

Kde by měly být uloženy možnosti pluginů?

Pro jednoduché nastavení klíčových hodnot doporučujeme výrazně použít WordPress API Options.add_option()get_option()update_option()Funkce. Tyto data budou automaticky uloženy.wp_optionsV databázové tabulce.

Pokud váš plugin potřebuje ukládat velké množství strukturovaných dat (např. záznamy z formulářů, protokoly), měli byste zvážit vytvoření vlastních databázových tabulek.dbDelta()Funkce zajišťují, že vytváření a aktualizace struktury tabulek probíhají bezpečně a kompatibilně. Vytváření vlastních tabulek se obvykle provádí v rámci aktivací pluginů (v hookech určených k spouštění pluginů po jejich nainstalaci).

Jak je můj plugin kompatibilní s ostatními pluginy nebo šablonami?

Klíčem ke zlepšení kompatibility je dodržování kódovacích standardů WordPressu, používání jedinečných předpon a využívání hooků k poskytování možností pro rozšíření funkčnosti. Vyhněte se přímému úpravování základních souborů nebo globálních proměnných.

Ve vašem pluginu použijte…do_action()apply_filters()Vytvořte vlastní „hooky“, které umožní ostatním vývojářům upravovat nebo rozšiřovat chování vašeho pluginu. Před provedením operací, které mohou způsobit konflikty (např. přidávání stylů nebo skriptů), používejte podmínkové kontroly nebo nabídněte možnost vypnutí těchto funkcí.

Jak přidat mechanismus aktualizací pro plugin?

Pro pluginy hostované v oficiálním adresáři pluginů WordPress jsou aktualizace automaticky zpracovávány. U privátních nebo komerčních pluginů je nutné implementovat vlastní nástroj pro kontrolu aktualizací.

Obvykle to zahrnuje vytvoření třídy, která pravidelně kontroluje váš vzdálený server na nové verze a umožňuje uživatelům jednoduchým kliknutím provést aktualizaci. Můžete se inspirovat knihovnami jako “Plugin Update Checker” nebo to implementovat sami; klíčovým prvkem je použití vhodných technologií pro komunikaci s serverem a správu aktualizací.set_site_transient()Hook (např.)pre_set_site_transient_update_pluginsPoužijte tento způsob k injekci svých aktualizačních informací. Ujistěte se, že server pro aktualizace je bezpečný a spolehlivý.