Диагностика проблемы: зачем удалять товары без скидки автоматически
В крупных интернет-магазинах на WooCommerce часто появляются товары без актуальных скидок, которые устарели или не продаются. Ручное удаление таких товаров занимает много времени и может приводить к ошибкам. Автоматизация процесса удаления товаров без скидки помогает поддерживать каталог в актуальном состоянии, экономить место в базе и повышать удобство управления.
Пошаговое решение: как автоматически удалить товары без скидки
1. Создаем функцию для выборки товаров без скидки
Для начала нужно получить все товары, у которых нет активных скидок (sale price). WooCommerce хранит цену скидки в метаполе _sale_price. Если это поле пустое, скидки нет.
function get_products_without_sale_price() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_sale_price',
'value' => '',
'compare' => '=',
],
],
'fields' => 'ids',
];
$query = new WP_Query($args);
return $query->posts;
}2. Функция удаления товаров по ID
Теперь нужно пройтись по списку ID товаров и удалить их программно.
function delete_products_by_ids($product_ids) {
foreach ($product_ids as $product_id) {
wp_delete_post($product_id, true); // true - удаление без возможности восстановления
}
}3. Объединяем в задачу для автоматического запуска
Для удобства можно создать функцию, которую запускать вручную или через WP-Cron.
function auto_delete_products_without_sale() {
$products = get_products_without_sale_price();
if (!empty($products)) {
delete_products_by_ids($products);
}
}4. Настройка WP-Cron для регулярного запуска
Добавим задачу, которая будет запускать удаление товаров раз в неделю.
add_action('auto_delete_products_event', 'auto_delete_products_without_sale');
if (!wp_next_scheduled('auto_delete_products_event')) {
wp_schedule_event(time(), 'weekly', 'auto_delete_products_event');
}Как проверить, что удаление работает
1. Перед запуском функции auto_delete_products_without_sale() сделайте экспорт товаров или создайте бэкап базы.
2. Запустите функцию вручную через auto_delete_products_without_sale(); в файл functions.php или через WP-CLI.
3. Проверьте, что товары без скидок исчезли из админки и фронтенда.
4. Для мониторинга можно вывести количество удаленных товаров:
function auto_delete_products_without_sale() {
$products = get_products_without_sale_price();
if (!empty($products)) {
$count = count($products);
delete_products_by_ids($products);
error_log("Удалено товаров без скидки: $count");
}
}Частые ошибки и как их исправить
- Пустой или неправильный meta_query: если товары не удаляются, убедитесь, что ключ метаполя
_sale_priceнаписан правильно и что у товаров действительно отсутствует скидка. - Запуск крона не происходит: проверьте, активен ли WP-Cron, или настройте системный cron для запуска
wp-cron.php. - Удаление не происходит из-за прав доступа: функция
wp_delete_postтребует прав администратора, убедитесь, что выполняется код с нужными правами. - Удаляются товары с активной скидкой: возможно, у товаров есть скидка, но она не отражена в
_sale_price, например, применена через динамические правила. В этом случае нужно расширить логику.
Практические советы по безопасности и производительности
- Перед массовым удалением создайте резервную копию базы данных.
- Для больших магазинов используйте пакетную обработку, чтобы избежать таймаутов. Например, обрабатывать по 50 товаров за раз.
- Добавьте логирование действий для отслеживания удалений.
- Проверяйте наличие скидок не только в
_sale_price, но и в динамических правилах (если используются), чтобы не удалить нужные товары.
Сравнение вариантов автоматизации удаления товаров без скидки
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Простота, точечное удаление | Много времени, риск пропустить |
| Плагины для управления товарами | Удобный интерфейс, дополнительные фильтры | Нагрузка на сайт, возможная плата |
| Код с WP-Cron (как в статье) | Автоматизация, контроль, отсутствие дополнительных плагинов | Нужны базовые знания PHP, возможно доработка под кейс |