Диагностика проблемы отсутствия вариаций и атрибутов у товаров WooCommerce
В интернет-магазинах на WooCommerce иногда появляются товары без заданных вариаций и атрибутов. Это может быть результатом ошибок импорта, некорректной работы плагинов, или незавершённого обновления каталога. Такие товары могут создавать путаницу для пользователей и администраторов, а также влиять на фильтрацию и поиск.
Чтобы выявить такие товары, необходимо проверить:
- Тип товара — вариативный или простой
- Наличие записей атрибутов
pa_*в метаданных товара - Наличие вариаций в дочерних товарах (для вариативных товаров)
С помощью SQL-запроса можно быстро получить список товаров без атрибутов и вариаций:
SELECT p.ID, p.post_title FROM wp_posts p
LEFT JOIN wp_postmeta pm ON p.ID = pm.post_id AND pm.meta_key LIKE 'attribute_%'
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
GROUP BY p.ID
HAVING COUNT(pm.meta_key) = 0;Этот запрос показывает товары, у которых нет метаданных с атрибутами. Для вариативных товаров дополнительно нужно проверить дочерние вариации.
Пошаговое решение: автоматическое удаление товаров без вариаций и атрибутов
Реализуем функцию, которая по крону или вручную удалит товары, у которых отсутствуют вариации и атрибуты. Такой подход поможет поддерживать базу в актуальном состоянии без мусора.
1. Функция для проверки товара
function has_attributes_or_variations( $product_id ) {
$product = wc_get_product( $product_id );
if ( ! $product ) {
return false;
}
// Проверка вариаций
if ( $product->is_type( 'variable' ) ) {
$variations = $product->get_children();
if ( ! empty( $variations ) ) {
return true;
}
}
// Проверка атрибутов
$attributes = $product->get_attributes();
foreach ( $attributes as $attribute ) {
if ( $attribute->is_taxonomy() ) {
$terms = wp_get_post_terms( $product_id, $attribute->get_name() );
if ( ! empty( $terms ) ) {
return true;
}
} elseif ( $attribute->get_options() ) {
return true;
}
}
return false;
}2. Функция удаления товаров без вариаций и атрибутов
function delete_products_without_variations_and_attributes() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
'fields' => 'ids',
);
$products = get_posts( $args );
$deleted_count = 0;
foreach ( $products as $product_id ) {
if ( ! has_attributes_or_variations( $product_id ) ) {
wp_delete_post( $product_id, true );
$deleted_count++;
}
}
return $deleted_count;
}3. Запуск функции вручную
Для теста можно добавить временный вызов в functions.php или использовать WP-CLI:
add_action( 'admin_init', function() {
if ( current_user_can( 'administrator' ) && isset( $_GET['delete_empty_products'] ) ) {
$deleted = delete_products_without_variations_and_attributes();
echo 'Удалено товаров без вариаций и атрибутов: ' . $deleted;
exit;
}
});Далее в браузере достаточно перейти по адресу https://example.com/wp-admin/?delete_empty_products=1 под администратором.
Проверка результата после внедрения
- Запустите SQL-запрос из раздела диагностики до и после удаления — количество товаров без атрибутов должно стать нулём.
- Проверьте в админке WooCommerce — товары без вариаций и атрибутов должны исчезнуть.
- Проверьте логи ошибок и отчёты на предмет случайных удалений.
Частые ошибки и как их исправить
- Удаляются нужные товары: проверьте, что функция
has_attributes_or_variationsкорректно определяет наличие вариаций и атрибутов. Часто атрибуты могут быть в собственных метах, не в taxonomy. - Ошибка памяти при большом количестве товаров: используйте постраничный запрос с
'posts_per_page' => 100и обработку по частям. - Неправильный статус товаров: убедитесь, что проверяются только опубликованные товары (
post_status = 'publish'), чтобы не удалять черновики или архивные товары.
Практические советы по безопасности и производительности
- Запускайте удаление только под пользователем с правами администратора, чтобы избежать случайных действий.
- Для больших магазинов используйте WP-CLI для командной строки — это позволит избежать таймаутов и перегрузки сервера.
- Перед массовым удалением сделайте резервную копию базы данных.
- Для регулярного контроля настройте WP-Cron задачу, но с осторожностью, чтобы не создавать нагрузку.
Сравнение способов удаления товаров без вариаций и атрибутов
| Метод | Плюсы | Минусы |
|---|---|---|
| SQL-запрос + ручное удаление | Быстрое выявление товаров | Ручная работа, риск ошибок |
| PHP-скрипт с циклом (как в статье) | Автоматизация, точный контроль | Потенциальные проблемы с производительностью |
| Плагины очистки каталога | Удобство, готовые решения | Могут быть избыточными и нагружать сайт |
В большинстве случаев рекомендуем использовать PHP-скрипт с разбивкой по партиям и предварительным тестированием.