Диагностика проблемы: зачем удалять товары с пустой скидкой
В WooCommerce иногда возникает необходимость автоматически удалять товары, у которых в поле скидки (sale price) отсутствует значение. Это особенно актуально, если магазин настроен на работу с акционными товарами и нужно, чтобы товары без скидки автоматически исключались из каталога. Ручное удаление таких товаров занимает много времени. Автоматизация процесса решит эту задачу.
Где и как хранится скидка в WooCommerce
Скидочная цена товара хранится в метаполе _sale_price поста товара. Если это поле пустое или отсутствует, значит скидка не задана. Для вариативных товаров скидка может быть задана для каждой вариации отдельно.
Пошаговое решение: удаление товаров с пустым значением скидки
1. Создаем WP-CLI команду для массовой проверки и удаления
Используем WP-CLI, чтобы безопасно запускать удаление товаров из терминала. Такой подход удобен для больших магазинов и не влияет на время отклика сайта.
if (defined('WP_CLI') && WP_CLI) {
WP_CLI::add_command('wc-remove-empty-sale', function() {
$args = [
'post_type' => ['product', 'product_variation'],
'posts_per_page' => -1,
'post_status' => 'publish',
'meta_query' => [
'relation' => 'OR',
[
'key' => '_sale_price',
'compare' => 'NOT EXISTS',
],
[
'key' => '_sale_price',
'value' => '',
'compare' => '=',
]
]
];
$query = new WP_Query($args);
$deleted = 0;
foreach ($query->posts as $post) {
wp_delete_post($post->ID, true); // жесткое удаление
$deleted++;
}
WP_CLI::success("Удалено товаров с пустой скидкой: $deleted");
});
}2. Запускаем команду в терминале
В консоли сервера в корне сайта запускаем:
wp wc-remove-empty-saleКоманда удалит все товары и вариации с пустым значением скидки.
3. Альтернатива: удаление через Cron (для автоматизации)
Если WP-CLI недоступен, можно настроить WP-Cron для периодической очистки:
function wc_remove_empty_sale_schedule() {
if (!wp_next_scheduled('wc_remove_empty_sale_event')) {
wp_schedule_event(time(), 'daily', 'wc_remove_empty_sale_event');
}
}
add_action('wp', 'wc_remove_empty_sale_schedule');
add_action('wc_remove_empty_sale_event', function() {
$args = [
'post_type' => ['product', 'product_variation'],
'posts_per_page' => -1,
'post_status' => 'publish',
'meta_query' => [
'relation' => 'OR',
[
'key' => '_sale_price',
'compare' => 'NOT EXISTS',
],
[
'key' => '_sale_price',
'value' => '',
'compare' => '=',
]
]
];
$query = new WP_Query($args);
foreach ($query->posts as $post) {
wp_delete_post($post->ID, true);
}
});Как проверить, что решение работает
- После запуска WP-CLI команды или срабатывания Cron проверьте список товаров в админке WooCommerce — товары с пустым
_sale_priceдолжны исчезнуть. - Можно вручную проверить базу данных в таблице
wp_postmeta— записи с пустым или отсутствующим ключом_sale_priceдля удалённых товаров не должны присутствовать. - Для отладки WP-CLI выводит количество удалённых товаров.
Частые ошибки и как их исправить
- Удаление не происходит: возможно, WP-CLI не подключен или команда не зарегистрирована. Проверьте, что код добавлен в файл плагина или functions.php, и что WP-CLI доступен.
- Удаляются лишние товары: убедитесь, что в запросе правильно настроена meta_query, чтобы искать именно пустые значения
_sale_price. - Удаление товаров с вариациями некорректно: учитывайте, что вариации — отдельные посты типа
product_variation, их тоже нужно проверять отдельно. - Проблемы с производительностью: при большом количестве товаров стоит разбивать запросы на части или использовать WP-CLI, а не Cron.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы перед массовым удалением товаров.
- Используйте WP-CLI для безопасного и быстрого выполнения задач без перегрузки сайта.
- Для сайтов с большим каталогом разбивайте удаление на части с помощью параметров
posts_per_pageи пагинации. - Добавьте логирование операций удаления в файл для аудита и восстановления в случае ошибок.
- Если используете WP-Cron, убедитесь, что он запускается регулярно, иначе удаление не будет своевременным.
Сравнение подходов: WP-CLI vs WP-Cron
| Метод | Плюсы | Минусы | Рекомендуется для |
|---|---|---|---|
| WP-CLI команда | Быстро, надежно, не нагружает сайт, удобна для администраторов | Требует доступа к серверу и командной строке | Большие магазины, разовая массовая очистка |
| WP-Cron | Автоматизация, не требует ручного запуска | Зависит от посещаемости сайта, может запускаться с задержками | Малые и средние магазины, регулярное удаление |