Диагностика проблемы: почему нужно удалять товары без атрибутов и вариаций
В магазинах на WooCommerce часто возникают товары с незаполненными атрибутами или вариациями. Такие товары не отображаются корректно, создают путаницу в каталоге и мешают покупателям. Особенно это критично для магазинов с вариативными товарами, где отсутствие вариаций делает товар неполноценным.
Чтобы найти такие товары, можно использовать SQL-запросы и WP-CLI, либо написать PHP-скрипт для проверки и удаления.
Проверка наличия товаров без атрибутов и вариаций
Для начала убедимся, что такие товары действительно есть. Запрос для поиска товаров без атрибутов (custom taxonomy 'pa_*') и вариаций:
SELECT p.ID, p.post_title FROM wp_posts p
LEFT JOIN wp_term_relationships tr ON p.ID = tr.object_id
LEFT JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy LIKE 'pa_%'
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
GROUP BY p.ID
HAVING COUNT(tr.term_taxonomy_id) = 0;Этот запрос вернёт ID и название товаров без атрибутов.
Для вариативных товаров проверим, есть ли у них дочерние товары типа 'product_variation':
SELECT parent.ID AS product_id, parent.post_title, COUNT(variation.ID) AS variations_count
FROM wp_posts parent
LEFT JOIN wp_posts variation ON variation.post_parent = parent.ID AND variation.post_type = 'product_variation'
WHERE parent.post_type = 'product'
AND parent.post_status = 'publish'
GROUP BY parent.ID
HAVING variations_count = 0;Товары с zero вариаций требуют внимания.
Пошаговое решение: автоматизация очистки
1. Создание WP-CLI команды для удаления
WP-CLI — удобный инструмент для автоматизации. Создадим команду, которая удалит товары без атрибутов и вариаций.
if ( defined('WP_CLI') && WP_CLI ) {
WP_CLI::add_command('wc-cleanup products', function() {
global $wpdb;
// Получаем ID товаров без атрибутов
$products_no_attrs = $wpdb->get_col(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
LEFT JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy LIKE 'pa_%'
WHERE p.post_type = 'product' AND p.post_status = 'publish'
GROUP BY p.ID
HAVING COUNT(tr.term_taxonomy_id) = 0"
);
// Получаем ID вариативных товаров без вариаций
$products_no_variations = $wpdb->get_col(
"SELECT parent.ID FROM {$wpdb->posts} parent
LEFT JOIN {$wpdb->posts} variation ON variation.post_parent = parent.ID AND variation.post_type = 'product_variation'
WHERE parent.post_type = 'product' AND parent.post_status = 'publish'
GROUP BY parent.ID
HAVING COUNT(variation.ID) = 0"
);
$products_to_delete = array_unique(array_merge($products_no_attrs, $products_no_variations));
if (empty($products_to_delete)) {
WP_CLI::success('Нет товаров без атрибутов или вариаций для удаления.');
return;
}
foreach ($products_to_delete as $product_id) {
wp_delete_post($product_id, true);
WP_CLI::log("Удалён товар ID {$product_id}");
}
WP_CLI::success('Очистка товаров завершена.');
});
}2. Запуск команды
В консоли сервера выполните:
wp wc-cleanup productsКоманда выведет список удалённых товаров и успешное завершение.
3. Автоматизация с помощью cron
Чтобы регулярно удалять такие товары, можно добавить вызов команды в cron:
0 3 * * * /usr/bin/wp wc-cleanup products --path=/путь/к/wordpress --allow-rootЭто выполнит очистку ежедневно в 3 часа ночи.
Проверка результата
- Повторите SQL-запросы из раздела диагностики — они не должны возвращать товаров без атрибутов и вариаций.
- Проверьте каталог магазина на наличие пустых или битых товаров.
- Если использовался WP-CLI скрипт — убедитесь, что при повторном запуске он выводит "Нет товаров... для удаления".
Частые ошибки и их исправление
- Ошибка: WP-CLI команда не зарегистрировалась.
Причина: скрипт добавлен вне плагина или не подключен при запуске.
Решение: добавьте код в файл плагина или в functions.php темы, убедитесь, что WP_CLI определён. - Ошибка: Товары не удаляются.
Причина: недостаточно прав или wp_delete_post вызывается без второго параметра true.
Решение: используйте wp_delete_post($id, true) для полного удаления. - Ошибка: Удаляются нужные товары.
Причина: нет точной фильтрации по атрибутам и вариациям.
Решение: внимательно проверяйте SQL запросы, логируйте ID товаров перед удалением.
Практические советы по безопасности и производительности
- Перед запуском автоматического удаления всегда делайте резервную копию базы данных.
- Тестируйте скрипты на staging-сайте, чтобы избежать потери данных.
- Для больших магазинов используйте пагинацию при выборке товаров, чтобы не перегружать сервер.
- Добавьте логирование удалённых товаров в отдельный файл для аудита.
- Для повышения производительности очистку запускайте вне пиковых часов.
Сравнение вариантов удаления товаров без атрибутов и вариаций
| Метод | Преимущества | Недостатки |
|---|---|---|
| SQL-запрос + ручное удаление | Простота, контроль над выборкой товаров | Ручная работа, риск ошибок при удалении |
| WP-CLI команда с автоматическим удалением | Автоматизация, можно запускать по cron, быстро | Требует навыков работы с WP-CLI, риски при ошибках в коде |
| Плагин очистки (например, Clearfy Pro) | Интерфейс, дополнительные функции оптимизации | Потенциально платный, нагрузка на сайт |