Диагностика задачи: зачем автоматически создавать отзывы
В WooCommerce отзывы играют важную роль для повышения доверия к товарам и увеличения конверсии. Однако не все покупатели оставляют отзывы вручную. Автоматическое создание черновиков отзывов после успешного заказа позволяет привлечь внимание клиентов и упростить процесс написания отзыва — достаточно открыть уже созданный черновик и дополнить его.
Проверить, нужна ли эта функция, можно через анализ статистики отзывов и заказов. Если процент отзывов низкий, а заказов много, автоматизация оправдана.
Пошаговое решение: добавление автоматических черновиков отзывов после завершения заказа
1. Используем хук WooCommerce для отслеживания смены статуса заказа
Хук woocommerce_order_status_completed срабатывает, когда заказ переводится в статус «завершён». В этот момент удобнее всего создать черновик отзыва.
add_action('woocommerce_order_status_completed', 'auto_create_review_after_order', 10, 1);
function auto_create_review_after_order($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
// Проверяем, существует ли уже отзыв от этого пользователя для товара
$user_id = $order->get_user_id();
if (user_has_reviewed_product($user_id, $product_id)) continue;
// Создаем черновик отзыва
$commentdata = array(
'comment_post_ID' => $product_id,
'comment_author' => $order->get_billing_first_name() . ' ' . $order->get_billing_last_name(),
'comment_author_email' => $order->get_billing_email(),
'comment_content' => '', // Пустой черновик
'comment_type' => 'review',
'comment_approved' => '0', // Черновик — не опубликован
'user_id' => $user_id,
);
wp_insert_comment($commentdata);
}
}
function user_has_reviewed_product($user_id, $product_id) {
if (!$user_id) return false;
$args = array(
'post_id' => $product_id,
'user_id' => $user_id,
'count' => true,
'type' => 'review',
'status' => 'approve',
);
$count = get_comments($args);
return $count > 0;
}2. Проверка существующих отзывов пользователя по товару
Функция user_has_reviewed_product предотвращает создание дубликатов отзывов для одного и того же пользователя и товара.
Проверка результата после внедрения
- Оформите тестовый заказ и переведите его в статус «Завершён».
- В админке WordPress откройте раздел Отзывы — должен появиться новый черновик отзыва с пустым содержанием.
- Проверьте, что для каждого товара из заказа создался отдельный черновик, если отзыв ранее не оставлялся.
- Отзывы не должны публиковаться автоматически — только черновики.
Частые ошибки и как их исправить
- Отзывы создаются с пустым автором или email. Убедитесь, что в заказе заполнены поля
billing_first_name,billing_last_nameиbilling_email. Если магазин принимает заказы без регистрации — можно добавить проверки и подставлять значения по умолчанию. - Отзывы публикуются сразу. Проверьте, что поле
comment_approvedустановлено в'0', а не'1'. - Отзывы не создаются для вариативных товаров. Используйте
$item->get_product_id(), а не$item->get_variation_id(), если хотите создавать отзывы по основному товару. - Повторяющиеся отзывы от одного пользователя. Убедитесь, что функция проверки
user_has_reviewed_productкорректно работает и фильтрует по статусуapprove.
Практические советы по безопасности и производительности
- Ограничьте количество создаваемых черновиков, чтобы не забивать базу. Например, добавьте проверку, что отзыв создаётся не чаще одного раза на определённый период.
- Используйте транзиенты или кэш для проверки существующих отзывов, если много заказов — так снизите нагрузку на базу данных.
- Защищайте поля отзывов от XSS и других уязвимостей при дальнейшем редактировании пользователями.
- Регулярно очищайте старые неактивные черновики, чтобы база не разрасталась.
Сравнение подходов: плагин vs. код vs. компромисс
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин (например, Customer Reviews for WooCommerce) | Простота установки, готовые настройки, поддержка | Дополнительная нагрузка, возможные конфликты, ограниченная кастомизация |
| Код (как в статье) | Минимальная нагрузка, полный контроль, кастомизация | Требует навыков, нет интерфейса, нужно поддерживать |
| Компромисс: готовый плагин + доп. код | Быстрый старт с возможностью доработок | Сложнее отлаживать, возможны конфликты |