Проблема: устаревшие атрибуты в товарах WooCommerce
При большом каталоге WooCommerce со временем атрибуты товаров могут устаревать или становиться неактуальными, например, сезонные характеристики, цвета или размеры, которые больше не используются. Это приводит к ошибкам фильтрации, ухудшению UX и негативно влияет на SEO. Автоматическое удаление товаров с такими атрибутами поможет поддерживать каталог в актуальном состоянии без необходимости ручной проверки.
Диагностика: как выявить товары с устаревшими атрибутами
Для начала нужно точно определить, какие атрибуты считать устаревшими. Например, у вас есть атрибут season с терминами winter, summer и spring, а вы хотите удалить все товары, где установлен season=summer.
Чтобы проверить наличие таких товаров, используйте WP-CLI или SQL-запросы, либо код в functions.php для выборки:
function get_products_with_attribute( $taxonomy, $term_slug ) {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => [
[
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => $term_slug,
],
],
'fields' => 'ids',
];
$query = new WP_Query( $args );
return $query->posts;
}
// Пример вызова
$summer_products = get_products_with_attribute( 'pa_season', 'summer' );
error_log( print_r($summer_products, true) );Замените pa_season на вашу таксономию атрибутов (префикс pa_ + slug атрибута).
Пошаговое решение: скрипт для автоматического удаления товаров с задаными атрибутами
Для удаления товаров с конкретным атрибутом используйте следующий PHP-код. Лучше запускать его однократно через отдельный плагин или подключать в консоли WP-CLI для безопасности.
function delete_products_by_attribute( $taxonomy, $term_slug ) {
$product_ids = get_products_with_attribute( $taxonomy, $term_slug );
if ( empty( $product_ids ) ) {
error_log('Товары с атрибутом не найдены.');
return;
}
foreach ( $product_ids as $product_id ) {
wp_delete_post( $product_id, true ); // true для полного удаления без перемещения в корзину
error_log('Удалён товар ID: ' . $product_id);
}
}
// Вызов функции
add_action( 'init', function() {
if ( current_user_can('administrator') && isset($_GET['delete_products']) && $_GET['delete_products'] === '1' ) {
delete_products_by_attribute( 'pa_season', 'summer' );
}
} );Чтобы запустить удаление, войдите под администратором и откройте https://example.com/?delete_products=1. После выполнения скрипт удалит все товары с атрибутом "summer".
Проверка результата
- Проверьте, что товары с нужным атрибутом удалены через админку WooCommerce (Товары).
- Используйте код из блока диагностики, чтобы убедиться, что товаров с этим атрибутом больше нет.
- Проверьте логи сервера на сообщения об удалении.
Частые ошибки и как их исправить
- Неправильный префикс таксономии атрибутов. Атрибуты всегда имеют префикс
pa_. Если указать только slug, товар не найдётся. - Запуск скрипта без прав администратора. Добавлена проверка
current_user_can('administrator'), иначе скрипт не сработает. - Удаление без резервного копирования. Удалённые товары восстановить будет невозможно. Перед запуском сделайте бэкап базы.
- Нагрузка на сервер при большом количестве товаров. Для крупных магазинов лучше удалять партиями с помощью крон-задачи или WP-CLI.
Практические советы по безопасности и производительности
- Никогда не запускайте массовые удаления на живом сайте без теста на локальной копии.
- Используйте WP-CLI для больших магазинов:
wp post delete $(wp post list --post_type=product --tax_query='taxonomy=pa_season,field=slug,terms=summer' --format=ids) --force. - Добавьте ограничение по времени и количеству удаляемых товаров за один запуск, чтобы избежать таймаутов и перегрузки.
- После удаления товаров обновите транзиенты и очистите кеш WooCommerce и плагинов кеширования.
Сравнение вариантов автоматического удаления товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| PHP-скрипт в теме или плагине | Гибкость, можно настроить под нужды | Риск ошибок, требует знаний PHP, может нагрузить сервер |
| WP-CLI | Быстро, безопасно, подходит для больших магазинов | Нужен доступ к серверу и знание консоли |
| Плагины для массового удаления | Удобный UI, без кода | Могут не поддерживать фильтрацию по атрибутам, нагрузка |