Проблема: как автоматически удалять устаревшие товары в WooCommerce
В WooCommerce часто возникает задача автоматически удалять товары, срок действия которых истёк, например, товары с ограниченным сроком годности или временными акциями. Ручное удаление неудобно и требует времени, особенно при большом ассортименте. Встроенных функций для автоматического удаления таких товаров нет, поэтому необходимо реализовать кастомное решение с помощью WP-Cron.
Диагностика: что проверить перед реализацией
- Убедитесь, что у товаров есть метаполе с датой окончания срока (например,
_expiration_date), в форматеYYYY-MM-DD. - Проверьте, что WP-Cron работает корректно на вашем хостинге (не отключён и запускается регулярно).
- Определите, как должен обрабатываться товар — удаление из базы, перевод в черновики или изменение статуса.
Пошаговое решение: создание механизма удаления
1. Добавление метаполя для даты окончания товара
Если у товаров нет поля с датой окончания, добавьте его в админке через код или ACF. Пример добавления метаполя вручную при создании товара:
update_post_meta( $product_id, '_expiration_date', '2024-06-30' );2. Создание WP-Cron задачи для регулярной проверки
Добавьте в functions.php или в плагин следующий код для регистрации крон задачи:
if ( ! wp_next_scheduled( 'wc_delete_expired_products_daily' ) ) {
wp_schedule_event( time(), 'daily', 'wc_delete_expired_products_daily' );
}3. Функция удаления устаревших товаров
Реализуем функцию, которая будет запускаться ежедневно, искать товары с прошедшей датой и удалять их:
add_action( 'wc_delete_expired_products_daily', 'wc_delete_expired_products' );
function wc_delete_expired_products() {
$today = date( 'Y-m-d' );
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_expiration_date',
'value' => $today,
'compare' => '<',
'type' => 'DATE',
),
),
'post_status' => 'publish',
'fields' => 'ids',
);
$expired_products = get_posts( $args );
foreach ( $expired_products as $product_id ) {
wp_trash_post( $product_id ); // Можно заменить на wp_delete_post для полного удаления
}
}Проверка результата после внедрения
- Добавьте несколько тестовых товаров с датой окончания, например, вчерашним числом.
- Запустите функцию вручную, вызвав
wc_delete_expired_products()через админку или сниппет. - Проверьте, что товары переместились в корзину или удалены.
- Проверьте журнал ошибок и логи сервера на наличие сбоев при выполнении WP-Cron.
Частые ошибки и их исправление
- WP-Cron не запускается: Проверьте, что на сервере разрешён запуск cron, или настройте системный cron-задание, вызывающее
wp-cron.php. - Неверный формат даты: Метаполе даты должно быть в формате
YYYY-MM-DD, иначе сравнение не сработает. - Удаление не происходит: Проверьте, что статус товара
publish, и что в запросе нет ограничений по правам доступа. - Удаление слишком частое или пропуски: Убедитесь, что крон запускается ровно один раз в день, без дублирования задач.
Практические советы по безопасности и производительности
- Для безопасности используйте
wp_trash_post()вместоwp_delete_post()— это позволит восстанавливать товары в случае ошибки. - Ограничьте количество товаров, обрабатываемых за один запуск, чтобы избежать тайм-аутов. Например, добавьте параметр
posts_per_page= 50 и в следующий запуск обрабатывайте следующую партию. - Логируйте удалённые товары в отдельный файл для последующего аудита.
- Если на сайте много товаров, реализуйте пагинацию обработки, чтобы не перегружать базу.
Сравнение вариантов реализации удаления
| Метод | Плюсы | Минусы |
|---|---|---|
| Автоматическое удаление с WP-Cron | Полностью автоматизировано, не требует ручного контроля | Зависит от работы WP-Cron, возможны тайм-ауты при большом объёме |
| Ручное удаление через админку | Простота, полный контроль | Трудозатратно при большом количестве товаров |
| Использование сторонних плагинов | Готовые решения, удобный интерфейс | Дополнительные нагрузки, возможные конфликты, плата за функционал |