Диагностика проблемы: зачем и когда нужно удалять варианты товаров
В интернет-магазинах на WooCommerce с вариациями товаров часто возникает ситуация, когда некоторые варианты устаревают или становятся нерелевантными (например, сезонные цвета, размеры, отсутствующие у поставщика). Ручное удаление таких вариантов занимает много времени и чревато ошибками. Автоматизация этого процесса позволяет поддерживать актуальный каталог, снижать нагрузку на базу данных и улучшать UX.
Как определить варианты товаров для удаления
Первый шаг — сформулировать конкретное условие удаления. Например:
- Варианты с мета-данными, указывающими на устаревание (например,
_expiration_dateменьше текущей даты). - Варианты с определённым атрибутом (например, цвет
Синийв коллекции 2022 года). - Варианты без остатков на складе более 30 дней.
В этом примере рассмотрим удаление вариантов с мета-ключом _expiration_date, у которого дата истекла:
expiration_date < date('Y-m-d')Пошаговое решение: код для автоматического удаления вариантов
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин. Код запускается через WP-Cron по расписанию (ежедневно) и удаляет устаревшие варианты:
function wpacademy_delete_expired_variations() {
$today = date('Y-m-d');
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_expiration_date',
'value' => $today,
'compare' => '<',
'type' => 'DATE',
],
],
'fields' => 'ids',
];
$expired_variations = get_posts($args);
foreach ($expired_variations as $variation_id) {
wp_delete_post($variation_id, true); // true - без возможности восстановления
}
}
// Регистрируем ежедневное событие
if (!wp_next_scheduled('wpacademy_delete_expired_variations_hook')) {
wp_schedule_event(time(), 'daily', 'wpacademy_delete_expired_variations_hook');
}
add_action('wpacademy_delete_expired_variations_hook', 'wpacademy_delete_expired_variations');Объяснение:
get_postsвыбирает все вариации с датой истечения меньше текущей.wp_delete_postудаляет варианты без возможности восстановления.- WP-Cron запускает функцию ежедневно, чтобы автоматизировать процесс.
Проверка результата после внедрения
1. В админке WooCommerce перейдите в список вариаций и проверьте, что устаревшие варианты удалены.
2. Можно вывести в лог ID удалённых вариантов, добавив в функцию:
error_log('Deleted variation ID: ' . $variation_id);3. Для теста запустите функцию вручную, вызвав wpacademy_delete_expired_variations(); через консоль WP-CLI или временно добавив вызов в шаблон.
Частые ошибки и как их исправить
- Функция не удаляет варианты: проверьте, что мета-ключ
_expiration_dateсуществует и хранится в форматеY-m-d. - WP-Cron не срабатывает: убедитесь, что на сайте есть посещения или используйте системный cron для запуска
wp-cron.php. - Удаляются не те варианты: проверьте условие в
meta_query, возможно, дата сравнивается неправильно или используются другие мета-данные. - Удаление занимает много времени: используйте постраничный запрос с
posts_per_page, чтобы удалять частями.
Практические советы по безопасности и производительности
- Перед удалением создавайте резервную копию базы данных.
- Для больших магазинов ограничьте количество удаляемых вариантов за один запуск (например,
posts_per_page => 100). - Добавьте логирование в файл, чтобы отслеживать работу скрипта.
- Используйте транзакции базы данных для предотвращения частичных удалений при ошибках (требуется дополнительно через $wpdb).
- Отключите WP-Cron в wp-config.php и настройте системный cron для стабильной работы.
Сравнение способов удаления вариантов WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление в админке | Простота, контроль | Трудозатратно, риск ошибок |
| Удаление через плагин (например, WP Bulk Delete) | Простота настройки, без кода | Зависимость от стороннего кода, нагрузка на сервер |
| Кодовое решение с WP-Cron (как в статье) | Автоматизация, гибкость, без плагинов | Необходимы навыки разработки, настройка cron |