Почему нужно отключать отзывы на отдельных страницах WooCommerce
В некоторых случаях отзывы на страницах товаров WooCommerce могут быть нежелательными. Например, для товаров с ограниченным тиражом, услуг, или при подготовке сезонных акций. Отключать отзывы полностью не всегда удобно, поэтому задача стоит точечно — отключить отзывы на выбранных страницах.
Диагностика проблемы: как определить, что отзывы не должны отображаться
Перед решением важно понять, по каким критериям отключать отзывы. Обычно используют:
- ID товара или его категории;
- тип товара (простой, вариативный и т.д.);
- метаполя или произвольные поля, в которых хранится флаг отключения отзывов;
- условия по дате публикации или статусу товара.
Для диагностики можно вывести var_dump(get_post_meta($product_id)) или проверить категорию через has_term().
Пошаговое решение: отключаем отзывы программно
Лучший способ — использовать хук comments_open, который отвечает за разрешение комментариев (в том числе и отзывов WooCommerce) на странице товара.
Добавьте следующий код в functions.php вашей темы или в кастомный плагин:
add_filter('comments_open', 'disable_reviews_on_selected_products', 10, 2);function disable_reviews_on_selected_products($open, $post_id) { if (get_post_type($post_id) !== 'product') { return $open; } // Пример 1: отключение по ID товара $excluded_ids = array(123, 456); if (in_array($post_id, $excluded_ids)) { return false; } // Пример 2: отключение по категории if (has_term('no-reviews', 'product_cat', $post_id)) { return false; } // Пример 3: отключение по метаполю _disable_reviews = 'yes' $disable_flag = get_post_meta($post_id, '_disable_reviews', true); if ($disable_flag === 'yes') { return false; } return $open;}Объяснение:
- Сначала проверяем, что это товар;
- если ID товара есть в списке исключений — отключаем отзывы;
- если у товара есть категория
no-reviews— отключаем; - если у товара есть метаполе
_disable_reviewsсо значениемyes— отключаем; - иначе оставляем текущее состояние.
Как добавить метаполе для отключения отзывов в админке
Чтобы удобно управлять отключением в админке, добавим метабокс с чекбоксом:
add_action('add_meta_boxes', function() { add_meta_box('disable_reviews_box', 'Отключить отзывы', function($post) { $value = get_post_meta($post->ID, '_disable_reviews', true); wp_nonce_field('disable_reviews_nonce', 'disable_reviews_nonce_field'); ?> <label><input type="checkbox" name="disable_reviews" value="yes" <?php checked($value, 'yes'); ?>> Отключить отзывы на этом товаре</label> <?php }, 'product', 'side');});add_action('save_post', function($post_id) { if (!isset($_POST['disable_reviews_nonce_field']) || !wp_verify_nonce($_POST['disable_reviews_nonce_field'], 'disable_reviews_nonce')) { return; } if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } if (isset($_POST['disable_reviews']) && $_POST['disable_reviews'] === 'yes') { update_post_meta($post_id, '_disable_reviews', 'yes'); } else { delete_post_meta($post_id, '_disable_reviews'); }});Проверка результата после внедрения
Для проверки:
- Откройте страницу товара с ID из массива
$excluded_ids— отзывы должны быть отключены; - Проверьте товар с категорией
no-reviews— отзывы также отсутствуют; - Для товара с установленным метаполем
_disable_reviews = yesотзывы отключены; - Для остальных товаров отзывы отображаются как обычно.
Если отзывы не отображаются, значит фильтр работает корректно.
Частые ошибки и как их исправить
- Отзывы отображаются несмотря на код. Проверьте, что код добавлен в активную тему или плагин, и что нет конфликтов с другими плагинами, которые могут принудительно включать отзывы.
- Код не работает для вариативных товаров. У вариативных товаров отзывы привязаны к родительскому товару. Убедитесь, что проверяете именно ID родительского товара.
- Метабокс не сохраняется. Проверьте наличие
wp_nonce_fieldи корректность проверки nonce при сохранении. - Отзывы не отключаются на страницах архивов. Фильтр
comments_openработает только на страницах одиночного товара. Для архивов нужно дополнительно убирать блок отзывов в шаблонах.
Практические советы по производительности и безопасности
- Используйте кеширование результатов функции
get_post_meta, если список товаров большой, чтобы не нагружать базу. - Проверяйте nonce при сохранении метаполя — это защитит от CSRF-атак.
- Для массового обновления метаполей используйте WP-CLI или SQL-запросы, чтобы не делать это вручную.
Сравнение способов отключения отзывов на отдельных страницах WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
Фильтр comments_open с проверкой ID/категории/метаполя | Гибко, работает без изменения шаблонов, легко масштабируется | Не отключает блок отзывов на архивах, требует кода |
| Отключение через шаблоны (удаление блока reviews.php) | Прямой контроль над выводом, простой способ для отдельных тем | Менее гибко, требует копирования и редактирования шаблонов |
| Плагины для управления отзывами | Удобный интерфейс, дополнительные функции модерации | Зависимость от стороннего кода, нагрузка на сайт, платные функции |