В стандартной комплектации WooCommerce отзывы и оценки привязаны к товарам, но иногда возникает задача добавить возможность оставлять отзывы и оценки непосредственно к заказам. Это может быть полезно для улучшения обратной связи, аналитики и повышения качества сервиса. В этой статье разберём, как реализовать такой функционал с нуля, а также рассмотрим практические примеры кода и интеграцию с популярными плагинами.
Почему стоит добавлять отзывы и оценки к заказам WooCommerce
Отзывы к товарам — классика, но они не всегда показывают реальный опыт взаимодействия с магазином, доставкой и сервисом. Отзывы к заказам дают владельцу магазина возможность получить детальную обратную связь по каждому этапу покупки. Это помогает улучшить работу службы доставки, обслуживание клиентов и выявить проблемные точки.
Кроме того, сбор отзывов по заказам помогает формировать более точные отчёты и аналитику, основанную на комплексном восприятии покупок.
Добавление отзывов к заказам можно использовать и для автоматизации: например, отправлять клиенту письмо с просьбой оценить заказ через определённое время после его завершения.
Как добавить пользовательское поле для оценки и отзыва к заказу в WooCommerce
Для начала нужно добавить дополнительные поля к объекту заказа, чтобы пользователь мог оставить оценку и отзыв. Для этого используем хуки WooCommerce и WordPress.
Добавление полей оценки и отзыва в страницу просмотра заказа для клиента
Используем хук woocommerce_order_details_after_order_table, чтобы вывести форму отзыва на странице просмотра заказа в личном кабинете.
add_action('woocommerce_order_details_after_order_table', 'wporders_add_review_fields_to_order', 10, 1);
function wporders_add_review_fields_to_order($order) {
if (!$order->has_status('completed')) return; // Показываем форму только для завершённых заказов
$order_id = $order->get_id();
$rating = get_post_meta($order_id, '_wporders_order_rating', true);
$review = get_post_meta($order_id, '_wporders_order_review', true);
?>
<h2>Оставить отзыв о заказе</h2>
<form method="post">
<p>
<label for="wporders_order_rating">Оценка (1-5):</label>
<select name="wporders_order_rating" id="wporders_order_rating" required>
<option value="">Выберите оценку</option>
<?php for ($i = 1; $i <= 5; $i++): ?>
<option value="<?php echo $i; ?>" <?php selected($rating, $i); ?>><?php echo $i; ?></option>
<?php endfor; ?>
</select>
</p>
<p>
<label for="wporders_order_review">Отзыв:</label><br />
<textarea name="wporders_order_review" id="wporders_order_review" rows="5" cols="50" required><?php echo esc_textarea($review); ?></textarea>
</p>
<p>
<input type="submit" name="wporders_submit_review" value="Отправить отзыв" />
</p>
<?php wp_nonce_field('wporders_save_order_review', 'wporders_order_review_nonce'); ?>
</form>
<?php
}Обработка и сохранение отзыва после отправки формы
Подключаем обработчик на отправку формы, проверяем nonce и права пользователя, затем сохраняем данные в мета поля заказа.
add_action('template_redirect', 'wporders_save_order_review');
function wporders_save_order_review() {
if (!isset($_POST['wporders_submit_review'])) return;
if (!isset($_POST['wporders_order_review_nonce']) || !wp_verify_nonce($_POST['wporders_order_review_nonce'], 'wporders_save_order_review')) return;
$current_user = wp_get_current_user();
if (!$current_user->exists()) return;
if (!isset($_GET['order'])) return;
$order_id = intval($_GET['order']);
$order = wc_get_order($order_id);
if (!$order) return;
// Проверяем, что заказ принадлежит текущему пользователю
if ($order->get_user_id() !== $current_user->ID) return;
$rating = intval($_POST['wporders_order_rating']);
$review = sanitize_textarea_field($_POST['wporders_order_review']);
if ($rating < 1 || $rating > 5) return; // Валидация рейтинга
update_post_meta($order_id, '_wporders_order_rating', $rating);
update_post_meta($order_id, '_wporders_order_review', $review);
// Перенаправляем для предотвращения повторной отправки формы
wp_redirect(add_query_arg('review_submitted', 'true', wc_get_account_endpoint_url('view-order') . $order_id));
exit;
}Отображение отзывов и оценок в админке WooCommerce
Чтобы видеть отзывы и оценки прямо в списке заказов или на странице редактирования заказа, добавим кастомные колонки и мета-блоки.
Добавление колонки с рейтингом в таблицу заказов
add_filter('manage_edit-shop_order_columns', 'wporders_add_rating_column');
function wporders_add_rating_column($columns) {
$new_columns = array();
foreach ($columns as $key => $column) {
$new_columns[$key] = $column;
if ('order_total' === $key) {
$new_columns['order_rating'] = 'Оценка заказа';
}
}
return $new_columns;
}
add_action('manage_shop_order_posts_custom_column', 'wporders_fill_rating_column');
function wporders_fill_rating_column($column) {
global $post;
if ('order_rating' === $column) {
$rating = get_post_meta($post->ID, '_wporders_order_rating', true);
if ($rating) {
echo str_repeat('⭐', intval($rating));
} else {
echo '—';
}
}
}Отображение отзыва в мета-боксе на странице редактирования заказа
add_action('add_meta_boxes', 'wporders_add_review_metabox');
function wporders_add_review_metabox() {
add_meta_box('wporders_order_review', 'Отзыв и оценка заказа', 'wporders_display_review_metabox', 'shop_order', 'side', 'default');
}
function wporders_display_review_metabox($post) {
$rating = get_post_meta($post->ID, '_wporders_order_rating', true);
$review = get_post_meta($post->ID, '_wporders_order_review', true);
echo '<p><strong>Оценка:</strong> ' . ($rating ? str_repeat('⭐', intval($rating)) : 'Нет') . '</p>';
echo '<p><strong>Отзыв:</strong><br />' . nl2br(esc_html($review)) . '</p>';
}Автоматизация запроса отзывов с помощью email уведомлений
Для автоматического напоминания клиенту об оставлении отзыва по заказу можно использовать стандартные хуки WooCommerce или специализированные плагины.
Например, через хук woocommerce_order_status_completed отправить email с ссылкой на страницу заказа и формой отзыва.
add_action('woocommerce_order_status_completed', 'wporders_send_review_request_email');
function wporders_send_review_request_email($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$to = $order->get_billing_email();
$subject = 'Пожалуйста, оцените ваш заказ #' . $order_id;
$review_link = wc_get_account_endpoint_url('view-order') . $order_id;
$message = "Спасибо за ваш заказ! Пожалуйста, оставьте отзыв и оценку по ссылке: " . $review_link;
wp_mail($to, $subject, $message);
}Для более профессионального подхода можно использовать плагин Expert Review. Он позволяет создавать удобные формы отзывов, интегрировать их с заказами и настраивать автоматические напоминания.
Вывод отзывов и рейтингов в публичной части сайта
Для отображения отзывов на странице магазина или странице отдельного заказа можно создать шорткод, который будет выводить отзывы с рейтингами.
function wporders_show_order_reviews_shortcode($atts) {
$atts = shortcode_atts(array('order_id' => 0), $atts);
$order_id = intval($atts['order_id']);
if (!$order_id) return 'Заказ не указан.';
$rating = get_post_meta($order_id, '_wporders_order_rating', true);
$review = get_post_meta($order_id, '_wporders_order_review', true);
if (!$rating && !$review) return 'Отзывов по этому заказу нет.';
ob_start();
echo '<div class="wporders-order-review">';
if ($rating) {
echo '<p>Оценка: ' . str_repeat('⭐', intval($rating)) . '</p>';
}
if ($review) {
echo '<p>Отзыв:<br>' . nl2br(esc_html($review)) . '</p>';
}
echo '</div>';
return ob_get_clean();
}
add_shortcode('wporders_order_review', 'wporders_show_order_reviews_shortcode');Используйте шорткод [wporders_order_review order_id="123"] для вывода отзыва по конкретному заказу.
Резюме и рекомендации
Добавление отзывов и оценок к заказам WooCommerce — мощный инструмент для повышения качества сервиса и сбора обратной связи. Реализация с помощью пользовательских мета-полей и хуков позволяет гибко настраивать функционал под конкретные задачи.
Для расширения возможностей стоит обратить внимание на плагин Expert Review, который существенно упрощает создание комплексных систем отзывов и оценок.
Внедряйте данный функционал последовательно, начиная с базового сбора данных и отображения в админке, затем добавляйте автоматические email-уведомления и публичный вывод отзывов.