Диагностика задачи: зачем и когда нужно автоматическое удаление товаров по атрибуту
В интернет-магазинах на WooCommerce часто возникает необходимость автоматически скрывать или удалять из каталога товары с определёнными атрибутами. Например, товары с атрибутом "Сезон" = "Зима" после окончания сезона или товары с атрибутом "Статус" = "Снят с продажи". Ручное управление большим количеством товаров неудобно и приводит к ошибкам.
Автоматизация удаления по атрибуту позволяет:
- Поддерживать актуальность каталога без лишних усилий;
- Сократить нагрузку на базу данных и ускорить загрузку страниц;
- Снизить риски ошибок ручного удаления.
Пошаговое решение: удаление товаров с определённым атрибутом через wp-cron
1. Определяем нужный атрибут
Для примера возьмём атрибут pa_status (где pa_ — префикс таксономии для атрибутов WooCommerce) со значением removed.
2. Создаём функцию удаления товаров
function wc_delete_products_by_attribute() {
$taxonomy = 'pa_status';
$term_slug = 'removed';
// Получаем ID термина по слагу
$term = get_term_by('slug', $term_slug, $taxonomy);
if (!$term || is_wp_error($term)) {
return; // Термин не найден
}
// Запрос товаров с этим атрибутом
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => [
[
'taxonomy' => $taxonomy,
'field' => 'term_id',
'terms' => $term->term_id,
'operator' => 'IN'
]
],
'fields' => 'ids',
'post_status' => 'publish',
];
$products = get_posts($args);
if (empty($products)) {
return; // Нет товаров для удаления
}
// Удаляем товары
foreach ($products as $product_id) {
wp_delete_post($product_id, true); // true — безвозвратно
}
}3. Добавляем задачу в wp-cron для регулярного запуска
if (!wp_next_scheduled('wc_delete_products_cron_hook')) {
wp_schedule_event(time(), 'daily', 'wc_delete_products_cron_hook');
}
add_action('wc_delete_products_cron_hook', 'wc_delete_products_by_attribute');4. Добавляем код в functions.php темы или в отдельный плагин
Рекомендуется создать кастомный плагин, чтобы не потерять код при смене темы.
Проверка результата после внедрения
- Вручную назначьте атрибут
pa_status = removedкаким-либо товарам. - Запустите функцию вручную через админ-панель, например, через WP CLI:
wp eval 'wc_delete_products_by_attribute();' - Проверьте, что товары удалились без остатков в базе.
- Через сутки проверьте, что cron сработал и удалил новые товары с этим атрибутом, если они появились.
Частые ошибки и как исправить
- Термин не найден: убедитесь, что атрибут и значение существуют, проверьте префикс
pa_и слаг термина. - Защита от удаления: если товары не удаляются, проверьте права пользователя и наличие плагинов безопасности, которые могут блокировать
wp_delete_post. - Не срабатывает wp-cron: убедитесь, что на сайте посещаемость достаточная для запуска wp-cron или настройте системный cron.
- Удаление не навсегда: параметр
trueвоwp_delete_postзаставляет удалять без корзины. Для теста можно поставитьfalseи проверить корзину.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы перед массовым удалением товаров.
- Добавьте логирование удалённых продуктов, чтобы отслеживать действия:
function wc_delete_products_by_attribute() {
// ... существующий код
foreach ($products as $product_id) {
wp_delete_post($product_id, true);
error_log('Удалён товар ID: ' . $product_id);
}
}- При большом количестве товаров разбивайте удаление на части, чтобы не превышать лимиты памяти и времени выполнения.
- Не используйте удаление, если хотите просто скрыть товары — лучше изменить статус на
privateили использовать фильтры для исключения из каталога.
Сравнение вариантов удаления товаров по атрибуту
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное удаление через админку | Выбор и удаление товаров вручную | Просто, без кода | Трудозатратно, ошибки, не подходит для массовых изменений |
| Плагины автоматизации | Автоматическое удаление/скрытие по правилам | Удобно, готовые UI | Зависимость от сторонних плагинов, нагрузка |
| Код на wp-cron (описанный метод) | Автоматическое удаление по атрибуту через собственный код | Контроль, легковесность, без сторонних плагинов | Требует технических навыков, нужно мониторить корректность работы |