Как создать свой плагин для WordPress с обратной связью

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

Почему стоит создать собственный плагин для обратной связи

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

  • Точный контроль над функционалом и дизайном.
  • Минимальная нагрузка на сайт — вы используете только нужный код.
  • Возможность интеграции с другими частями сайта или внешними сервисами.
  • Отсутствие зависимостей и рекламных вставок.

Создание плагина — отличный способ лучше понять устройство WordPress и расширить собственные навыки разработки.

Структура плагина и базовые файлы

Для начала создадим папку wptemp-feedback в директории wp-content/plugins. Внутри создадим главный файл wptemp-feedback.php. В этом файле обязательно прописать заголовок плагина, чтобы WordPress его распознал:

<?php
/**
 * Plugin Name: WPTemp Feedback
 * Description: Плагин для сбора обратной связи от пользователей
 * Version: 1.0
 * Author: WPTemp
 */

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

Так мы защитим файл от запуска вне WordPress.

Создание таблицы для хранения сообщений

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

function wptemp_create_feedback_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'wptemp_feedback';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        user_name varchar(100) NOT NULL,
        user_email varchar(100) NOT NULL,
        message text NOT NULL,
        submitted_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
        PRIMARY KEY  (id)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
register_activation_hook(__FILE__, 'wptemp_create_feedback_table');

Эта функция создаст таблицу wp_wptemp_feedback (префикс может отличаться).

Создание формы обратной связи и обработка данных

Добавим шорткод, который будет выводить форму на любой странице или в записи. Форма будет содержать поля: имя, email и сообщение.

function wptemp_feedback_form() {
    $content = '';
    if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['wptemp_feedback_nonce'])) {
        if (!wp_verify_nonce($_POST['wptemp_feedback_nonce'], 'wptemp_feedback_action')) {
            $content .= '<p>Ошибка безопасности. Попробуйте снова.</p>';
        } else {
            $name = sanitize_text_field($_POST['wptemp_name']);
            $email = sanitize_email($_POST['wptemp_email']);
            $message = sanitize_textarea_field($_POST['wptemp_message']);

            if (!$name || !$email || !$message || !is_email($email)) {
                $content .= '<p>Пожалуйста, заполните все поля корректно.</p>';
            } else {
                global $wpdb;
                $table = $wpdb->prefix . 'wptemp_feedback';
                $wpdb->insert(
                    $table,
                    [
                        'user_name' => $name,
                        'user_email' => $email,
                        'message' => $message
                    ]
                );
                $content .= '<p>Спасибо за ваше сообщение!</p>';
            }
        }
    }

    $content .= '<form method="POST" action="">';
    $content .= wp_nonce_field('wptemp_feedback_action', 'wptemp_feedback_nonce', true, false);
    $content .= '<p><label>Имя:</label><br><input type="text" name="wptemp_name" required></p>';
    $content .= '<p><label>Email:</label><br><input type="email" name="wptemp_email" required></p>';
    $content .= '<p><label>Сообщение:</label><br><textarea name="wptemp_message" rows="5" required></textarea></p>';
    $content .= '<p><input type="submit" value="Отправить"></p>';
    $content .= '</form>';

    return $content;
}
add_shortcode('wptemp_feedback', 'wptemp_feedback_form');

Чтобы использовать форму, достаточно вставить шорткод [wptemp_feedback] в нужной странице или записи.

Безопасность и валидация данных

В коде выше применена базовая валидация и очистка данных с помощью функций WordPress: sanitize_text_field, sanitize_email, sanitize_textarea_field, а также проверка nonce — это защитит от CSRF-атак.

Важно всегда проверять email через is_email() и использовать подготовленные запросы (в данном случае $wpdb->insert защищает от SQL-инъекций).

Можно дополнительно добавить проверку длины полей и фильтрацию запрещённых символов, если необходимо.

Вывод сообщений в админке

Для удобства можно добавить страницу в админ-панели для просмотра сообщений.

function wptemp_add_admin_menu() {
    add_menu_page(
        'Обратная связь WPTemp',
        'WPTemp Feedback',
        'manage_options',
        'wptemp-feedback',
        'wptemp_feedback_admin_page',
        'dashicons-feedback',
        26
    );
}
add_action('admin_menu', 'wptemp_add_admin_menu');

function wptemp_feedback_admin_page() {
    global $wpdb;
    $table = $wpdb->prefix . 'wptemp_feedback';
    $results = $wpdb->get_results("SELECT * FROM $table ORDER BY submitted_at DESC");

    echo '<div class="wrap"><h1>Сообщения обратной связи</h1>';
    if ($results) {
        echo '<table class="wp-list-table widefat fixed striped"><thead><tr><th>ID</th><th>Имя</th><th>Email</th><th>Сообщение</th><th>Дата</th></tr></thead><tbody>';
        foreach ($results as $row) {
            echo '<tr><td>' . esc_html($row->id) . '</td><td>' . esc_html($row->user_name) . '</td><td>' . esc_html($row->user_email) . '</td><td>' . esc_html($row->message) . '</td><td>' . esc_html($row->submitted_at) . '</td></tr>';
        }
        echo '</tbody></table>';
    } else {
        echo '<p>Сообщений пока нет.</p>';
    }
    echo '</div>';
}

Этот код создаст в меню админки новую страницу с таблицей сообщений, где можно быстро просмотреть все обращения пользователей.

Дополнительные возможности и улучшения

Вы можете расширить плагин следующими фичами:

  • Отправка уведомлений на email администратора при новом сообщении.
  • Добавление капчи (reCAPTCHA или аналог) для предотвращения спама.
  • Возможность редактирования и удаления сообщений в админке.
  • Вывод сообщений на сайте с пагинацией и фильтрацией.
  • Интеграция с CRM или сервисами рассылок.

Для отправки email используйте функцию wp_mail() с фильтрами для форматирования и защиты.

Для капчи можно использовать готовые библиотеки или плагины, а потом интегрировать проверку в функцию обработки формы.

Вывод

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

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

WooCommerce: как установить ограничение на количество покупок товара
17.05.2026
Как удалить старые версии постов в WordPress
24.02.2026
Автоматическое удаление старых заказов в WooCommerce без плагинов
24.05.2026
Как использовать WP-Cron для отложенных задач в WordPress без системного Cron
04.04.2026
Оптимизация WooCommerce: как автоматически удалять старые статусы заказов через функции
20.05.2026