Проблема: неиспользуемые варианты товаров в WooCommerce и их влияние
При работе с WooCommerce магазином, особенно с большим ассортиментом, часто накапливаются вариативные товары с вариантами, которые долго не продаются или не используются. Такие варианты увеличивают размер базы данных, замедляют админку и могут сбивать покупателей с толку.
Автоматическое удаление неиспользуемых вариантов помогает поддерживать каталог в актуальном состоянии и повышать производительность сайта.
Диагностика: как определить, какие варианты можно удалять
Для удаления необходимо точно определить критерии «неиспользуемости». Обычно это:
- Варианты без продаж (продаж = 0)
- Варианты, которые не были в заказах в течение заданного периода (например, 6 месяцев)
- Варианты, которые не активны или скрыты
Проверить наличие продаж можно через запросы к таблице wp_woocommerce_order_items и связям с товарами, либо через метаполя варианта.
Пошаговое решение: скрипт для автоматического удаления неиспользуемых вариантов
Ниже пример рабочего кода, который удалит варианты товаров без продаж и без заказов за последние 180 дней. Код можно запускать разово или интегрировать в WP-Cron для периодической очистки.
<?php
// Функция для удаления неиспользуемых вариаций WooCommerce
function wc_delete_unused_variations( $days = 180 ) {
global $wpdb;
// Получаем дату отсечения
$date_cutoff = date( 'Y-m-d H:i:s', strtotime( "-" . intval($days) . " days" ) );
// Запрос для получения ID вариаций без продаж за последние $days
$query = $wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.meta_value = p.ID
LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_id = oim.order_item_id
LEFT JOIN {$wpdb->posts} o ON o.ID = oi.order_id AND o.post_type = 'shop_order' AND o.post_status IN ('wc-completed','wc-processing','wc-on-hold')
WHERE p.post_type = 'product_variation'
AND (o.post_date > %s OR o.post_date IS NULL)
GROUP BY p.ID
HAVING COUNT(o.ID) = 0",
$date_cutoff
);
$variation_ids = $wpdb->get_col($query);
if (empty($variation_ids)) {
return 'Нет вариаций для удаления';
}
$deleted_count = 0;
foreach ($variation_ids as $variation_id) {
wp_delete_post($variation_id, true); // Полное удаление вариации
$deleted_count++;
}
return "Удалено вариаций: $deleted_count";
}
// Пример вызова
// echo wc_delete_unused_variations(180);
?>Этот код использует прямой SQL-запрос для поиска вариаций без заказов за последние 180 дней и удаляет их.
Как интегрировать в WP-Cron для автоматизации
Чтобы запускать очистку регулярно, добавьте в functions.php:
// Планирование cron задачи
if ( ! wp_next_scheduled( 'wc_delete_unused_variations_cron_job' ) ) {
wp_schedule_event( time(), 'weekly', 'wc_delete_unused_variations_cron_job' );
}
// Обработчик cron
add_action( 'wc_delete_unused_variations_cron_job', function() {
wc_delete_unused_variations(180);
} );Проверка результата после внедрения
- В админке WooCommerce проверьте список вариаций товаров: ненужные должны исчезнуть.
- В БД можно проверить количество записей с
post_type = 'product_variation'до и после запуска. - Для логирования можно временно добавить вывод количества удаленных вариаций через
error_logили в отдельный файл.
Частые ошибки и как их исправить
- Удаляются нужные варианты: Проверьте правильность даты и условия запроса. Возможно, нужны более точные критерии, например фильтрация по статусу вариации.
- Не удаляется ни одна вариация: Возможно, в базе нет вариаций без заказов или ошибка в SQL-запросе. Включите отладку WP_DEBUG для выявления ошибок.
- Скрипт долго выполняется или приводит к таймауту: Уменьшите количество обрабатываемых вариаций за один запуск или разделите процесс на батчи.
Практические советы по безопасности и производительности
- Перед запуском скрипта сделайте резервную копию базы данных.
- Запускайте удаление в период низкой нагрузки сервера.
- Добавьте проверку прав пользователя для запуска скрипта вручную.
- Используйте WP-Cron для регулярной автоматизации, чтобы не нагружать сервер.
- Логируйте действия скрипта для аудита и восстановления при необходимости.
Сравнение методов удаления неиспользуемых вариантов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Удаление вручную через админку | Редактирование каждого товара и удаление вариантов | Простота, нет кода | Долго, неэффективно при большом количестве |
| Плагины очистки WooCommerce | Автоматизация, интерфейс | Удобство, поддержка | Дополнительная нагрузка, возможные конфликты |
| Код на PHP с WP-Cron | Автоматическое удаление по заданным правилам | Гибкость, контроль, без сторонних плагинов | Требует навыков, возможны ошибки в логике |