
Плагин в WordPress – это отдельный модуль на языке PHP, который подключается к системе через хуки и фильтры. Такой подход позволяет добавлять функциональность без изменения исходного кода ядра и темы. Для начала разработки потребуется базовое знание PHP, понимание структуры WordPress и доступ к локальному или тестовому серверу.
Каждый плагин начинается с создания отдельной папки в каталоге wp-content/plugins. Внутри неё создаётся главный файл с расширением .php, содержащий заголовок с информацией о названии, авторе и версии. Этот блок читается системой и определяет наличие плагина в административной панели.
Чтобы плагин корректно взаимодействовал с WordPress, необходимо использовать встроенные функции и API. Основой служат действия (actions) и фильтры (filters), через которые выполняется подключение к событиям системы: добавление меню, изменение контента записей, работа с формами или интеграция внешних сервисов.
Для структурирования кода рекомендуется разделять функциональные части: хранить обработчики хуков в отдельных файлах, использовать классы и неймспейсы, а также предусматривать возможность расширения плагина в будущем. Это облегчает поддержку и снижает вероятность конфликтов с другими модулями.
Создание структуры папок и файлов плагина

В корне плагина создаётся основная папка, название которой совпадает с названием плагина в нижнем регистре, без пробелов. Например: my-custom-plugin.
Внутри неё размещается главный PHP-файл с тем же именем: my-custom-plugin.php. В его шапке указываются данные о плагине (Name, URI, Description, Author, Version, License). Этот файл подключается WordPress автоматически.
Рекомендуется сразу добавить подкаталоги для логичной организации кода:
includes– подключаемые PHP-файлы с функциями и классами.assets– ресурсы интерфейса. Внутри можно создатьcss,js,images.languages– файлы перевода (.po,.mo).
Для автозагрузки классов удобно использовать autoload.php или внедрить Composer с файлом composer.json. Если планируется работа с настройками, стоит предусмотреть файл admin.php в папке includes.
Пример минимальной структуры:
my-custom-plugin/ ├── my-custom-plugin.php ├── includes/ │ └── admin.php ├── assets/ │ ├── css/ │ ├── js/ │ └── images/ ├── languages/ └── templates/
Такая схема позволяет быстро находить файлы и масштабировать проект без конфликтов.
Определение шапки плагина в основном PHP-файле

Каждый плагин WordPress начинается с файла, который содержит метаинформацию в виде комментария. Эта часть кода необходима для того, чтобы система распознала плагин и отобразила его в административной панели.
Минимальная структура шапки выглядит так:
<?php
/*
Plugin Name: Мой первый плагин
Description: Краткое описание назначения плагина.
Version: 1.0
Author: Имя разработчика
*/
Ключевые параметры:
- Plugin Name – название плагина, отображается в списке.
- Description – краткое пояснение функционала.
- Version – номер версии, полезен при обновлениях.
- Author – автор или команда разработчиков.
Дополнительные параметры:
- Plugin URI – ссылка на страницу проекта или документацию.
- Author URI – сайт автора.
- License и License URI – тип лицензии и ссылка на её текст.
- Text Domain и Domain Path – используются для локализации.
Рекомендации:
- Файл должен иметь расширение
.php, лучше всего назвать его по имени плагина латиницей, напримерmy-plugin.php. - Шапка должна находиться в начале файла сразу после открывающего тега
<?php. - Не оставляйте поле Plugin Name пустым – без него плагин не будет определён.
Подключение стилей и скриптов через хуки

Для регистрации и подключения CSS и JavaScript в плагинах WordPress применяются функции wp_enqueue_style() и wp_enqueue_script(). Их нельзя вызывать напрямую в коде, они должны быть связаны с системой через хуки wp_enqueue_scripts или admin_enqueue_scripts.
Пример подключения стилей для фронтенда:
add_action( 'wp_enqueue_scripts', 'myplugin_enqueue_styles' );
function myplugin_enqueue_styles() {
wp_enqueue_style(
'myplugin-styles',
plugin_dir_url( __FILE__ ) . 'assets/css/style.css',
array(),
'1.0.0'
);
}
Аналогично регистрируется JavaScript:
add_action( 'wp_enqueue_scripts', 'myplugin_enqueue_scripts' );
function myplugin_enqueue_scripts() {
wp_enqueue_script(
'myplugin-scripts',
plugin_dir_url( __FILE__ ) . 'assets/js/script.js',
array( 'jquery' ),
'1.0.0',
true
);
}
Параметр array(‘jquery’) задаёт зависимости, а последний аргумент true указывает загрузку внизу страницы. Для административной панели используйте admin_enqueue_scripts, чтобы код не затрагивал публичную часть сайта.
Хорошая практика – указывать версии файлов, чтобы при обновлениях не возникало проблем с кэшированием.
Регистрация собственных шорткодов
Шорткод создаётся с помощью функции add_shortcode(), где первый аргумент – имя шорткода, второй – callback. Callback получает параметры и содержимое, если шорткод оборачивает текст.
Простейший пример регистрации:
function myplugin_hello_shortcode() {
return "Привет, это мой первый шорткод!";
}
add_shortcode('hello', 'myplugin_hello_shortcode');
Чтобы использовать параметры, обработчик должен принимать аргументы:
function myplugin_button_shortcode($atts) {
$atts = shortcode_atts(
array(
'text' => 'Кнопка',
'url' => '#',
),
$atts,
'button'
);
return '<a href="' . esc_url($atts['url']) . '" class="my-btn">' . esc_html($atts['text']) . '</a>';
}
add_shortcode('button', 'myplugin_button_shortcode');
Вызов в редакторе: [button text="Подробнее" url="/about"]. Всегда используйте функции esc_html() и esc_url() для защиты от XSS. Если требуется поддержка вложенного текста, используйте $content как третий аргумент callback и функцию do_shortcode() для обработки внутреннего содержимого.
Использование хуков и фильтров для изменения поведения сайта

Пример использования действия:
add_action('wp_footer', 'my_custom_footer');
function my_custom_footer() {
echo '<p>Дополнительный текст в подвале</p>';
}
Пример фильтра:
add_filter('the_title', 'my_custom_title');
function my_custom_title($title) {
return '▶ ' . $title;
}
- Правильно выбирайте хук: уточняйте, в какой момент требуется вмешательство. Например, для подключения скриптов используйте
wp_enqueue_scripts, а неinit. - Используйте приоритет: третий аргумент функции
add_actionилиadd_filterопределяет порядок выполнения. Значение по умолчанию – 10. - Передавайте количество аргументов: четвёртый параметр указывает, сколько аргументов функция получит. Если их больше одного, это нужно явно указать.
Пример с приоритетом и количеством аргументов:
add_filter('excerpt_length', 'custom_excerpt_length', 20, 1);
function custom_excerpt_length($length) {
return 30;
}
- Сначала определите задачу: нужно ли изменить данные или добавить новый функционал.
- Найдите подходящий хук в документации WordPress или в исходном коде.
- Реализуйте функцию с минимальным количеством логики внутри.
- Тестируйте изменения на разных типах страниц и шаблонов.
Добавление настроек плагина в админ-панели
Для отображения страницы настроек в WordPress используется функция add_options_page(). Она регистрирует новую страницу в разделе «Настройки» админ-панели. Вызов должен размещаться внутри хука admin_menu:
add_action('admin_menu', 'my_plugin_add_settings_page');
function my_plugin_add_settings_page() {
add_options_page('Настройки моего плагина', 'Мой плагин', 'manage_options', 'my-plugin-settings', 'my_plugin_render_settings');
}
if(isset($_POST['my_plugin_option'])) {
update_option('my_plugin_option', sanitize_text_field($_POST['my_plugin_option']));
}
Структуру формы удобно представить в виде таблицы для наглядности и аккуратного отображения полей:
| Параметр | Описание | Тип |
|---|---|---|
| my_plugin_option | Основная настройка плагина | Текстовое поле |
| my_plugin_checkbox | Включить дополнительную функцию | Чекбокс |
| my_plugin_select | Выбор режима работы | Выпадающий список |
Для обработки чекбоксов и селектов рекомендуется проверять наличие ключа в массиве $_POST и использовать функции очистки данных, такие как sanitize_text_field() или intval(). Это предотвращает запись некорректных данных и сохраняет безопасность.
Рекомендуется регистрировать настройки через register_setting(), чтобы обеспечить совместимость с механизмом встроенной проверки прав и nonce:
add_action('admin_init', 'my_plugin_register_settings');
function my_plugin_register_settings() {
register_setting('my_plugin_options_group', 'my_plugin_option');
register_setting('my_plugin_options_group', 'my_plugin_checkbox');
register_setting('my_plugin_options_group', 'my_plugin_select');
}
После этого форма настроек может быть отправлена через settings_fields('my_plugin_options_group') и do_settings_sections('my-plugin-settings'), что обеспечивает автоматическую обработку сохранения и защиту от CSRF.
Работа с базой данных через WPDB

WPDB – встроенный объект для работы с базой данных WordPress. Для его использования подключение не требуется, объект доступен через глобальную переменную $wpdb. Таблицы WordPress автоматически определяются через префикс $wpdb->prefix, что обеспечивает совместимость с мультисайт-сетапами.
Для выборки данных используется метод get_results(). Он возвращает массив объектов, где каждая запись соответствует строке таблицы. Например: $users = $wpdb->get_results("SELECT ID, user_login FROM {$wpdb->users} WHERE user_status = 0");.
Метод get_var() позволяет получить одно значение из запроса, get_row() – одну строку, а get_col() – один столбец. Это снижает нагрузку на память при работе с большими таблицами.
Для безопасной передачи параметров используйте подготовленные выражения через $wpdb->prepare(). Пример: $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}my_table WHERE id = %d", $id));. Это защищает от SQL-инъекций.
Вставка, обновление и удаление данных выполняются методами insert(), update() и delete(). Они принимают массивы данных и автоматически экранируют значения. Пример вставки: $wpdb->insert("{$wpdb->prefix}my_table", ['name' => $name, 'email' => $email], ['%s','%s']);.
WPDB поддерживает транзакции для таблиц с движком InnoDB. Использование START TRANSACTION, COMMIT и ROLLBACK через $wpdb->query() позволяет безопасно выполнять несколько связанных операций.
Для оптимизации запросов применяйте методы query() для сложных SQL-команд, индексы и ограничения уникальности в таблицах. WPDB автоматически обрабатывает префикс таблиц, поэтому при написании плагина избегается хардкодинг названий.
Логирование ошибок через $wpdb->last_error и отладка запросов через $wpdb->last_query помогают быстро находить проблемы без сторонних инструментов.
Подготовка плагина к публикации в каталоге WordPress

Перед отправкой плагина в каталог WordPress необходимо убедиться, что он соответствует стандартам кодирования WordPress. Используйте официальный PHP_CodeSniffer с правилами WordPress Coding Standards для проверки синтаксиса и стиля кода.
Создайте файл readme.txt в формате WordPress, используя стандартную структуру: `=== Название плагина ===`, `== Описание ==`, `== Установка ==`, `== Часто задаваемые вопросы ==`, `== История версий ==`. Этот файл формирует страницу плагина в каталоге и влияет на SEO внутри WordPress.
Добавьте уникальный текстовый домен для интернационализации с функциями `__()` или `_e()`. Сгенерируйте `.pot` файл и убедитесь, что все строки, доступные для перевода, корректно обернуты.
Проверьте совместимость с последними версиями WordPress, активируя плагин на чистой установке. Убедитесь в отсутствии ошибок PHP, JavaScript и конфликтов с темами и популярными плагинами.
Создайте стабильную структуру папок: `assets` для скриншотов, `includes` для вспомогательных файлов, `languages` для переводов. Скриншоты должны иметь размеры 1:1, 2:1 и не превышать 1600×1200 пикселей для корректного отображения в каталоге.
Укажите точные заголовки и описание в заголовке плагина (`Plugin Name`, `Plugin URI`, `Author`, `Author URI`, `Version`, `Text Domain`). Эти метаданные обязательны для успешного индексирования в каталоге.
Создайте лог изменений в readme.txt и в коде через тег `Version`. Отслеживание версий облегчает проверку обновлений и совместимость с WordPress.org.
Проверьте лицензирование: плагин должен быть совместим с GPLv2 или выше. Все внешние библиотеки и ресурсы должны иметь открытые лицензии, совместимые с WordPress.
Используйте SVN репозиторий WordPress для загрузки плагина. Структура должна включать папки `trunk`, `tags`, `branches`. Размещайте основную версию в `trunk` и создавайте теги для каждой стабильной версии.
Вопрос-ответ:
Какие файлы нужны для минимального плагина WordPress?
Для базового плагина достаточно одного PHP-файла с корректным заголовком, который включает имя плагина, автора и версию. Этот файл помещается в отдельную папку внутри директории /wp-content/plugins/. Дополнительно можно создать файлы CSS и JavaScript, если плагин будет использовать стили или скрипты, но для простой функциональности достаточно одного PHP-файла.
Как подключить стили и скрипты в плагине?
Для добавления CSS и JavaScript используют функции wp_enqueue_style() и wp_enqueue_script(). Их нужно подключать через хук add_action() с параметром ‘wp_enqueue_scripts’ для фронтенда или ‘admin_enqueue_scripts’ для панели администратора. Это гарантирует, что файлы будут загружены только тогда, когда они нужны, и не вызовут конфликтов с другими плагинами или темами.
Можно ли сделать плагин, который добавляет новый тип записи?
Да, для этого используется функция register_post_type(). Вызов этой функции нужно разместить в файле плагина и подключить через хук ‘init’. При регистрации можно задать название типа записи, метки, поддержку миниатюр, редактора, таксономий и другие параметры. После активации плагина новый тип записи появится в админ-панели и будет доступен для редактирования.
Как безопасно сохранять данные плагина в базе данных?
Для работы с базой данных используют объект $wpdb и функции WordPress, такие как add_option(), update_option() и get_option() для хранения настроек. Если требуется создавать собственные таблицы, важно использовать метод $wpdb->prepare() для безопасного формирования SQL-запросов и проверки данных. Это помогает предотвратить уязвимости, связанные с SQL-инъекциями.
