Разработка плагинов WordPress от новичка до мастера: пошаговое руководство по созданию вашего первого пользовательского плагина

3-минутное чтение
2026-03-13
2026-06-04
2,364
Я получаю комиссионные, когда вы совершаете покупки по ссылкам ниже, без дополнительных затрат для вас.

为什么学习 WordPress 插件开发

WordPress 之所以成为全球最受欢迎的内容管理系统,其强大的可扩展性功不可没。这种可扩展性的核心正是插件。通过开发自定义插件,你可以为网站添加任何你想象得到的功能,而无需修改 WordPress 核心代码。这不仅保证了核心更新的安全性,也让你的功能模块化,易于管理和迁移。

学习插件开发能够让你从 WordPress 的“使用者”转变为“创造者”。无论是为客户定制独特的功能,解决特定业务需求,还是将你的创意打包成产品在市场上销售,掌握这项技能都为你打开了无限可能。更重要的是,理解插件开发的工作流程,能让你在使用其他插件时,具备更好的调试和二次开发能力。

一个标准的 WordPress 插件在结构上是一个包含主 PHP 文件的文件夹。这个主文件通过特定的注释头部信息,向 WordPress 系统宣告自己的存在。所有业务逻辑,无论是添加一个新的小工具、创建一个自定义文章类型,还是处理表单数据,都通过 WordPress 提供的各种“钩子”来挂载和执行。

Рекомендуемое чтение Разработка плагинов WordPress от новичка до мастера: пошагово научим вас создавать собственные уникальные функции

搭建你的第一个插件项目

开始开发前,你需要一个本地开发环境。我们推荐使用 XAMPP、MAMP、Local by Flywheel 或 Docker 等工具来搭建一个包含 PHP、MySQL 和 Apache/Nginx 的本地服务器。在本机 WordPress 安装上进行开发,可以避免对线上网站造成影响。

Ультахост (UltaHost) – хостинг-провайдер, предоставляющий услуги хостинга для сайтов, построенных на платформе WordPress.
Гарантия возврата средств в течение 30 дней, неограниченная пропускная способность интернет-канала и объем баз данных, бесплатная защита от DDoS-атак. При покупке на срок 3 лет предоставляется скидка в размере 501 ТБ до 4 ТБ.

创建插件的基本文件结构

一个最简单的插件可以只包含一个文件。在你的 WordPress 安装目录下,进入 wp-content/plugins Создайте новую папку, например, назовите её «New Folder». my-first-plugin。然后,在此文件夹内创建一个主 PHP 文件,文件名通常与文件夹名一致,即 my-first-plugin.php

编写插件的元信息头部

在插件主文件中,文件顶部的注释块至关重要。它告诉 WordPress 这个插件的名称、描述、版本、作者等信息。一个标准的头部如下所示:

<?php
/**
 * Plugin Name:       我的第一个插件
 * Plugin URI:        https://example.com/my-first-plugin
 * Description:       这是一个用于学习 WordPress 插件开发的自定义插件。
 * Version:           1.0.0
 * Author:            你的名字
 * License:           GPL v2 or later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain:       my-first-plugin
 * Domain Path:       /languages
 */

保存文件后,登录你的 WordPress 后台,进入“插件”页面,你应该能看到“我的第一个插件”出现在插件列表中,并可以激活它。至此,一个“空”但有效的插件就创建完成了。它目前没有任何功能,但结构是正确的。

探索 WordPress 核心机制:钩子与过滤器

WordPress 插件开发的核心在于理解并运用其“钩子”系统。钩子分为两种:动作钩子和过滤器钩子。它们是 WordPress 允许你在特定时间点“注入”自定义代码或修改数据的机制。

Рекомендуемое чтение Руководство по разработке плагинов для WordPress: создание вашего первого функционального расширения с нуля.

理解动作钩子的运作方式

动作钩子允许你在 WordPress 执行流程的特定时刻运行你的函数。例如,当页面加载完毕时,或当一篇文章发布时。使用 add_action() 函数可以将你的自定义函数挂载到一个钩子上。其基本语法是:add_action( ‘hook_name’, ‘your_function_name’ );

让我们实现一个功能:在网站前台的页面底部显示一条自定义信息。我们会用到 wp_footer Этот хук для выполнения определенных действий.

function my_custom_footer_message() {
    echo '<p style="text-align: center; color: #666;">感谢您访问本站!这是一个自定义插件添加的页脚信息。</p>';
}
add_action( 'wp_footer’, 'my_custom_footer_message’ );

将这段代码添加到你的插件主文件 my-first-plugin.php 中,保存并刷新网站前台页面,你会在页脚看到这行文字。

hosting.com Общий хостинг
Высокая производительность благодаря процессорам AMD EPYC, SSD-накопителям NVMe и LiteSpeed, круглосуточная экспертная поддержка, передовые меры безопасности, включая SSL, защиту от грубой силы, вредоносных программ и DDoS, экономия до 73%

运用过滤器修改默认内容

过滤器钩子用于修改 WordPress 在处理过程中产生的数据。与动作钩子不同,过滤器函数必须返回一个值。使用 add_filter() 函数来挂载过滤器。例如,修改文章标题的默认内容:

function modify_post_title( $title ) {
    if ( is_single() ) {
        return '【精选】’ . $title;
    }
    return $title;
}
add_filter( ‘the_title’, 'modify_post_title’ );

这个函数会在文章单页的标题前加上“【精选】”前缀,而其他页面(如首页、列表页)的标题则保持不变。通过组合使用动作和过滤器,你可以控制 WordPress 的几乎每一个环节。

构建一个实用的后台管理页面

为了让插件用户能够配置选项,我们通常需要为其创建一个后台管理页面。这涉及 WordPress 的管理菜单 API。

Рекомендуемое чтение Разработка плагинов WordPress с нуля до профессионального уровня: полное руководство по созданию высоконастраиваемых функциональных модулей

添加一个新的管理菜单项

пользоваться add_menu_page() или add_options_page() 等函数,可以将一个新的页面添加到 WordPress 后台的左侧菜单中。我们以在“设置”子菜单下添加一个页面为例。

首先,创建一个函数来渲染管理页面的 HTML 内容。

Общий хостинг InterServer
Общий хостинг $2.50 USD в месяц, первый месяц $0.1 USD промо-код tryinterserver, 461 скрипт облачных приложений, установка в один клик.
function my_plugin_settings_page_html() {
    // 检查用户权限
    if ( ! current_user_can( ‘manage_options’ ) ) {
        return;
    }
    ?&gt;
    <div class="wrap">
        <h1></h1>
        <form action="/ru/options.php/" method="post" data-trp-original-action="options.php">
            <?php
            // 输出设置字段和安全字段
            settings_fields( ‘my_plugin_settings’ );
            do_settings_sections( ‘my_plugin_settings’ );
            submit_button( ‘保存设置’ );
            ?>
        <input type="hidden" name="trp-form-language" value="ru"/></form>
    </div>
    &lt;?php
}

注册设置、区块和字段

WordPress предоставляет register_setting(), add_settings_section() и add_settings_field() 这一套 API 来规范化地处理设置。这能自动处理安全验证(Nonce)和选项的保存/读取。

接下来,我们需要一个函数来初始化这些设置。这个函数应该挂载到 admin_init На крючке.

function my_plugin_settings_init() {
    // 注册一个新的设置选项组
    register_setting( ‘my_plugin_settings’, ‘my_plugin_options’ );

// 在页面中添加一个新的区块
    add_settings_section(
        ‘my_plugin_section_1’,
        ‘基础设置’,
        null, // 回调函数,用于输出区块描述,可为空
        ‘my_plugin_settings’
    );

// 在区块内添加一个字段
    add_settings_field(
        ‘my_plugin_field_text’,
        ‘欢迎语’,
        ‘my_plugin_field_text_cb’,
        ‘my_plugin_settings’,
        ‘my_plugin_section_1’,
        [
            ‘label_for’ =&gt; ‘my_plugin_field_text’,
            ‘class’ =&gt; ‘my_plugin_row’,
        ]
    );
}
add_action( ‘admin_init’, ‘my_plugin_settings_init’ );

// 字段的回调函数,用于输出字段的 HTML
function my_plugin_field_text_cb( $args ) {
    $options = get_option( ‘my_plugin_options’ );
    ?&gt;
    <input type="text" id="<?php echo esc_attr( $args[‘label_for’] ); ?>"
           name="my_plugin_options[<?php echo esc_attr( $args[‘label_for’] ); ?>]"
           value="<?php echo esc_attr( $options[ $args[‘label_for’] ] ?? ‘’ ); ?>">
    <p class="“description”">这段文字将显示在网站首页。</p>
    &lt;?php
}

将页面链接添加到菜单

В конце концов, используйте… add_options_page() 将我们创建的这个页面添加到“设置”菜单下。

function my_plugin_add_settings_page() {
    add_options_page(
        ‘我的插件设置’, // 页面标题
        ‘我的插件’, // 菜单标题
        ‘manage_options’, // 所需能力
        ‘my-plugin-settings’, // 菜单别名
        ‘my_plugin_settings_page_html’ // 渲染页面的回调函数
    );
}
add_action( ‘admin_menu’, ‘my_plugin_add_settings_page’ );

现在,激活插件后,你可以在 WordPress 后台的“设置”菜单下找到“我的插件”选项,点击进入即可看到一个包含一个文本字段的设置页面,你可以输入并保存欢迎语。之后,你可以通过 get_option( ‘my_plugin_options’ ) 在前台获取并使用这个值。

实现插件的前台功能与安全考虑

在插件中实现前台功能时,安全是首要考虑因素。永远不要相信用户输入的数据,必须进行验证、清理和转义。

假设我们要使用在后台设置中保存的“欢迎语”,并将其显示在网站首页的顶部。首先,我们需要从数据库获取这个选项,然后安全地输出。

function display_frontend_greeting() {
    // 1. 获取数据
    $options = get_option( ‘my_plugin_options’ );
    $greeting = $options[‘my_plugin_field_text’] ?? ‘’;

// 2. 如果内容为空,则不输出任何东西
    if ( empty( $greeting ) ) {
        return;
    }

// 3. 在输出前进行清理和转义
    $safe_greeting = esc_html( $greeting );

// 4. 输出到前端(这里假设只在首页显示)
    if ( is_front_page() ) {
        echo ‘<div class="“my-plugin-greeting”"><p>’ . $safe_greeting . ‘</p></div>’;
    }
}
add_action( ‘wp_body_open’, ‘display_frontend_greeting’ );

这里我们用了 esc_html() 函数来转义 HTML 字符,防止跨站脚本攻击(XSS)。我们还检查了数据是否为空,并使用条件标签 is_front_page() 来控制输出的位置。将函数挂载到 wp_body_open 钩子,可以确保内容在页面 body 标签开始后立即显示。

此外,在插件开发中,国际化也是一项重要实践。通过使用 __() и _e() 等翻译函数,并正确设置插件的文本域(Text Domain),可以让你的插件被翻译成任何语言。在前面的插件头部元信息中,我们已经定义了 Text Domain: my-first-plugin。在代码中,应该这样使用:

echo esc_html__( ‘Hello, World!’, ‘my-first-plugin’ );

резюме

通过本文的实践,我们完成了一个完整但简单的 WordPress 插件开发流程。我们从创建插件的基础文件结构和元信息开始,逐步深入到 WordPress 的核心机制——钩子系统,利用动作和过滤器来控制程序流和修改数据。随后,我们构建了一个带有自定义字段的后台管理页面,让用户可以配置插件选项,并最终将这些选项安全地输出到网站前台。

这个过程涵盖了插件开发的几个关键方面:文件组织、钩子运用、后台界面创建、选项管理以及前端数据安全处理。记住,优秀的插件不仅功能强大,更应该是安全、高效且易于维护的。接下来,你可以尝试为插件添加更多功能,比如自定义文章类型、短代码、小工具或者 REST API 端点,不断深化你对 WordPress 插件开发的理解。

Часто задаваемые вопросы

一个插件可以只包含一个 PHP 文件吗?

是的,一个最简单的 WordPress 插件可以只由一个 PHP 文件构成,只要该文件包含正确的插件头部注释。但对于功能复杂的插件,建议将代码组织在不同的文件中,例如将后台功能、前台功能和公共函数分别存放,以提高代码的可读性和可维护性。

如何调试自己开发的插件?

推荐开启 WordPress 的调试模式。在站点根目录的 wp-config.php В документе будет указано, что... WP_DEBUG Константа установлена на true。这样,PHP 错误、警告和通知都会显示出来。同时,可以结合使用 error_log() 函数将调试信息写入服务器的错误日志,或者使用浏览器开发者工具的控制台进行 JavaScript 调试。

开发插件时,有哪些必须遵守的安全规范?

首要原则是:永远不要信任任何用户输入。对所有从 $_GET$_POST$_COOKIE 获取的数据进行验证和清理。在将数据输出到 HTML 时,使用 esc_html()esc_attr()esc_url() 等函数进行转义。在构造数据库查询时,务必使用 $wpdb->prepare() 方法来防止 SQL 注入攻击。此外,检查当前用户的权限(如 current_user_can())也是必不可少的步骤。

如何将我的插件提交到官方的 WordPress 插件目录?

首先,确保你的插件完全遵循 WordPress 的编码标准和 GPL 许可证。你需要访问 WordPress.org 并创建一个账号,然后在插件提交页面提交你的插件压缩包。官方团队会进行人工审核,检查代码质量、安全性、文档和合规性。审核通过后,你的插件就会被列入官方目录,获得自动更新支持,并可以被全球用户搜索和安装。