De basisstructuur en het maken van een WordPress-plugin

4 minuten leestijd
2026-03-12
2026-06-03
2,721
Ik verdien commissies wanneer je via de onderstaande links winkelt, zonder dat dit extra kosten voor jou met zich meebrengt.

De basisstructuur en het maken van een WordPress-plugin

Het maken van een WordPress-plugin begint met een eenvoudige PHP-bestand. Dit hoofdbestand moet bepaalde commentaren (header-commentaren) bevatten, zodat WordPress het kan herkennen en het kan beheren als een plugin. Een zeer basistisch plugin kan bestaan uit één enkel bestand. my-first-plugin.php

<?php
/**
 * Plugin Name: 我的第一个插件
 * Plugin URI:  https://example.com/my-first-plugin
 * Description: 这是一个用于演示的简单WordPress插件。
 * Version:     1.0.0
 * Author:      开发者姓名
 * License:     GPL v2 or later
 * Text Domain: my-first-plugin
 */

In de commentaren aan het begin van het bestand is “Plugin Name” verplicht; de overige informatie is optioneel. Nadat de plugin is geactiveerd, worden zijn functies uitgevoerd door PHP-functies op het juiste moment. Een van de meest voorkomende manieren om dit te doen, is het gebruik van “action hooks”. Als je bijvoorbeeld een tekstfragment wilt toevoegen aan de voet van een webpagina, kun je dit doen met behulp van action hooks. wp_footer Hook.

// 在页脚输出自定义内容
function myplugin_add_footer_text() {
    echo '<p style="text-align:center;">Bedankt dat je mijn plug-in gebruikt!</p>';
}
add_action( 'wp_footer', 'myplugin_add_footer_text' );

add_action Dit is een kernfunctie van WordPress die wordt gebruikt om zelfgemaakte functies te koppelen aan bepaalde actie-haken (action hooks). Het wordt aanbevolen om de map met plugins meestal op een specifieke plek in het systeem op te slaan. /wp-content/plugins/your-plugin-name/ Naast de hoofdfile kunnen er ook andere bestanden worden opgenomen, zoals CSS-, JavaScript- en afbeeldingsbestanden.

Aanbevolen leesmateriaal De ultieme handleiding voor WordPress-thema's: van selectie, aanpassing tot ontwikkeling, een complete oplossing.

Hoe voeg je een beheermenu toe aan een plugin?

Om ervoor te zorgen dat het plugin een instellingenpagina heeft in het WordPress-administratiepaneel, moet je een beheermenu toevoegen aan het plugin. Dit gebeurt meestal door… admin_menu Dit wordt gerealiseerd met action-hooks.

UltaHost WordPress-hosting
30-daagse garantie voor het terugbetalen van het geld, onbeperkt bandbreedte- en databestand, gratis DDoS-beveiliging, en een prijsvoordeel van 50% bij een aankoop van 3 jaar.

Core functions add_menu_page Dit wordt gebruikt om een toppenmenu-item te toevoegen aan de achtergrondsbalk, samen met de corresponderende instellingenpagina.

function myplugin_add_admin_menu() {
    add_menu_page(
        '我的插件设置',      // 页面标题
        '我的插件',          // 菜单标题
        'manage_options',    // 所需权限
        'myplugin-settings', // 菜单slug
        'myplugin_settings_page', // 显示页面的回调函数
        'dashicons-admin-generic', // 图标(可选)
        6                    // 菜单位置(可选)
    );
}
add_action( 'admin_menu', 'myplugin_add_admin_menu' );

// 设置页面的HTML内容
function myplugin_settings_page() {
    ?&gt;
    <div class="wrap">
        <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
        <form action="/nl/options.php/" method="post" data-trp-original-action="options.php">
            <?php
            settings_fields( 'myplugin_options' ); // 输出安全字段
            do_settings_sections( 'myplugin-settings' ); // 输出设置区域
            submit_button(); // 输出提交按钮
            ?>
        <input type="hidden" name="trp-form-language" value="nl"/></form>
    </div>
    &lt;?php
}

Nadat je een menu hebt gecreëerd, is de volgende stap om de specifieke instelbare opties te definiëren met de WordPress-setting API.

De pluginconfiguratie wordt gespeeld op met behulp van de API voor instellingen.

Het handmatig verwerken van formulierinzendingen en het controleren van de veiligheid is tijdrovend en gevoelig voor fouten. De WordPress Settings API biedt een gestandaardiseerde manier om instellingen te registreren, weergeven en opslaan. Hiervoor worden voornamelijk drie functies gebruikt:register_setting, add_settings_sectionadd_settings_field

Het volgende voorbeeld toont hoe je een groep opties registreert en een tekstveld toevoegt.

Aanbevolen leesmateriaal Een handleiding voor het optimaliseren van de prestaties van WordPress-websites: een grondige analyse en praktische strategieën

function myplugin_settings_init() {
    // 注册一个新的设置项到数据库 `wp_options` 表中
    register_setting( 'myplugin_options', 'myplugin_settings' );

    // 在设置页面添加一个新的区域
    add_settings_section(
        'myplugin_section_basic', // 区域ID
        '基础设置',                // 区域标题
        'myplugin_section_callback', // 区域说明的回调函数
        'myplugin-settings'       // 对应的页面slug
    );

    // 在区域中添加一个字段
    add_settings_field(
        'myplugin_field_text',    // 字段ID
        '示例文本',                // 字段标题
        'myplugin_field_text_cb', // 字段HTML输出的回调函数
        'myplugin-settings',      // 页面slug
        'myplugin_section_basic'  // 区域ID
    );
}
add_action( 'admin_init', 'myplugin_settings_init' );

// 区域说明的回调函数
function myplugin_section_callback() {
    echo '<p>Dit is het gebied waar de basisinstellingen van de plugin worden gedaan.</p>';
}

// 文本字段的回调函数
function myplugin_field_text_cb() {
    // 从数据库中获取之前保存的设置值
    $options = get_option( 'myplugin_settings' );
    $value = $options['myplugin_field_text'] ?? ''; // 使用空合并运算符提供默认值
    // 输出HTML输入框
    echo '<input type="text" name="myplugin_settings[myplugin_field_text]" value="' . esc_attr( $value ) . '" class="regular-text">';
    echo '<p class="description">Voorzie me van enkele voorbeelden van tekst.</p>';
}

De instellingen die op deze manier zijn opgeslagen, kunnen worden gebruikt op iedere plek in het code van het plugin. get_option('myplugin_settings') Op veilige manier verkrijgen en gebruiken.

Security en beste praktijken in het ontwikkelen van plugins

Veiligheid is van het grootste belang bij het ontwikkelen van plugins. Een onveilige plugin kan een zwakke plek in het hele website worden. Het belangrijkste principe is: vertrouw nooit op de invoer van gebruikers. Alle gegevens van gebruikers of externe bronnen moeten worden gevalideerd, gereinigd of geëscapeseerd voordat ze in de database worden opgeslagen, het bestandsysteem worden gebruikt of op de pagina worden weergegeven.

Datavalidatie en -reiniging

Verificatie is het proces om te controleren of de ingevoerde gegevens overeenkomen met het verwachte formaat. Dit kan bijvoorbeeld betekenen of het een e-mailadres is, of dat het om cijfers gaat, of dat de waarden zich bevinden binnen een specifiek bereik. WordPress biedt een aantal hulpprogramma’s (functies) aan voor deze verificatie. is_email(), absint()‘Cleaning’ betekent dat, op basis van de verificatie, alle ongelegale of onveilige karakters uit de gegevens worden verwijderd. Voor tekstvelden kan dit worden gedaan met behulp van speciale tools of algoritmen. sanitize_text_field()

hosting.com gedeelde hosting
Hoge prestaties met AMD EPYC CPU's, NVMe SSD opslag en LiteSpeed, 24/7 deskundige interne ondersteuning, geavanceerde beveiligingsmaatregelen waaronder SSL, bescherming tegen brute kracht, malware en DDoS, besparingen tot 73%
// 在处理表单提交时
$user_input = $_POST['some_field'] ?? ''; // 使用空合并运算符避免未定义索引警告
// 清理输入
$clean_input = sanitize_text_field( $user_input );
// 验证是否是正整数
$clean_id = absint( $_POST['post_id'] );
if ( $clean_id <= 0 ) {
    // 处理无效ID的错误
}

De data is al geëscapeseerd voordat deze verstuurd werd.

Echtering is het proces om te zorgen dat gegevens veilig worden weergegeven in verschillende omgevingen, zoals HTML, JavaScript of URL's. Dit is van belang om XSS-aanvallen (Cross-Site Scripting) te voorkomen. WordPress biedt krachtige echteringfuncties aan:
* esc_html()`: Dit wordt gebruikt om HTML-content te ontsluiten, zodat de HTML-taggen erin niet worden verwerkt (geparsed).
* esc_attr()Deze eigenschap wordt gebruikt om de waarden van HTML-tags te ontsluiten (of te 'escape').
* esc_url():Dient voor het ontsluiten (escapen) van URL's.
* wp_kses_post()Het is mogelijk om een deel van het HTML veilig uit te geven door gebruik te maken van een gedefinieerd set regels.

// 在设置页面或前端输出用户数据时
echo '<div class="notice">'`. esc_html($clean_input)`.'</div>'echo '<input type="hidden" value="' . esc_attr( $clean_input ) . '">'echo '<a href="/nl/' . esc_url( $user_url ) . '/">link (op een website)</a>';
echo wp_kses_post( $allowed_html_content ); // 允许文章级别的HTML标签

Daarnaast moet men bij het verwerken van database-opvragen altijd de WordPress-databaseklasse gebruiken. $wpdb Methoden voor de voorverwerking, of het gebruik van meer geavanceerde API's zoals… WP_QueryZe zijn uitgerust met bescherming tegen SQL-injecties. Tijdens het uitvoeren van bestandsoperaties wordt deze bescherming gebruikt. wp_upload_dir()wp_handle_upload() Wacht op de API om de veiligheid van de paden te kunnen garanderen.

Het gebruik van hooks zorgt voor een hoge mate van uitbreidbaarheid.

Het kernpunt van het WordPress-plugin-systeem is het hook-mechanisme, dat bestaat uit “actions” (acties) en “filters” (filters). Hooks maken het mogelijk voor plugins om het gedrag of de data van WordPress te veranderen zonder de kerncode aan te passen, en ze bieden andere ontwikkelaars de mogelijkheid om je plugin uit te breiden.

Aanbevolen leesmateriaal WordPress-themaontwikkeling: Een gids om van nul je eerste custom-thema te bouwen

De toepassing en creatie van action hooks

Action hooks uitvoeren een stuk code op bepaalde tijdstippen en verwachten geen terugkeerwaarde. Plugins kunnen gebruikmaken van de vele ingebouwde hooks die WordPress biedt. init, wp_enqueue_scripts, save_postJe kunt ook je eigen hooks maken die andere ontwikkelaars kunnen gebruiken.

De code die is gemonteerd op de hook is als volgt:

InterServer gedeelde hosting
Shared hosting $2.50 USD per maand, eerste maand $0.1 USD promo code tryinterserver, 461 cloud apps scripts, een klik te installeren.
// 在文章内容前自动添加一个横幅
function myplugin_prepend_content( $content ) {
    if ( is_single() ) {
        $custom_text = '<div class="myplugin-banner">Dit is een advertentiebord.</div>';
        $content = $custom_text . $content;
    }
    return $content;
}
add_filter( 'the_content', 'myplugin_prepend_content' );

Let op: hoewel we de inhoud hebben gewijzigd, worden er filterhooks gebruikt. the_contentDit is omdat het vereist dat de gewijzigde waarde wordt teruggegeven.

Creëer een aangepaste actie-hook om te gebruiken do_action Function:

// 在你的插件代码中定义一个动作点
function myplugin_complete_task() {
    // ... 执行一些任务 ...
    // 发出自定义动作,允许其他代码在此处添加功能
    do_action( 'myplugin_after_task_complete', $task_id, $result );
}

Andere plugins of thema's kunnen worden toegevoegd via... add_action('myplugin_after_task_complete', 'callback', 10, 2) Reageer op deze actie.

De principes en voorbeelden van filterhooks

De filterhook wordt gebruikt om gegevens te bewerken voordat deze worden gebruikt. De hook accepteert een waarde en moet een nieuwe waarde teruggeven (die mogelijk is gewijzigd). Dit is een veel voorkomende manier voor plugins om tekst, opties of resultaten van een query te bewerken.

Gebruik de ingebouwde filters:

// 修改文章摘要的长度
function myplugin_excerpt_length( $length ) {
    return 20; // 将摘要字数限制改为20字
}
add_filter( 'excerpt_length', 'myplugin_excerpt_length' );

Creëer een aangepaste filterhook om te gebruiken apply_filters Function:

function myplugin_get_price( $product_id ) {
    $base_price = get_post_meta( $product_id, 'price', true );
    // 应用过滤器,允许其他代码动态修改价格(例如添加税费、折扣)
    $final_price = apply_filters( 'myplugin_product_price', $base_price, $product_id );
    return $final_price;
}

Op deze manier biedt je plugin een flexibele interface, zodat andere ontwikkelaars de logica voor de prijsberekening gemakkelijk kunnen aanpassen, zonder dat ze de broncode van je plugin hoeven te bewerken.

Internationalisatie van plugins en beheer van scriptbronnen

Een volwassen WordPress-plugin moet ondersteuning bieden voor internationalisatie, zodat het kan worden vertaald in verschillende talen, en moet de CSS- en JavaScript-bestanden voor de front- en back-end goed beheren.

Internationalisatie van plugins realiseren

Internationalisatie wordt gerealiseerd door alle tekststrings die moeten worden vertaald te omhullen met specifieke functies. Dit omvat twee belangrijke stappen: het laden van de vertaalfailen met behulp van tekstvelden, en het markeren van de te vertalen strings in de code.

Allereerst worden de definities in het hoofdbestand van het plugin gedefinieerd. Text Domain(zoals) my-first-pluginDit is je tekstvak. Vervolgens, wanneer het plugin wordt initialiseerd (meestal...) init Hook (of hook), gebruik load_plugin_textdomain Een functie om vertaalfailen te laden.

function myplugin_load_textdomain() {
    load_plugin_textdomain(
        'my-first-plugin', // 文本域,必须与文件头一致
        false, // 已弃用参数
        dirname( plugin_basename( __FILE__ ) ) . '/languages' // 语言文件存放的相对路径
    );
}
add_action( 'init', 'myplugin_load_textdomain' );

In de code wordt dit gebruikt: __() Vertaal en geef de volgende tekst terug, gebruikend: _e() Vertaal de volgende Chinese (vereenvoudigde) zin en voer de tekenreeks direct uit:

$settings_title = __( 'My Plugin Settings', 'my-first-plugin' );
_e( 'Hello World!', 'my-first-plugin' );

De ontwikkelaars kunnen dit gebruiken. Poedit Tools als deze halen deze strings uit de broncode en genereren vervolgens… .pot Templatefile. .po.mo De bestanden zijn opgeslagen in de plugin. /languages/ Catalogus.

Het juist introduceren van CSS en JavaScript.

Vergeet nooit om direct in een PHP-bestand geen waarden te hardcoderen. <link><script> Je kunt resources invoeren met tags. WordPress biedt een geconsolideerd systeem voor het opstellen van een wachtrij (enqueue), waarmee je afhankelijkheden tussen resources, versiebeheer en het juiste moment van laden kunt bepalen.

Voor achtergrondbronnen (backend resources) wordt gebruik gemaakt van... admin_enqueue_scripts Hook.

function myplugin_admin_scripts( $hook ) {
    // 只在特定插件设置页面加载
    if ( $hook != 'toplevel_page_myplugin-settings' ) {
        return;
    }
    wp_enqueue_style(
        'myplugin-admin-style', // 句柄
        plugins_url( 'css/admin-style.css', __FILE__ ), // 文件URL
        array(), // 依赖
        '1.0.0'  // 版本号,可用于强制浏览器更新缓存
    );
    wp_enqueue_script(
        'myplugin-admin-script',
        plugins_url( 'js/admin-script.js', __FILE__ ),
        array( 'jquery' ), // 依赖jQuery
        '1.0.0',
        true // 在页脚加载
    );
}
add_action( 'admin_enqueue_scripts', 'myplugin_admin_scripts' );

Met betrekking tot front-end-resources: wp_enqueue_scripts De logica is vergelijkbaar met die van een ‘hook’. Dit zorgt ervoor dat resources in een geordende volgorde worden geladen, conflicten worden vermeden en dat de browsercache kan worden gebruikt.

Samenvatting

Het ontwikkelen van WordPress-plug-ins is een systeematische procedure die begint met het maken van een hoofdbestand dat voldoet aan de standaarden. Hierbij worden onder andere de bouw van de backend-interface, het beheer van databeveiliging, het gebruik van kern-hooks (core hooks) en de ondersteuning voor internationaal gebruik (internationalization) meegerekend. Het naleven van beste praktijken, vooral strikte regels voor databeveiliging en een diepe kennis van het hook-systeem, is essentieel voor het ontwikkelen van stabiele, veilige en uitbreidbare commerciële plug-ins. Door het verstandig gebruiken van de instelling-API en management-scripts kunnen de professionaliteit van de plug-in en de gebruikerservaring worden verbeterd. Ontwikkelaars moeten altijd rekening houden met de mogelijkheid van vertalingen in hun code, zodat de plug-in op meer plekken kan worden gebruikt.

Veelgestelde vragen (FAQ)

Welke elementen moet een zeer eenvoudig WordPress-plugin bevatten?

Een van de simpelste plugins vereist maar één PHP-bestand, en dit bestand moet de standaard-pluginhead-commentaren bevatten. De belangrijkste commentaarregel is “Plugin Name”. In dit bestand kun je direct PHP-code schrijven of functies toevoegen via hooks.

Een plugin dat bijvoorbeeld alleen een kort stuk code bevat dat de uitdruk “Hello World” weergeeft, kan ook al met zo’n enkele bestand worden uitgevoerd.

Hoe kunnen plugins met de WordPress-database interacteren?

Het wordt aanbevolen om de in WordPress ingebouwde klassen voor databasebewerking te gebruiken. $wpdbHet biedt veilige methoden voor het opvragen van data, vooral... prepare Een methode die effectief kan voorkomen dat er SQL-injecties worden uitgevoerd.

For de meeste dataoperaties (zoals het ophalen van artikelen en het bewerken van metadata), is het aan te raden om de geavanceerde afsluitende functies van WordPress te gebruiken. get_posts(), WP_Query, get_post_meta(), update_post_meta() En zo: deze functies zorgen al op de onderliggende laag voor de beveiliging en het beheer van caches. Voor zelfgemaakte datastructuren kunnen ontwikkelaars op het moment dat een plugin wordt activeerd, een aangepaste datastructuur creëren.

Waar kan ik alle beschikbare acties en filter-haken vinden?

De officiële WordPress-developerdocumentatie is de beste plek om informatie over hooks te vinden. Daarnaast kunnen ontwikkelaars ook hooks opzoeken door rechtstreeks in de broncode van WordPress te kijken.

Open de wortelmap van WordPress in een code-editor en zoek… do_actionapply_filters Met de oproep van een functie kunnen alle gedefinieerde hooks en hun parameters worden gevonden. Veel online bronnen bieden ook een lijst met de meest gebruikelijke hooks aan.

Hoe debug ik de code van mijn WordPress-plugin?

Allereerst moet je zorgen dat… wp-config.php De debug-modus is in het bestand geactiveerd: define( 'WP_DEBUG', true );Dit zal het mogelijk maken om PHP-fouten en waarschuwingen te weergeven. Om te voorkomen dat bezoekers de fouten kunnen zien, kan dit ook op hetzelfde moment worden ingesteld. define( 'WP_DEBUG_DISPLAY', false ); En registreer de fouten in een logbestand:define( 'WP_DEBUG_LOG', true );

Ten tweede, gebruik je error_log() De functie registreert aangepaste debug-informatie in een logbestand. Voor complexe datastructuren (zoals arrays en objecten) kan dit worden gecombineerd met… print_r()var_dump() De inhoud wordt weergegeven, maar alleen wanneer de beheerder is ingelogd, om te voorkomen dat informatie wordt gelekt. Het gebruik van professionele PHP-foutopsporingstools zoals Xdebug maakt het mogelijk om effectiever te stoppen bij fouten (‘breakpoints’) en de uitvoer van het programma te volgen (‘stack tracing’).