Диагностика задачи: зачем и когда отключать отзывы на товары
В WooCommerce отзывы на товары включены по умолчанию, что полезно для привлечения доверия покупателей. Однако в ряде случаев нужно отключать отзывы автоматически по истечении определённого периода — например, для товаров с ограниченным сроком использования, сезонных коллекций или распродаж, когда отзывы после продажи теряют актуальность.
Без автоматизации это требует ручного отключения отзывов по каждому товару, что неудобно и приводит к ошибкам.
Пошаговое решение: автоматическое отключение отзывов по расписанию
1. Добавляем дату окончания отзывов для товара
Для управления сроками отзывов создадим метаполе _reviews_disabled_after, в котором будет храниться дата, после которой отзывы должны отключаться.
Добавим поле в админку товара через хук woocommerce_product_options_general_product_data:
add_action('woocommerce_product_options_general_product_data', function() {
woocommerce_wp_text_input([
'id' => '_reviews_disabled_after',
'label' => 'Дата отключения отзывов (ГГГГ-ММ-ДД)',
'description' => 'Отзывы будут автоматически отключены после этой даты',
'type' => 'date',
'desc_tip' => true
]);
});Сохраняем значение метаполя:
add_action('woocommerce_process_product_meta', function($post_id) {
if (isset($_POST['_reviews_disabled_after'])) {
update_post_meta($post_id, '_reviews_disabled_after', sanitize_text_field($_POST['_reviews_disabled_after']));
}
});2. Запускаем ежедневную проверку и отключаем отзывы
Используем WP-Cron для ежедневного запуска функции, которая проверит товары с указанной датой и отключит отзывы у тех, у кого срок истёк.
add_action('wp_loaded', function() {
if (!wp_next_scheduled('wc_disable_reviews_daily')) {
wp_schedule_event(strtotime('00:00:00'), 'daily', 'wc_disable_reviews_daily');
}
});
add_action('wc_disable_reviews_daily', function() {
$today = date('Y-m-d');
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_reviews_disabled_after',
'value' => $today,
'compare' => '<=',
'type' => 'DATE'
]
]
];
$query = new WP_Query($args);
while ($query->have_posts()) {
$query->the_post();
$product_id = get_the_ID();
update_post_meta($product_id, '_comments_enabled', 'no');
// Отключаем отзывы — отключение комментариев в WooCommerce
// Зависит от темы и настроек, дополнительно можно отключить поддержку комментариев
remove_post_type_support('product', 'comments');
}
wp_reset_postdata();
});3. Убедимся, что отзывы отключены у нужных товаров
WooCommerce использует стандартные комментарии WordPress для отзывов, поэтому отключение комментариев у товара отключит и отзывы.
Если тема или плагин кэшируют отзывы, очистите кэш после изменений.
Проверка результата
- В админке товара установите дату в поле «Дата отключения отзывов» на вчерашний день.
- Запустите вручную CRON-задачу (через WP-CLI или плагин для управления WP-Cron) или дождитесь её срабатывания.
- Откройте страницу товара на сайте — блок отзывов должен исчезнуть.
- В админке товара проверьте, что в настройках комментариев они отключены.
Частые ошибки и как их исправить
- Отзывы не отключаются у товаров с истекшей датой
Проверьте, что WP-Cron работает и задачаwc_disable_reviews_dailyзапланирована и выполняется. Для отладки используйте плагин WP Crontrol. - Отзывы отображаются, хотя комментарии отключены
Проверьте кэш сайта и браузера. Очистите кэш. Также убедитесь, что тема не выводит отзывы напрямую, игнорируя стандартные комментарии. - Поле дата не сохраняется
Проверьте наличиеnameу input и корректность$_POSTданных. В нашем коде используется правильный id и сохранение вwoocommerce_process_product_meta. - Отзывы отключаются у всех товаров
Проверьте метазапрос и формат даты. Дата в базе и сравнение должны быть в форматеY-m-d.
Практические советы по безопасности и производительности
- Используйте WP-Cron с осторожностью: если на сайте мало трафика, задания могут не запускаться вовремя. Для критичных задач настройте системный cron на сервере.
- Храните даты в формате
Y-m-d, чтобы упростить сравнения и сортировки. - Удаляйте неактуальные метаданные после отключения отзывов, чтобы не засорять базу.
- Для масштабных магазинов с тысячами товаров доработайте WP_Query с пагинацией и лимитами, чтобы не перегружать сервер.
Таблица сравнения способов отключения отзывов по расписанию
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное отключение | Выключение отзывов в настройках каждого товара | Просто, не требует кода | Сложно при большом количестве товаров, много ручной работы |
| Плагин для управления отзывами | Использование готового плагина с функционалом расписания | Удобно, часто есть интерфейс | Дополнительная нагрузка, возможны конфликты, зависит от поддержки плагина |
| Код с WP-Cron и метаполями | Автоматическое отключение отзывов через кастомный код | Гибко, полностью под контроль, нет лишних плагинов | Требует навыков разработки, нужно тестировать WP-Cron |