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

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

Что такое плагин WordPress и зачем его создавать

Плагин — это набор PHP-файлов, которые добавляют или изменяют функциональность сайта на WordPress. Создавая собственный плагин, вы избегаете изменения кода темы или ядра CMS, что облегчает обновления и поддержку сайта. Кроме того, плагин можно легко включать, отключать или переносить на другие проекты.

Для чего может понадобиться свой плагин:

  • Добавление уникальных функций, которых нет в существующих плагинах.
  • Оптимизация под конкретные задачи и требования.
  • Изучение внутреннего устройства WordPress и повышение квалификации.

Структура простого плагина WordPress

Минимальный плагин — это один PHP-файл с определённым заголовком. Рассмотрим пример базового файла плагина wpmax-myplugin.php:

<?php
/*
Plugin Name: WPMax My Plugin
Plugin URI: https://wpmax.ru
Description: Пример простого плагина для WordPress
Version: 1.0
Author: WPMax
Author URI: https://wpmax.ru
License: GPL2
*/

// Защита от прямого запуска
if (!defined('ABSPATH')) {
    exit;
}

// Функция плагина
function wpmax_myplugin_show_message() {
    echo '<p>Привет из плагина WPMax!</p>';
}

// Хук для вывода сообщения в конце контента
add_filter('the_content', function($content) {
    if (is_single()) {
        $content .= wpmax_myplugin_show_message();
    }
    return $content;
});

Здесь мы:

  • Задаём заголовок плагина — обязательная часть.
  • Добавляем защиту от прямого вызова файлов плагина.
  • Создаём функцию, которая выводит сообщение.
  • Добавляем фильтр, который дописывает сообщение в контент поста.

Как правильно структурировать плагин для больших проектов

Для более сложных плагинов лучше организовать структуру с несколькими файлами и папками. Например:

wpmax-myplugin/
├── wpmax-myplugin.php
├── includes/
│   └── class-wpmax-myplugin.php
├── assets/
│   ├── css/
│   └── js/
└── languages/

Основной файл wpmax-myplugin.php подключает остальные компоненты. В папке includes обычно хранятся классы и вспомогательные функции, assets — скрипты и стили, languages — файлы перевода.

Пример подключения класса из файла includes/class-wpmax-myplugin.php в основном файле:

if (file_exists(plugin_dir_path(__FILE__) . 'includes/class-wpmax-myplugin.php')) {
    require_once plugin_dir_path(__FILE__) . 'includes/class-wpmax-myplugin.php';
}

// Инициализация
function wpmax_myplugin_init() {
    $plugin = new WPMax_MyPlugin();
    $plugin->run();
}
add_action('plugins_loaded', 'wpmax_myplugin_init');

Пример класса плагина с активацией и деактивацией

Реализуем класс с методами для активации и деактивации плагина:

class WPMax_MyPlugin {
    public function run() {
        add_action('init', [&$this, 'register_custom_post_type']);
    }

    public function register_custom_post_type() {
        register_post_type('wpmax_item', [
            'labels' => [
                'name' => 'WPMax Items',
                'singular_name' => 'WPMax Item'
            ],
            'public' => true,
            'has_archive' => true,
            'rewrite' => ['slug' => 'wpmax-items'],
        ]);
    }

    public static function activate() {
        // Регистрируем тип записи перед сбросом правил
        $plugin = new self();
        $plugin->register_custom_post_type();
        flush_rewrite_rules();
    }

    public static function deactivate() {
        flush_rewrite_rules();
    }
}

// Регистрируем хуки активации и деактивации
register_activation_hook(__FILE__, ['WPMax_MyPlugin', 'activate']);
register_deactivation_hook(__FILE__, ['WPMax_MyPlugin', 'deactivate']);

Этот код создаст новый тип записи «WPMax Items», который появится в админке после активации плагина. При деактивации правила ЧПУ сбрасываются.

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

Для удобства пользователя полезно добавить страницу настроек. Рассмотрим пример простой страницы с настройкой текста для вывода.

Добавим в класс метод для регистрации меню и отображения страницы:

public function add_admin_menu() {
    add_options_page(
        'Настройки WPMax My Plugin',
        'WPMax Plugin',
        'manage_options',
        'wpmax_myplugin',
        [&$this, 'settings_page']
    );
}

public function settings_page() {
    ?>
    <div class="wrap">
        <h1>Настройки WPMax My Plugin</h1>
        <form method="post" action="options.php">
            <?php
            settings_fields('wpmax_myplugin_options_group');
            do_settings_sections('wpmax_myplugin');
            submit_button();
            ?>
        </form>
    </div>
    <?php
}

public function register_settings() {
    register_setting('wpmax_myplugin_options_group', 'wpmax_myplugin_text');

    add_settings_section(
        'wpmax_myplugin_main_section',
        'Основные настройки',
        null,
        'wpmax_myplugin'
    );

    add_settings_field(
        'wpmax_myplugin_text_field',
        'Текст для вывода',
        [&$this, 'text_field_callback'],
        'wpmax_myplugin',
        'wpmax_myplugin_main_section'
    );
}

public function text_field_callback() {
    $value = get_option('wpmax_myplugin_text', 'Привет из WPMax!');
    echo '<input type="text" name="wpmax_myplugin_text" value="' . esc_attr($value) . '" class="regular-text" />';
}

Не забудьте добавить вызовы этих методов в run():

add_action('admin_menu', [&$this, 'add_admin_menu']);
add_action('admin_init', [&$this, 'register_settings']);

Использование сохранённых настроек в выводе на сайте

Изменим функцию вывода, чтобы использовать текст из настроек:

function wpmax_myplugin_show_message() {
    $text = get_option('wpmax_myplugin_text', 'Привет из WPMax!');
    return '<p>' . esc_html($text) . '</p>';
}

Теперь администратор может менять текст в настройках, и он отобразится на страницах постов.

Безопасность и лучшие практики при создании плагинов

При разработке плагина важно соблюдать несколько правил безопасности:

  • Всегда проверяйте права пользователя перед выполнением действий, особенно в админке, например, через current_user_can('manage_options').
  • Используйте nonce для форм, чтобы защититься от CSRF-атак.
  • Экранируйте вывод через esc_html(), esc_attr() и другие функции WordPress.
  • Не используйте глобальные переменные без необходимости, придерживайтесь ООП и замыканий.
  • Регулярно обновляйте плагин и тестируйте на совместимость с новой версией WordPress.

Также рекомендуем для сложных задач использовать классы и разделять код на модули, чтобы проще поддерживать и расширять функционал.

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

Для комфортной разработки советую использовать следующие инструменты:

  • Query Monitor — мониторинг запросов, ошибок и хуков.
  • Debug Bar — удобная панель отладки.
  • Log Deprecated Notices — отслеживание устаревших функций.
  • Code Snippets — быстрое добавление небольших фрагментов кода без создания отдельного плагина.

Эти плагины помогут быстро выявлять и исправлять ошибки, а также лучше понимать, как работает WordPress.

Заключение

Создание собственного плагина WordPress с нуля — это не только полезный навык, но и возможность глубже понять устройство CMS, улучшить свои проекты и расширить функциональность сайта без зависимости от сторонних решений. Следуя описанным шагам и рекомендациям, вы сможете написать стабильный, безопасный и легко поддерживаемый плагин, который будет работать именно так, как вам нужно.

Как добавить дополнительные поля на страницу авторизации WordPress с помощью кода
24.03.2026
WooCommerce: как избежать конфликтов между кастомными плагинами
23.06.2026
WooCommerce: как отключить автоматическое обновление статуса заказов
30.04.2026
Как установить уникальные правила robots.txt в WordPress без плагинов
06.04.2026
Как создать автоматические уведомления о обновлениях плагинов WordPress
05.02.2026