Диагностика проблемы: почему нужно отключать неактивные товары
Если на WooCommerce-магазине остаются товары, которые не продаются длительное время, это ведёт к увеличению каталога, усложнённому управлению и возможному ухудшению показателей SEO из-за большого количества неактивных или устаревших позиций. Ручное отслеживание и деактивация таких товаров занимает много времени, особенно при большом ассортименте.
Решение: автоматизировать отключение товаров без заказов за заданный период — например, за последние 6 месяцев. Это позволит поддерживать каталог актуальным и повысит удобство управления магазином.
Как определить товары без заказов за определённый период
Для начала нужно проверить, какие товары не были куплены за, скажем, последние 180 дней. Это можно сделать с помощью SQL-запроса к базе данных WooCommerce или средствами PHP с использованием функций WooCommerce.
Пример SQL-запроса для выборки ID товаров без заказов за 180 дней:
SELECT p.ID FROM wp_posts p
LEFT JOIN (
SELECT im.meta_value AS product_id
FROM wp_woocommerce_order_items oi
JOIN wp_woocommerce_order_itemmeta im ON oi.order_item_id = im.order_item_id
JOIN wp_posts o ON oi.order_id = o.ID
WHERE im.meta_key = '_product_id'
AND o.post_status IN ('wc-completed', 'wc-processing')
AND o.post_date >= DATE_SUB(NOW(), INTERVAL 180 DAY)
GROUP BY im.meta_value
) recent_orders ON p.ID = recent_orders.product_id
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND recent_orders.product_id IS NULL;Этот запрос возвращает товары, для которых нет завершённых или обрабатываемых заказов за последние 180 дней.
Пошаговое решение: автоматическое отключение товаров без заказов
Реализуем функцию на PHP, которую можно запускать через WP-Cron для автоматической деактивации товаров без продаж.
Код для отключения товаров без заказов за 180 дней
function disable_products_without_orders( $days = 180 ) {
global $wpdb;
$query = $wpdb->prepare(
"SELECT p.ID FROM {$wpdb->prefix}posts p
LEFT JOIN (
SELECT im.meta_value AS product_id
FROM {$wpdb->prefix}woocommerce_order_items oi
JOIN {$wpdb->prefix}woocommerce_order_itemmeta im ON oi.order_item_id = im.order_item_id
JOIN {$wpdb->prefix}posts o ON oi.order_id = o.ID
WHERE im.meta_key = '_product_id'
AND o.post_status IN ('wc-completed', 'wc-processing')
AND o.post_date >= DATE_SUB(NOW(), INTERVAL %d DAY)
GROUP BY im.meta_value
) recent_orders ON p.ID = recent_orders.product_id
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND recent_orders.product_id IS NULL",
$days
);
$product_ids = $wpdb->get_col( $query );
if ( empty( $product_ids ) ) {
return;
}
foreach ( $product_ids as $product_id ) {
// Меняем статус товара на 'draft' (черновик) — отключаем отображение
wp_update_post( [
'ID' => $product_id,
'post_status' => 'draft',
] );
}
}
// Пример запуска функции
// disable_products_without_orders(180);Этот код безопасно переводит товары, не имеющие заказов за 180 дней, в статус «черновик», тем самым скрывая их с сайта.
Настройка WP-Cron для автоматического запуска
Добавьте следующий код в functions.php вашей темы или в плагин для планирования ежедневного запуска:
if ( ! wp_next_scheduled( 'disable_inactive_products_daily' ) ) {
wp_schedule_event( time(), 'daily', 'disable_inactive_products_daily' );
}
add_action( 'disable_inactive_products_daily', function() {
disable_products_without_orders( 180 );
} );Проверка результата после внедрения
- В административной панели WooCommerce перейдите в раздел «Товары» и убедитесь, что товары без заказов за последний период переведены в статус «черновик».
- Вы можете использовать SQL-запрос из раздела диагностики, чтобы проверить, что отключённые товары действительно не имеют заказов.
- Проверьте работу сайта — отключённые товары не должны отображаться на витрине и в поиске.
Частые ошибки и как их исправить
- Неверный префикс таблиц в запросах: в разных установках WordPress префиксы таблиц могут отличаться. Используйте
$wpdb->prefixдля динамического определения. - Неправильный статус заказа: учитывайте, что для WooCommerce статус заказа может быть «wc-completed» или «wc-processing» для успешных продаж. Если не учитывать оба — товары с незавершёнными заказами могут ошибочно отключаться.
- Отсутствие проверки прав пользователя: функция должна запускаться только с правами администратора или через WP-Cron, чтобы избежать случайного отключения.
- Конфликты с кешированием: после изменения статуса товаров очистите кеш сайта и, если есть, кеш WooCommerce для корректного отображения.
Практические советы по безопасности и производительности
- При большом количестве товаров разбивайте обработку на партии — например, по 100 товаров за раз, чтобы избежать превышения лимитов памяти и времени исполнения.
- Сделайте резервную копию базы данных перед внедрением автоматических изменений.
- Используйте транзиенты или мета данные для отметки уже обработанных товаров, чтобы не перезапускать обработку одних и тех же позиций.
- Для более гибкого управления рассмотрите использование плагина Clearfy Pro от WPShop для очистки и оптимизации WooCommerce.
Сравнение подходов к отключению товаров без заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное отключение | Админ вручную меняет статус товаров | Простой, не требует кода | Трудоёмко, не подходит для больших магазинов |
| Плагин для анализа продаж | Использует готовые решения с интерфейсом | Удобно, часто с дополнительными функциями | Может нагружать сайт, платные версии |
| Код с WP-Cron | Автоматический скрипт на PHP, запускаемый по расписанию | Гибко, без сторонних плагинов, под контролем | Требует навыков, возможны ошибки без тестирования |