Диагностика проблемы: зачем нужно автоматическое удаление товаров
В интернет-магазинах на WooCommerce часто возникает необходимость автоматически удалять товары, которые устарели или имеют ограниченный срок действия. Например, это актуально для товаров с ограниченным сроком годности, сезонных предложений или временных акций. Ручное удаление занимает время и может привести к ошибкам, поэтому нужна автоматизация.
Пошаговое решение: настройка автоматического удаления товаров с помощью WP-Cron
1. Добавляем метаполе для срока действия товара
Для начала необходимо добавить метаполе с датой окончания товара. Это позволит задать индивидуальный срок действия для каждого товара.
function add_expiration_date_field() {
woocommerce_wp_text_input( array(
'id' => '_expiration_date',
'label' => __('Дата истечения срока (YYYY-MM-DD)', 'woocommerce'),
'description' => __('Введите дату, после которой товар будет автоматически удалён.', 'woocommerce'),
'type' => 'date',
'desc_tip' => true,
) );
}
add_action('woocommerce_product_options_general_product_data', 'add_expiration_date_field');
function save_expiration_date_field( $post_id ) {
$expiration_date = isset($_POST['_expiration_date']) ? sanitize_text_field($_POST['_expiration_date']) : '';
update_post_meta( $post_id, '_expiration_date', $expiration_date );
}
add_action('woocommerce_process_product_meta', 'save_expiration_date_field');2. Создаём событие WP-Cron для ежедневной проверки и удаления просроченных товаров
WP-Cron позволяет запускать функции по расписанию. Мы настроим задачу, которая будет запускаться раз в сутки и удалять просроченные товары.
function register_daily_product_cleanup_event() {
if ( ! wp_next_scheduled( 'daily_product_cleanup_hook' ) ) {
wp_schedule_event( time(), 'daily', 'daily_product_cleanup_hook' );
}
}
add_action( 'wp', 'register_daily_product_cleanup_event' );
function daily_product_cleanup_function() {
$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',
),
),
'fields' => 'ids',
);
$expired_products = get_posts( $args );
foreach ( $expired_products as $product_id ) {
wp_trash_post( $product_id ); // Можно использовать wp_delete_post для полного удаления
}
}
add_action( 'daily_product_cleanup_hook', 'daily_product_cleanup_function' );Проверка результата после внедрения
- Добавьте тестовый товар с датой истечения срока, например, вчерашним числом.
- Запустите задачу Cron вручную (например, с помощью плагина WP Crontrol или вызовом
do_action('daily_product_cleanup_hook')в functions.php). - Проверьте, что товар переместился в корзину или удалён (в зависимости от используемой функции удаления).
- Убедитесь, что товары с датой истечения в будущем остаются на месте.
Частые ошибки и как их исправить
- WP-Cron не срабатывает: по умолчанию WP-Cron запускается при заходе пользователей на сайт. Если трафика мало, задача может не запускаться. Решение — настроить системный Cron на сервере или использовать плагин WP Crontrol для тестирования.
- Неправильный формат даты в метаполе: всегда используйте формат
YYYY-MM-DD, иначе сравнение не сработает. Используйте тип поляdateвwoocommerce_wp_text_input. - Удаление товаров не происходит: проверьте права пользователя, под которым запускается WP-Cron, и убедитесь, что функция удаления вызывается без ошибок. Включите отладку ошибок WordPress для диагностики.
- Товары удаляются раньше времени: проверьте часовой пояс сайта и сравнение дат. Функция
date('Y-m-d')берёт дату сервера, убедитесь, что она совпадает с настройками WordPress.
Практические советы по безопасности и производительности
- Используйте
wp_trash_post()вместоwp_delete_post()для безопасного удаления, чтобы можно было восстановить товары при ошибке. - Если количество товаров большое, разбивайте выборку на порции с помощью параметров
posts_per_pageи пагинации, чтобы избежать превышения лимита памяти. - Регулярно очищайте корзину с удалёнными товарами, чтобы не засорять базу данных.
- Для критичных магазинов настройте системный Cron (например, через crontab на сервере), чтобы задачи выполнялись точно по расписанию.
Сравнение подходов к автоматическому удалению товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron (как в статье) | Не требует доступа к серверу, легко настраивается в коде | Зависит от посещаемости сайта, возможны задержки |
| Системный Cron (crontab) | Точный запуск, высокая надёжность | Требует доступа к серверу, знания администрирования |
| Плагины автоматизации (например, WP Crontrol) | Удобный интерфейс, управление расписанием | Дополнительная нагрузка, возможны конфликты с другими плагинами |