Как создать плагин для WordPress с нуля

Как сделать плагин wordpress

Как сделать плагин wordpress

Плагин в 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-файле

Определение шапки плагина в основном 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 – используются для локализации.

Рекомендации:

  1. Файл должен иметь расширение .php, лучше всего назвать его по имени плагина латиницей, например my-plugin.php.
  2. Шапка должна находиться в начале файла сразу после открывающего тега <?php.
  3. Не оставляйте поле 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;
}
  1. Сначала определите задачу: нужно ли изменить данные или добавить новый функционал.
  2. Найдите подходящий хук в документации WordPress или в исходном коде.
  3. Реализуйте функцию с минимальным количеством логики внутри.
  4. Тестируйте изменения на разных типах страниц и шаблонов.

Добавление настроек плагина в админ-панели

Для отображения страницы настроек в 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

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 необходимо убедиться, что он соответствует стандартам кодирования 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-инъекциями.

Ссылка на основную публикацию