Отзывы пользователей — важный элемент доверия к сайту. В этой статье мы рассмотрим, как создать динамическую систему отзывов с подтверждением в 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.