Как создать динамические отзывы в WordPress с подтверждением

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

Почему нужны динамические отзывы с подтверждением

Обычные отзывы можно оставлять без проверки, что снижает их ценность — появляются спам и фейковые комментарии. Подтверждение оставления отзыва (например, через email или авторизацию) повышает качество контента, улучшает доверие посетителей и SEO.

Кроме того, динамические отзывы позволяют выводить их в реальном времени на сайте без перезагрузки страницы, что улучшает UX.

Создаем базовую структуру для отзывов в WordPress

Для начала создадим пользовательский тип записи для отзывов. Это позволит удобно управлять ими в админке и выводить через WP Query.

function wpall_register_review_cpt() {
    $labels = array(
        'name' => 'Отзывы',
        'singular_name' => 'Отзыв',
    );
    $args = array(
        'labels' => $labels,
        'public' => false,
        'show_ui' => true,
        'supports' => array('title', 'editor', 'author'),
    );
    register_post_type('wpall_review', $args);
}
add_action('init', 'wpall_register_review_cpt');

После добавления кода в functions.php или отдельный плагин появится раздел «Отзывы» в админке.

Формирование формы для отправки отзывов с подтверждением email

Создадим форму, которая собирает имя, email и текст отзыва. После отправки пользователь получит письмо с ссылкой для подтверждения.

function wpall_render_review_form() {
    if (isset($_POST['wpall_review_submit'])) {
        $name = sanitize_text_field($_POST['wpall_review_name']);
        $email = sanitize_email($_POST['wpall_review_email']);
        $content = sanitize_textarea_field($_POST['wpall_review_content']);

        if (is_email($email) && !empty($content)) {
            // Генерируем уникальный ключ подтверждения
            $token = wp_generate_password(20, false);
            // Сохраняем отзыв как черновик с мета токеном
            $post_id = wp_insert_post(array(
                'post_type' => 'wpall_review',
                'post_title' => 'Отзыв от ' . $name,
                'post_content' => $content,
                'post_status' => 'pending',
                'meta_input' => array(
                    'wpall_review_email' => $email,
                    'wpall_review_confirm_token' => $token,
                ),
            ));

            if ($post_id) {
                $confirm_url = add_query_arg(array(
                    'wpall_confirm_review' => $post_id,
                    'token' => $token,
                ), home_url());

                $subject = 'Подтвердите ваш отзыв на сайте';
                $message = "Здравствуйте, $name!\n\nПожалуйста, подтвердите ваш отзыв, перейдя по ссылке:\n$confirm_url";

                wp_mail($email, $subject, $message);

                echo '<p>Спасибо за отзыв! Вам отправлено письмо для подтверждения.</p>';
            }
        } else {
            echo '<p>Пожалуйста, заполните все поля корректно.</p>';
        }
    }

    echo '<form method="POST">';
    echo '<p><label>Имя:<input type="text" name="wpall_review_name" required></label></p>';
    echo '<p><label>Email:<input type="email" name="wpall_review_email" required></label></p>';
    echo '<p><label>Отзыв:<textarea name="wpall_review_content" required></textarea></label></p>';
    echo '<p><input type="submit" name="wpall_review_submit" value="Отправить отзыв"></p>';
    echo '</form>';
}

Вставьте вызов wpall_render_review_form() в нужное место шаблона или через шорткод для вывода формы.

Обработка подтверждения отзыва по email

Теперь сделаем проверку GET-параметров для подтверждения отзыва и публикации его на сайте.

function wpall_handle_review_confirmation() {
    if (isset($_GET['wpall_confirm_review'], $_GET['token'])) {
        $post_id = intval($_GET['wpall_confirm_review']);
        $token = sanitize_text_field($_GET['token']);

        $saved_token = get_post_meta($post_id, 'wpall_review_confirm_token', true);

        if ($saved_token && $saved_token === $token) {
            // Меняем статус на опубликованный
            wp_update_post(array(
                'ID' => $post_id,
                'post_status' => 'publish',
            ));
            delete_post_meta($post_id, 'wpall_review_confirm_token');

            echo '<p>Спасибо! Ваш отзыв подтвержден и опубликован.</p>';
            exit;
        } else {
            echo '<p>Неверный или просроченный токен подтверждения.</p>';
            exit;
        }
    }
}
add_action('template_redirect', 'wpall_handle_review_confirmation');

Вывод отзывов на сайте с пагинацией и фильтрацией

Для вывода отзывов используем WP_Query, выводим только опубликованные отзывы.

function wpall_display_reviews($atts) {
    $atts = shortcode_atts(array(
        'posts_per_page' => 5,
        'paged' => (get_query_var('paged')) ? get_query_var('paged') : 1,
    ), $atts, 'wpall_reviews');

    $query = new WP_Query(array(
        'post_type' => 'wpall_review',
        'post_status' => 'publish',
        'posts_per_page' => intval($atts['posts_per_page']),
        'paged' => intval($atts['paged']),
        'orderby' => 'date',
        'order' => 'DESC',
    ));

    $output = '<div class="wpall-reviews">';
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $output .= '<div class="wpall-review-item">';
            $output .= '<h3>' . get_the_title() . '</h3>';
            $output .= '<div>' . get_the_content() . '</div>';
            $output .= '<em>Автор: ' . get_the_author() . '</em>';
            $output .= '</div>';
        }

        $output .= '<div class="wpall-pagination">';
        $output .= paginate_links(array(
            'total' => $query->max_num_pages,
            'current' => intval($atts['paged']),
            'format' => '?paged=%#%',
        ));
        $output .= '</div>';
    } else {
        $output .= '<p>Отзывов пока нет.</p>';
    }
    $output .= '</div>';

    wp_reset_postdata();

    return $output;
}
add_shortcode('wpall_reviews', 'wpall_display_reviews');

Рекомендации по плагинам для расширения функционала отзывов

Если вы хотите использовать готовые решения с подтверждением и удобным интерфейсом, рассмотрите плагины:

  • Expert Review — мощный плагин для сбора отзывов с возможностью модерации и подтверждения.
  • WPRemark — легкий плагин с возможностью кастомизации формы и вывода отзывов.

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

Заключение

В статье мы подробно рассмотрели создание системы динамических отзывов с подтверждением email на WordPress. Использование пользовательского типа записи, отправка писем с токеном подтверждения и вывод отзывов через шорткод — основные этапы. Такой подход позволит избежать спама и повысить доверие посетителей.

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

Как сделать автоматическое удаление спама в комментариях WordPress
23.01.2026
Как создать автоответчик в комментариях WordPress
13.02.2026
Оптимизация базы данных WordPress: практические методы и примеры
11.11.2025
Как создать автоматические резервные копии базы данных WordPress с помощью PHP
03.01.2026
WPAll Автообновления WordPress: как настроить безопасное обновление плагинов и тем
04.11.2025