Подробное и понятное руководство по разработке плагинов для WordPress: с нуля создайте свой первый пользовательский плагин

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

Основы плагинов для WordPress и среда разработки

Прежде чем приступать к написанию кода, крайне важно понять основные концепции WordPress-плагинов и настроить подходящую среду для разработки. WordPress-плагин по сути представляет собой папку, содержащую код на языке PHP, который используется для расширения функционала базовой версии WordPress с помощью обширного API, предоставляемого этим фреймворком. Плагины могут быть как очень простыми (например, включающими всего лишь несколько строк кода), так и сложными (например, представляющими собой полноценные системы управления). Основной принцип их разработки заключается в том, чтобы не изменять исходный код базовой версии WordPress; это позволяет сохранить ваши пользовательские настройки при обновлениях этого фреймворка.

Для эффективного разработческого процесса вам понадобится локальная среда разработки. Для этого можно использовать такие инструменты, как XAMPP, MAMP, Local by Flywheel или Docker, чтобы быстро настроить сервер с поддержкой PHP и MySQL. Затем установите последнюю версию WordPress. Во время разработки рекомендуется…wp-config.phpФункция включена в файл.WP_DEBUGЭто сделано для своевременного выявления ошибок.

“Сердцем” плагина является основной PHP-файл. Комментарии в начале этого файла служат его идентификатором; WordPress использует эти метаданные для распознавания и управления плагином в фоновом режиме. Пример стандартных комментариев в начале основного файла плагина приведен ниже:

Рекомендуемое чтение Что такое темы WordPress

<?php
/**
 * Plugin Name: 我的第一个自定义插件
 * Plugin URI:  https://example.com/my-first-plugin
 * Description: 这是一个用于学习插件开发的简单插件,它将在文章末尾添加自定义内容。
 * Version:     1.0.0
 * Author:      开发者名称
 * License:     GPL v2 or later
 * Text Domain: my-first-plugin
 */

Создайте свой первый функциональный плагин.

Давайте начнем с конкретной функции: автоматическое добавление пользовательского текста в конце каждой статьи на сайте. Этот пример будет использоваться на протяжении всего процесса разработки плагина.

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

Основной файл плагина и процесс его инициализации

Во-первых, в WordPress…wp-content/pluginsСоздайте новую папку в каталоге, например,my-first-pluginВ этой папке создайте основной PHP-файл; его можно назвать, например, `main.php`.my-first-plugin.phpКопируйте приведенный выше код разметки в нужное место.

Далее нам нужен безопасный способ выполнения кода инициализации плагина. Лучшей практикой является объединение всех функций в один класс или использование функций в пространствах имен. В этом случае мы будем использовать простой класс для организации кода. После комментариев в заголовочной части основного файла добавьте следующее определение класса:

if ( ! defined( 'ABSPATH' ) ) {
	exit; // 防止直接访问文件
}

class My_First_Plugin {
    public function __construct() {
        // 构造函数,在这里挂载钩子
    }
}

// 初始化插件
new My_First_Plugin();

if ( ! defined( ‘ABSPATH’ ) )Этот код соответствует стандартам безопасности при разработке плагинов для WordPress и предназначен для предотвращения прямого доступа пользователей к файлам вашего плагина по URL-адресу.

Используйте хаки (специальные механизмы) для добавления содержимого в футер статьи.

Архитектура плагинов WordPress основана на системе “хуков” (Hooks), которая делится на действия (Actions) и фильтры (Filters). Действия позволяют выполнять код в определенные моменты времени, в то время как фильтры позволяют изменять данные.

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

Наша цель — добавлять текст после содержания статей. Это процесс “фильтрации” данных. Поэтому мы будем использовать…the_contentИзмените конструктор и методы в классе следующим образом:

class My_First_Plugin {
    public function __construct() {
        // 将自定义方法挂载到‘the_content’过滤器上
        add_filter( 'the_content', array( $this, 'add_footer_to_content' ) );
    }

/**
     * 在文章内容后添加自定义页脚
     *
     * @param string $content 原始文章内容。
     * @return string 修改后的文章内容。
     */
    public function add_footer_to_content( $content ) {
        // 确保只在主循环的单篇文章页面显示
        if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
            $custom_footer = '<div class="my-plugin-footer"><p>Спасибо за прочтение этой статьи! Она была создана с использованием инструмента 【Мой первый плагин】.</p></div>';
            $content .= $custom_footer;
        }
        return $content;
    }
}

add_filter()Функция использует методы класса.add_footer_to_contentЗарегистрироваться наthe_contentФильтры: Когда WordPress готовит к выводу содержимое статей, он вызывает наш метод и передает нам исходный текст статьи. Мы используем условные проверки, чтобы добавлять футер только на странице конкретной статьи, избегая его повторного отображения на главной странице или странице архива. В конце мы добавляем пользовательский HTML-код в конец содержимого статьи и возвращает результат обработки.

Добавить в плагин опции для работы с интерфейсом администрирования.

Зрелый плагин обычно позволяет пользователям настраивать его параметры в режиме администрирования. Мы добавим простой параметр настройки для текста, отображаемого в нижней части страницы (футере), чтобы пользователи могли самостоятельно изменять содержимое этого текста.

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

Создать страницу меню настроек

Нам необходимо добавить подстраницу в меню “Настройки” в панели управления WordPress. Для этого потребуется использовать соответствующие инструменты или функции, предоставляемые системой.add_options_page()Функция, как правило, монтируется (то есть привязывается к определённому объекту или системному компоненту)…admin_menuДействие запущено через соответствующий «хук» (hook).

Во-первых, необходимо добавить новый метод в класс плагинов для регистрации меню и страниц:

class My_First_Plugin {
    // ... 之前的构造函数和方法 ...

public function __construct() {
        add_filter( 'the_content', array( $this, 'add_footer_to_content' ) );
        // 挂载后台管理菜单
        add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );
        // 挂载初始化设置选项
        add_action( 'admin_init', array( $this, 'settings_init' ) );
    }

public function add_admin_menu() {
        add_options_page(
            '我的第一个插件设置', // 页面标题
            '自定义页脚设置',     // 菜单标题
            'manage_options',     // 所需权限
            'my-first-plugin',    // 菜单slug
            array( $this, 'options_page_html' ) // 回调函数,用于输出页面HTML
        );
    }
}

Поля регистрационных настроек и страница отображения (rendering page)

Далее нам необходимо использовать API настроек WordPress для безопасной регистрации, сохранения и проверки параметров. Это подразумевает…register_setting(), add_settings_section()иadd_settings_field()Такие функции…

Рекомендуемое чтение Что такое WooCommerce? Подробное описание его основных функций и сценариев использования

public function settings_init() {
    // 注册一个设置选项组
    register_setting( 'my_first_plugin_settings', 'my_first_plugin_options' );

// 在页面中添加一个设置区域
    add_settings_section(
        'my_first_plugin_section',
        '页脚内容配置',
        array( $this, 'section_callback' ),
        'my-first-plugin'
    );

// 向该区域添加一个字段
    add_settings_field(
        'footer_text',
        '页脚显示文本',
        array( $this, 'footer_text_field_render' ),
        'my-first-plugin',
        'my_first_plugin_section'
    );
}

public function section_callback() {
    echo '<p>Здесь вы можете настроить текст, который будет отображаться в конце статьи.</p>';
}

public function footer_text_field_render() {
    $options = get_option( 'my_first_plugin_options' );
    $value = $options['footer_text'] ?? '感谢阅读本文!由【我的第一个插件】生成。'; // 默认值
    ?&gt;
    <input type='text' name='my_first_plugin_options[footer_text]' value='<?php echo esc_attr( $value ); ?>' style='width: 400px;'>
    <p class="description">Поддерживаются простые HTML-теги, такие как… <strong>, <em>, <a>。</p>
    <?php
}

public function options_page_html() {
    // 检查用户权限
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    ?>
    <div class="wrap">
        <h1></h1>
        <form action='/ru/options.php/' method='post' data-trp-original-action="options.php">
            <?php
            settings_fields( 'my_first_plugin_settings' );
            do_settings_sections( 'my-first-plugin' );
            submit_button();
            ?>
        <input type="hidden" name="trp-form-language" value="ru"/></form>
    </div>
    &lt;?php
}

Наконец, необходимо изменить функцию вывода на стороне клиента (фронтенда).add_footer_to_contentНеобходимо сделать так, чтобы текст считывался из базы данных по соответствующему параметру (опции).

public function add_footer_to_content( $content ) {
    if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
        $options = get_option( 'my_first_plugin_options' );
        $footer_text = $options['footer_text'] ?? '感谢阅读本文!由【我的第一个插件】生成。';
        $custom_footer = '<div class="my-plugin-footer"><p>'. wp_kses_post($Footer_text)'.'</p></div>';
        $content .= $custom_footer;
    }
    return $content;
}

wp_kses_post()Функция обеспечивает, что в введённом пользователем тексте могут присутствовать только безопасные HTML-теги – это важная мера безопасности.

Общий хостинг InterServer
Общий хостинг $2.50 USD в месяц, первый месяц $0.1 USD промо-код tryinterserver, 461 скрипт облачных приложений, установка в один клик.

Интернационализация плагинов и рекомендуемые практики

Для того чтобы плагины могли использоваться пользователями по всему миру, интернационализация (i18n) является неотъемлемым шагом. WordPress использует фреймворк GNU gettext для обработки переводов.

Текстовое поле и функция перевода

Во-первых, убедитесь, что в комментариях, расположенных в начале вашего плагина, все необходимые параметры определены.Text DomainНапримерmy-first-pluginЗатем во всех местах в плагине, где требуется перевод строк, используйте соответствующие функции для их обработки.

Измените наш предыдущий код, чтобы добавить поддержку перевода выводимого текста.

// 在构造函数中加载翻译文件
public function __construct() {
    // ... 其他钩子 ...
    add_action( 'plugins_loaded', array( $this, 'load_textdomain' ) );
}

public function load_textdomain() {
    load_plugin_textdomain(
        'my-first-plugin',
        false,
        dirname( plugin_basename( __FILE__ ) ) . '/languages/'
    );
}

// 修改设置页面的字符串
public function section_callback() {
    echo '<p>' . esc_html__( '在这里配置显示在文章末尾的文本内容。', 'my-first-plugin' ) . '</p>';
}

public function footer_text_field_render() {
    $options = get_option( 'my_first_plugin_options' );
    $value = $options['footer_text'] ?? __( '感谢阅读本文!由【我的第一个插件】生成。', 'my-first-plugin' );
    ?&gt;
    <input type='text' name='my_first_plugin_options[footer_text]' value='<?php echo esc_attr( $value ); ?>' style='width: 400px;'>
    <p class="description">&lt;?php esc_html_e( &#039;支持简单的HTML标签,如 <strong>, <em>, <a>。', 'my-first-plugin' ); ?&gt;</p>
    &lt;?php
}

// 注意:用户在前台输入的“页脚文本”本身通常不需要翻译,因为它是由管理员设置的具体内容。

__()Для перевода и возврата строкы…esc_html__()Используется для перевода и экранирования HTML-кода с обеспечением его корректного отображения в пользовательском интерфейсе._e()Функция предназначена для перевода строк и их немедленного отображения. Второй параметр функции представляет собой текстовое поле, которое должно соответствовать параметру, определенному в плагине.

Безопасность, производительность и организация кода

Помимо интернационализации, необходимо соблюдать следующие рекомендации по поведению разработчиков:
1. Безопасность: Проверяйте, очищайте и экранируйте все данные, вводимые пользователями. Используйте соответствующие механизмы для обеспечения безопасности.sanitize_text_field(), esc_html(), wp_kses_post()Используйте такие функции, как…wp_nonce_field()Защита от атак типа CSRF (Cross-Site Request Forgery).
2. Производительность: Рационально используйте хаки (специальные механизмы для обработки данных), чтобы избежать выполнения ненужных запросов к базе данных при каждом загрузке страницы. Можно рассмотреть возможность временного кэширования полученных результатов.
3. Организация кода: Для сложных плагинов файлы следует разделить на модули в зависимости от их функциональности. Основной файл должен обеспечивать их запуск, а классы и методы должны быть размещены в соответствующих местах.includes/Каталог; фронтенд-ресурсы (CSS, JS) размещены здесь.assets/Каталог.
4. Деинсталляция и очистка: Если ваш плагин создавал таблицы в базе данных или настраиваемые параметры, должна быть предусмотрена функция деинсталляции для удаления этих данных. Эту функцию можно реализовать в виде отдельного элемента интерфейса пользователя.uninstall.phpДля реализации этого необходимо использовать файлы.

резюме

В ходе этого учебного курса мы полностью прошли весь процесс разработки пользовательского плагина для WordPress с базовыми функциями: от настройки среды разработки, создания структуры плагина, добавления новых функций с использованием системы хуков (hooks), до реализации страницы настроек в backend-части сайта, а также рассмотрели вопросы интернационализации и обеспечения безопасности. Вы узнали, как правильно использовать все эти инструменты и подходы при разработке плагинов.add_filterиadd_actionВзаимодействие с ядром WordPress: как использовать API Settings для создания надежных страниц настроек, а также как…load_plugin_textdomainНеобходимо сделать так, чтобы плагин поддерживал несколько языков. Помните: при разработке плагинов безопасность, сопоставимость с будущими обновлениями системы и качество пользовательского опыта являются главными приоритетами. Исходя из этих принципов, вы сможете разрабатывать дополнительные функции — такие как пользовательские типы статей, метаданные, шорткоды, REST-API-эндпоинты и т. д., чтобы создать более мощные расширения для WordPress.

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

Почему мой плагин не отображается в меню панели управления?

Обычно это происходит из-за проблем с правами доступа или ошибок в коде. Во-первых, убедитесь, что у вас есть необходимые права для выполнения данной операции.add_options_pageилиadd_menu_pageПараметры прав доступа, указанные в функции (например…)‘manage_options’Это значение соответствует роли пользователя, под которым вы в настоящее время вошли в систему. Во-вторых, необходимо проверить…admin_menuБыл ли хук правильно подключен, и не содержит ли функция-обратный вызов синтаксических ошибок, которые могли бы привести к прерыванию выполнения PHP-кода? Самый простой способ — это включить эту функцию в настройки WordPress из панели администрирования.WP_DEBUGПроверьте, есть ли соответствующие сообщения об ошибках.

Как добавить пользовательские файлы CSS и JavaScript для плагина?

Правильный подход заключается в использовании…wp_enqueue_style()иwp_enqueue_script()Функции. Что касается ресурсов фронтенда, их следует разместить (монтировать) в определенные места системы.wp_enqueue_scriptsНа крючке действия; для управления ресурсами административной панели они привязываются к ней.admin_enqueue_scriptsНа крючке.

В вашем классе плагина можно добавить следующий метод:

public function enqueue_frontend_assets() {
    wp_enqueue_style( ‘my-plugin-style’, plugin_dir_url( __FILE__ ) . ‘assets/css/style.css’, array(), ‘1.0.0’ );
}

Затем в конструкторе это делается следующим образом:add_action( ‘wp_enqueue_scripts’, array( $this, ‘enqueue_frontend_assets’ ) );Зарегистрируйтесь. Это позволит обеспечить правильное управление зависимостями и предотвратит конфликты с другими плагинами или темами.

Как очистить данные, которые я создал, когда пользователь удаляет плагин?

WordPress предлагает два основных способа реализации данной функции. Первый заключается в регистрации специального “хака” (hook) для процесса деинсталляции плагина, однако этот метод редко используется в объектно-ориентированных плагинах. Более рекомендуемым и стандартным способом является создание отдельного скрипта или класса, который будет отвечuninstall.phpЭто файл, который находится на том же уровне, что и ваш основной плагин.

Когда пользователь удаляет плагин через веб-интерфейс WordPress, система автоматически проверяет и выполняет содержимое этого файла.uninstall.phpВ этом случае вам сначала необходимо провести проверку.WP_UNINSTALL_PLUGINБудут ли константы сначала определены, а затем все данные, созданные плагином (включая параметры, пользовательские таблицы базы данных и т. д.), безопасно удалены?

if ( ! defined( ‘WP_UNINSTALL_PLUGIN’ ) ) {
    exit;
}
delete_option( ‘my_first_plugin_options’ );
// 如果有自定义表:$wpdb->query( “DROP TABLE IF EXISTS {$wpdb->prefix}my_table” );

Как мой плагин может быть совместим с более старыми версиями WordPress?

Ключ к соблюдению совместимости заключается в осторожном использовании функций и новых возможностей новых версий, а также в предоставлении альтернатив для старых версий программного обеспечения. Перед вызовом функций, которые могут быть доступны только в новых версиях, необходимо убедиться, что ваш код сможет корректно работать с ними.function_exists()Проведите проверку. Например, если вы собираетесь использовать функции, введенные в версии 5.0…wp_dateФункции могут выполнять следующие действия:

if ( function_exists( ‘wp_date’ ) ) {
    $date = wp_date( get_option( ‘date_format’ ), $timestamp );
} else {
    $date = date_i18n( get_option( ‘date_format’ ), $timestamp );
}

Кроме того, в комментариях, расположенных в начале плагина, а также в файле readme должна быть четко указана минимальная версия WordPress, с которой плагин был тестирован. Регулярное тестирование на более старых версиях WordPress является лучшим способом обеспечения совместимости.