Проблема: отзывы WooCommerce мешают на определённых товарах
В стандартной установке WooCommerce отзывы включены для всех товаров. Иногда требуется отключить отзывы для отдельных товаров — например, для товаров без возможности комментирования, цифровых продуктов или товаров с ограниченным доступом. Отключать отзывы вручную на каждом товаре неудобно, особенно если товаров много.
Диагностика проблемы
Чтобы понять, активны ли отзывы на странице товара, откройте страницу редактирования товара в админке WordPress. В блоке Настройки продукта во вкладке Общие есть чекбокс «Включить отзывы». Если убрать его, отзывы не отображаются, но это ручное действие для каждого товара.
Если отзывы показываются там, где не нужны, значит, либо чекбокс включён, либо тема/плагин принудительно их выводит.
Пошаговое решение: автоматическое отключение отзывов на выбранных товарах
1. Добавляем мета-поле для отключения отзывов
Чтобы управлять отзывами выборочно, добавим мета-поле disable_reviews с чекбоксом на странице редактирования товара.
function add_disable_reviews_meta_box() {
add_meta_box('disable_reviews_box', 'Отключить отзывы', 'disable_reviews_meta_box_callback', 'product', 'side');
}
add_action('add_meta_boxes', 'add_disable_reviews_meta_box');
function disable_reviews_meta_box_callback($post) {
wp_nonce_field('disable_reviews_nonce_action', 'disable_reviews_nonce');
$value = get_post_meta($post->ID, '_disable_reviews', true);
echo '<label><input type="checkbox" name="disable_reviews" value="yes" ' . checked($value, 'yes', false) . ' /> Отключить отзывы для этого товара</label>';
}
function save_disable_reviews_meta_box_data($post_id) {
if (!isset($_POST['disable_reviews_nonce']) || !wp_verify_nonce($_POST['disable_reviews_nonce'], 'disable_reviews_nonce_action')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['disable_reviews'])) {
update_post_meta($post_id, '_disable_reviews', 'yes');
} else {
delete_post_meta($post_id, '_disable_reviews');
}
}
add_action('save_post', 'save_disable_reviews_meta_box_data');2. Отключаем отзывы на фронтенде для товаров с мета-полем
Теперь, когда мета-поле есть, нужно на уровне вывода убрать отзывы. Для этого используем фильтр WooCommerce comments_open и отключаем комментарии (отзывы) для товаров с флагом _disable_reviews.
function disable_reviews_for_selected_products($open, $post_id) {
if (get_post_type($post_id) === 'product') {
$disable = get_post_meta($post_id, '_disable_reviews', true);
if ($disable === 'yes') {
return false;
}
}
return $open;
}
add_filter('comments_open', 'disable_reviews_for_selected_products', 10, 2);3. Дополнительно: отключаем вкладку отзывов на страницах товаров
Если тема выводит отзывы через вкладки, лучше убрать вкладку «Отзывы» для отключённых товаров.
function remove_reviews_tab_for_disabled_products($tabs) {
global $post;
if ($post && get_post_type($post) === 'product') {
$disable = get_post_meta($post->ID, '_disable_reviews', true);
if ($disable === 'yes' && isset($tabs['reviews'])) {
unset($tabs['reviews']);
}
}
return $tabs;
}
add_filter('woocommerce_product_tabs', 'remove_reviews_tab_for_disabled_products', 98);Проверка результата после внедрения
- Перейдите в админку WordPress и откройте редактирование любого товара.
- В боковой панели найдите мета-бокс «Отключить отзывы» и поставьте галочку, сохраните товар.
- Перейдите на страницу товара на фронтенде — отзывы и вкладка с отзывами должны отсутствовать.
- Для товаров без галочки отзывы должны отображаться как обычно.
Частые ошибки и как исправить
- Мета-бокс не отображается на странице товара. Проверьте, что функция добавления мета-бокса подключена через
add_action('add_meta_boxes')и что тип записи правильный (product). - Отзывы продолжают отображаться, несмотря на отключение. Возможно, тема или плагин принудительно выводят отзывы вне стандартных хуков. Проверьте, нет ли кастомных шаблонов или функций для отзывов.
- Не сохраняется значение мета-поля. Убедитесь, что nonce проверяется и имя поля в форме совпадает с обработчиком сохранения.
- Вкладка отзывов не пропадает. Убедитесь, что фильтр
woocommerce_product_tabsподключён с приоритетом не выше 98, чтобы переопределить другие фильтры.
Практические советы по безопасности и производительности
- Используйте
wp_nonce_fieldи проверку nonce при сохранении мета-полей для защиты от CSRF. - Проверяйте тип записи перед выполнением логики, чтобы не влиять на другие записи.
- Минимизируйте количество запросов к базе, используя кэширование мета-данных, если товаров очень много.
- Если много товаров с отключёнными отзывами, рассмотрите возможность массового проставления мета-поля через WP-CLI или SQL-запрос.
Таблица сравнения вариантов отключения отзывов на товарах WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное отключение в настройках товара | В админке у каждого товара выключить чекбокс отзывов | Просто, не требует кода | Трудоёмко при большом каталоге |
| Кастомное мета-поле + код (описано в статье) | Добавление чекбокса для массового и удобного управления | Гибко, автоматизация, легко расширять | Нужен базовый PHP-кодинг |
| Плагины для управления отзывами | Использование готовых решений с расширенными настройками | Много функций, удобный UI | Нагрузка, возможные конфликты, платные опции |