WordPress предоставляет мощный API для разработки плагинов, позволяющий расширять функциональность сайта без изменения ядра. Чтобы создать базовый плагин, достаточно одного PHP-файла, размещённого в каталоге /wp-content/plugins/. В этом файле должна присутствовать специальная шапка с метаданными, включая Plugin Name, Description, Version, Author.
Минимальный рабочий пример плагина выглядит так:
<?php
/*
Plugin Name: Custom Example Plugin
Description: Простой плагин для демонстрации структуры
Version: 1.0
Author: Your Name
*/
После активации плагин будет отображаться в админ-панели, даже если он пока не выполняет действий. Чтобы добавить функциональность, необходимо использовать хуки WordPress: add_action и add_filter. Например, с помощью add_action(‘init’, ‘my_plugin_init’) можно выполнить код при инициализации системы.
При работе с плагинами важно соблюдать нейминг, избегая конфликтов с другими модулями. Используйте префиксы для функций, например: myplugin_register_post_type(). Это предотвратит ошибки при активации и повысит совместимость с другими компонентами.
Хорошей практикой является размещение функционала в отдельных классах и использование автозагрузки через spl_autoload_register или Composer. Это упрощает масштабирование и поддержку кода. Также рекомендуется изолировать административную и пользовательскую части через условные конструкции is_admin() и !is_admin().
Структура файлов и папок для плагина WordPress
Минимальная структура плагина включает один основной PHP-файл с заголовком плагина. Однако для масштабируемости и удобства разработки рекомендуется использовать следующую организацию:
- /my-plugin/ – корневая папка плагина. Название должно быть уникальным, без пробелов, в нижнем регистре.
- my-plugin.php – основной файл плагина. Содержит шапку с метаданными и точку входа.
- /includes/ – вспомогательные PHP-файлы: функции, классы, хуки.
- /admin/ – логика панели администратора: настройки, страницы, стили и скрипты для бэкенда.
- /assets/ – изображения, иконки, шрифты, неисполняемые ресурсы.
- /languages/ – .pot, .po и .mo файлы для локализации.
- uninstall.php – скрипт удаления плагина, вызывается при его удалении через интерфейс WordPress.
- readme.txt – документация для каталога WordPress.org (если планируется публикация).
Файл my-plugin.php подключает остальные модули с помощью require_once
или spl_autoload_register
. Логику разделяй по ответственности: инициализация – в основном файле, реализация – в подкаталогах. Не смешивай код администратора и фронтенда в одном месте.
Каждому скрипту и стилю присваивай уникальный handle, используемый в wp_enqueue_script()
и wp_enqueue_style()
. Для безопасности обрабатывай входные данные через sanitize_*
и проверяй nonce при отправке форм.
Регистрация плагина в системе и добавление описания
Чтобы WordPress распознал плагин, необходимо создать главный PHP-файл и поместить его в папку с уникальным названием в директории /wp-content/plugins/
. Имя файла должно совпадать с логикой названия плагина, например: my-custom-plugin.php
.
В начале файла размещается блок с метаданными. Он строго обязателен для регистрации плагина:
Plugin Name – название, отображаемое в панели администратора. Plugin URI ведёт на страницу плагина, где можно разместить документацию или обновления. Description появляется в списке установленных плагинов, кратко объясняя назначение. Поля Version и Author информируют о текущей версии и создателе.
Text Domain обязателен для интернационализации. Он должен совпадать с названием директории плагина и использоваться в функциях __()
и _e()
для перевода строк.
После сохранения файла и размещения его в нужной директории, плагин автоматически появится в списке доступных в административной панели WordPress. Чтобы активировать его, достаточно нажать «Активировать» в интерфейсе.
Подключение скриптов и стилей через enqueue
Для правильного подключения ресурсов в WordPress используется функция wp_enqueue_script()
и wp_enqueue_style()
, которые регистрируются через хук wp_enqueue_scripts
для фронтенда и admin_enqueue_scripts
для административной панели.
Подключение JavaScript и CSS в плагине должно происходить внутри функции, которая предварительно проверяет контекст. Пример подключения скриптов только на определённой странице административной панели:
add_action('admin_enqueue_scripts', 'myplugin_admin_assets');
function myplugin_admin_assets($hook) {
if ($hook !== 'toplevel_page_myplugin') return;
wp_enqueue_style('myplugin-admin-style', plugin_dir_url(__FILE__) . 'assets/css/admin.css', [], '1.0');
wp_enqueue_script('myplugin-admin-script', plugin_dir_url(__FILE__) . 'assets/js/admin.js', ['jquery'], '1.0', true);
}
Для фронтенда используется аналогичный подход, но с хелпером is_page()
или проверкой условий:
add_action('wp_enqueue_scripts', 'myplugin_front_assets');
function myplugin_front_assets() {
if (!is_page('контакт')) return;
wp_enqueue_style('myplugin-style', plugin_dir_url(__FILE__) . 'assets/css/style.css', [], '1.0');
wp_enqueue_script('myplugin-script', plugin_dir_url(__FILE__) . 'assets/js/script.js', ['jquery'], '1.0', true);
}
Для обеспечения безопасности и интеграции с AJAX или REST рекомендуется использовать wp_localize_script()
для передачи данных из PHP в JavaScript:
wp_localize_script('myplugin-script', 'myPluginData', [
'ajaxUrl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('myplugin_nonce')
]);
Имена скриптов и стилей должны быть уникальны в пределах проекта, чтобы избежать конфликтов. Версии файлов лучше указывать явно, а параметр $in_footer
устанавливать в true
, чтобы минимизировать влияние на производительность загрузки страницы.
Создание настроек плагина в админке WordPress
Для добавления пользовательских настроек в админку WordPress используется API Settings. Начните с регистрации страницы настроек через функцию add_options_page()
в хук admin_menu
. Пример:
add_action('admin_menu', 'my_plugin_add_admin_menu');
function my_plugin_add_admin_menu() {
add_options_page(
'Настройки плагина',
'Мой плагин',
'manage_options',
'my_plugin_settings',
'my_plugin_settings_page'
);
}
function my_plugin_settings_page() {
echo '<form action="options.php" method="post">';
settings_fields('my_plugin_options_group');
do_settings_sections('my_plugin_settings');
submit_button();
echo '</form>';
}
Далее зарегистрируйте настройки и поля с помощью register_setting()
, add_settings_section()
и add_settings_field()
внутри хука admin_init
:
add_action('admin_init', 'my_plugin_settings_init');
function my_plugin_settings_init() {
register_setting('my_plugin_options_group', 'my_plugin_option');
add_settings_section(
'my_plugin_section',
'Основные настройки',
null,
'my_plugin_settings'
);
add_settings_field(
'my_plugin_option_field',
'Название опции',
'my_plugin_option_field_render',
'my_plugin_settings',
'my_plugin_section'
);
}
function my_plugin_option_field_render() {
$value = get_option('my_plugin_option', '');
echo '<input type="text" name="my_plugin_option" value="' . esc_attr($value) . '" />';
}
Для сохранения значений не требуется писать обработчики – WordPress сам обрабатывает форму через options.php
, если все функции вызваны корректно. Используйте sanitize_callback
при регистрации параметров для валидации данных.
Использование хуков и фильтров для расширения функционала
WordPress предоставляет два ключевых механизма расширения – действия (actions) и фильтры (filters). Они позволяют внедрять собственный код в определённые точки выполнения без модификации ядра.
Действия выполняются в определённый момент, но не возвращают значение. Пример подключения функции при инициализации:
add_action('init', 'my_plugin_custom_init');
function my_plugin_custom_init() {
// Регистрация типа записи, запуск крона и т.д.
}
Фильтры применяются для модификации данных. Например, изменение заголовка поста:
add_filter('the_title', 'my_plugin_modify_title');
function my_plugin_modify_title($title) {
return '[Модифицировано] ' . $title;
}
Пользовательские хуки также можно создавать. Это даёт другим разработчикам возможность взаимодействовать с вашим плагином:
do_action('my_plugin_after_save', $post_id);
Затем другой разработчик может подписаться на этот хук:
add_action('my_plugin_after_save', 'log_post_save');
function log_post_save($post_id) {
// Запись в лог или уведомление
}
Рекомендуется добавлять префикс плагина к названиям хуков, чтобы избежать конфликтов. Для повышения гибкости логики используйте apply_filters вместо жёстко заданных значений:
$limit = apply_filters('my_plugin_query_limit', 10);
Таким образом, хуки и фильтры – это архитектурная основа, обеспечивающая расширяемость, модульность и совместимость с другими компонентами WordPress.
Безопасная работа с формами и пользовательским вводом
Обработка данных из форм требует обязательной валидации и очистки для предотвращения XSS и SQL-инъекций. Используйте функции WordPress для фильтрации ввода: sanitize_text_field()
для текстовых данных, sanitize_email()
для email, intval()
или floatval()
для числовых значений.
Для проверки nonce применяйте check_admin_referer()
или wp_verify_nonce()
. Это предотвращает CSRF-атаки, подтверждая легитимность запроса.
При сохранении данных в базу избегайте прямого SQL-запроса. Используйте подготовленные выражения через $wpdb->prepare()
. Это обеспечивает экранирование и защищает от SQL-инъекций.
Всегда проверяйте тип и формат данных, особенно если форма принимает файлы. Ограничивайте расширения и размер, используйте встроенные функции WordPress для загрузки файлов – wp_handle_upload()
с правильной настройкой параметров.
Не храните чувствительную информацию без шифрования. Для аутентификации и передачи данных используйте HTTPS и стандартные механизмы безопасности WordPress.
Вопрос-ответ:
Какие основные шаги нужно пройти для создания простого плагина для WordPress с нуля?
Создание плагина начинается с разработки основной структуры: создается папка с именем плагина в каталоге wp-content/plugins, в ней размещается главный PHP-файл с описанием плагина в комментариях (заголовок). Затем следует написать функционал — например, добавление новых функций или хуков. После этого плагин можно активировать через административную панель WordPress. Важно проверить, чтобы код не содержал ошибок и не вызывал конфликтов с другими компонентами сайта.
Как добавить в плагин интерфейс настроек в админке WordPress?
Для создания интерфейса настроек нужно использовать функции WordPress для добавления страниц меню, такие как add_menu_page() или add_submenu_page(). Внутри этих страниц размещается форма с полями, значения которых сохраняются в базу данных с помощью функций update_option() и get_option(). Рекомендуется использовать nonce-поля для защиты от CSRF-атак и sanitize функции для обработки данных перед сохранением.
Можно ли использовать сторонние библиотеки в своем плагине, и как правильно их подключать?
Да, можно. Обычно сторонние библиотеки помещают в отдельную папку внутри плагина, например, /vendor или /libs. Для подключения используют require_once или autoload через Composer, если плагин достаточно сложный. Следует убедиться, что библиотека совместима с версией PHP и WordPress, а также избегать конфликтов с другими плагинами, которые могут использовать аналогичные библиотеки.
Как обеспечить безопасность при разработке плагина для WordPress?
Безопасность достигается несколькими способами: необходимо фильтровать и проверять все входящие данные с помощью функций sanitize_text_field(), esc_html(), и подобных. Используйте nonce-токены для подтверждения действий пользователей в админке. Не допускайте прямого доступа к файлам плагина, добавляя проверку константы ABSPATH. Также избегайте выполнения SQL-запросов без подготовки, применяйте $wpdb->prepare(). Это помогает предотвратить уязвимости типа XSS, CSRF и SQL-инъекции.