ворд-пресс.рф
Решение

Как создать плагин WordPress с нуля: пример и проверка

Минимальная структура собственного WordPress-плагина, PHP-код с хуком, установка на staging и чек-лист безопасной разработки.

Свой плагин WordPress можно начать с отдельной папки и одного PHP-файла с заголовком Plugin Name. Дальше добавьте небольшой обработчик через hook WordPress, активируйте плагин на тестовом сайте и проверьте результат. Пример ниже не меняет данные и показывает уведомление только администраторам; пример требует проверки, готовым протестированным продуктом он не является.

Когда писать собственный плагин

Собственный код уместен, если требуется небольшая повторяемая функция, интеграция с внутренней системой или независимость от темы. Если задача целиком решается надёжным поддерживаемым расширением, сначала оцените готовое решение: собственный плагин нужно обновлять, тестировать и защищать в течение всего жизненного цикла.

Функции, которые должны переживать смену темы, разумно размещать в плагине, а не в functions.php активной темы. Но для чисто визуальной правки отдельный плагин необязателен.

Минимальная структура проекта

Создайте в тестовой установке WordPress такой каталог:

wp-content/
  plugins/
    wpr-starter-demo/
      wpr-starter-demo.php

Имя папки должно быть уникальным в контексте сайта. Не копируйте демонстрационный код в системные файлы WordPress. Единственный файл с обязательным заголовком плагина — wpr-starter-demo.php.

Минимальный код с action hook

Следующий пример подключается к admin_notices и выводит безопасное текстовое уведомление только пользователю с правом manage_options. В нём нет записи в базу или пользовательских входных данных.

Пример требует проверки на вашей версии WordPress, PHP, теме и сочетании активных плагинов. Он предназначен только для staging.

<?php
/**
 * Plugin Name: WPR Starter Demo
 * Description: Minimal admin notice for a staging site.
 * Version: 0.1.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

add_action( 'admin_notices', 'wpr_starter_demo_admin_notice' );

function wpr_starter_demo_admin_notice() {
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }

    $message = 'Тестовый плагин активен.';
    echo '<div class="notice notice-info"><p>'
        . esc_html( $message )
        . '</p></div>';
}

Заголовок позволяет WordPress обнаружить плагин, add_action() регистрирует обработчик, current_user_can() ограничивает показ, esc_html() экранирует текст при выводе. Для такого минимального примера activation/deactivation hooks не обязательны: устанавливать или удалять данные ему нечего.

Риск: синтаксическая ошибка PHP или конфликт имён функций может привести к критической ошибке. Проверка: плагин обнаружен в списке, успешно активируется, администратор видит уведомление, а пользователь без необходимых прав — нет. После деактивации уведомление исчезает.

Как установить и проверить на staging

  1. Сохраните PHP-файл в кодировке UTF-8 без нежелательного вывода до открывающего PHP-тега.
  2. Поместите папку в wp-content/plugins/ на тестовом сервере или используйте пакет установки, подготовленный по правилам WordPress.
  3. Откройте Плагины, найдите WPR Starter Demo и активируйте.
  4. Зайдите в админку под тестовым администратором и под пользователем без прав администратора; проверьте различие.
  5. Деактивируйте плагин и убедитесь, что уведомление не появляется. Просмотрите PHP error log.

Риск: тест под одним аккаунтом не подтверждает корректность разграничения прав. Проверка: выполнены отдельные тесты под ролями, а файлы и БД не изменены неожиданным образом.

Безопасность: capabilities, nonce, sanitization, escaping

В демонстрации есть лишь вывод фиксированной строки. Для настоящего плагина при добавлении форм, AJAX и обработчиков сохранения появятся дополнительные требования:

  • Capabilities: проверяйте current_user_can() перед привилегированной операцией.
  • Nonce: используйте механизм nonce для защиты соответствующего действия от CSRF; nonce не заменяет проверку прав пользователя.
  • Sanitization: приводите недоверенный ввод к допустимому формату, например текст через sanitize_text_field() там, где это уместно.
  • Escaping: экранируйте данные непосредственно при выводе с учётом контекста (esc_html(), esc_attr(), esc_url() и другие).
  • Хранение: определите необходимость настройки/таблицы, миграцию, удаление данных и правила обработки персональной информации.

Риск: обработчик с одним nonce, но без capability-check, остаётся уязвимым по модели прав доступа. Проверка: тесты на отсутствие прав, неверный nonce, неожиданный ввод и безопасный вывод включены в план до разработки производственных функций.

Если код помогает писать coding agent

Сформулируйте задачу для Codex или другого агента так: «Создать отдельный WordPress-плагин с одной указанной функцией; не изменять ядро и тему; перечислить затронутые файлы; для операций записи проверять права и nonce; не добавлять зависимостей без согласования; вернуть diff, список рисков и команды проверки».

Просмотрите diff: нет ли скрытых сетевых вызовов, новых привилегий, обращения к секретам, чрезмерно широких хуков, опасной работы с SQL или обработки пользовательского ввода без проверок. Отсутствие замечаний агента не считается тестированием.

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

Чек-лист перед применением на рабочем сайте

  • Название, slug, глобальные функции и константы не конфликтуют с установленными расширениями.
  • Есть сценарий отката и проверенная резервная копия.
  • Задокументированы поддерживаемые окружения; совместимость не объявляется без реальных испытаний.
  • Проверены роли, ввод, вывод, формы и критичные бизнес-сценарии.
  • Не включены отладочные сообщения, секреты и ненужный сбор данных.
  • Пройдена проверка diff и результата на staging.

Первоисточники: WordPress Plugin Basics, Plugin Handbook, Nonces, Sanitizing Data и Escaping Data.

Источник: https://developer.wordpress.org/plugins/plugin-basics/

Материал был полезен?

Помогите нам сделать материалы точнее и понятнее.