Диагностика проблемы: зачем удалять пустые категории в WooCommerce
Пустые категории в WooCommerce — это категории товаров, в которых нет ни одного активного продукта. Они не только портят структуру каталога, но и негативно влияют на SEO и пользовательский опыт. Часто такие категории остаются после массовых изменений или импорта товаров.
Чтобы проверить наличие пустых категорий, можно воспользоваться SQL-запросом к базе данных или написать простой код в functions.php, который выведет список таких категорий.
function wpb_list_empty_product_categories() {
$args = array(
'taxonomy' => 'product_cat',
'hide_empty' => true,
);
$all_cats = get_terms($args);
$empty_cats = array();
$all_cats_all = get_terms(array('taxonomy' => 'product_cat', 'hide_empty' => false));
foreach($all_cats_all as $cat) {
if (!in_array($cat, $all_cats)) {
$empty_cats[] = $cat->name . ' (ID: ' . $cat->term_id . ')';
}
}
if (!empty($empty_cats)) {
echo '<pre>Пустые категории WooCommerce:\n' . implode("\n", $empty_cats) . '</pre>';
} else {
echo '<p>Пустых категорий не найдено.</p>';
}
}
add_action('admin_notices', 'wpb_list_empty_product_categories');
Добавьте этот код в functions.php вашей темы и зайдите в админку — вверху появится список пустых категорий.
Пошаговое решение: автоматическое удаление пустых категорий через код
Удалять категории вручную неудобно, особенно если их много. Ниже пример функции, которая удалит все пустые категории WooCommerce по крону или вручную.
function wpb_delete_empty_product_categories() {
$empty_cats = get_terms(array(
'taxonomy' => 'product_cat',
'hide_empty' => true,
'fields' => 'ids',
'meta_query' => array(),
));
// Получаем все категории, включая пустые
$all_cats = get_terms(array('taxonomy' => 'product_cat', 'hide_empty' => false, 'fields' => 'ids'));
// Определяем пустые категории
$empty_cat_ids = array_diff($all_cats, $empty_cats);
foreach ($empty_cat_ids as $cat_id) {
wp_delete_term($cat_id, 'product_cat');
}
}
// Запуск функции вручную
add_action('admin_init', function() {
if (isset($_GET['delete_empty_cats']) && current_user_can('manage_woocommerce')) {
wpb_delete_empty_product_categories();
wp_safe_redirect(admin_url());
exit;
}
});
Чтобы запустить удаление, перейдите в админку WordPress и добавьте в адресную строку ?delete_empty_cats=1. Например: https://example.com/wp-admin/?delete_empty_cats=1.
Автоматизация через WP-Cron
Чтобы регулярно очищать пустые категории, добавьте в functions.php следующий код:
if (!wp_next_scheduled('wpb_cron_delete_empty_cats')) {
wp_schedule_event(time(), 'daily', 'wpb_cron_delete_empty_cats');
}
add_action('wpb_cron_delete_empty_cats', 'wpb_delete_empty_product_categories');
Проверка результата после внедрения
- Зайдите в WooCommerce - Товары - Категории и убедитесь, что пустые категории исчезли.
- Повторно добавьте код диагностики, чтобы проверить, что пустых категорий нет.
- Проверьте, что страница категорий на сайте не содержит пустых разделов.
Частые ошибки и как их исправить
- Категории не удаляются: проверьте, что у пользователя есть права
manage_woocommerceили права администратора. - Удаляются нужные категории: функция определяет пустоту на момент выполнения, убедитесь, что категории действительно пустые. Перепроверьте вручную через админку.
- Код запускается на фронте: используйте проверку
is_admin()для ограничения выполнения в админке. - Ошибка базы данных: проверьте, что WooCommerce установлен и работает, а так же что таксономия
product_catсуществует.
Практические советы по безопасности и производительности
- Не запускайте удаление пустых категорий на каждом запросе — используйте WP-Cron или ручной запуск.
- Перед массовым удалением сделайте резервную копию базы данных.
- Используйте capability checks (
current_user_can) для защиты функции от неавторизованного вызова. - Для крупных каталогов с тысячами категорий лучше делать удаление партиями, чтобы избежать таймаутов.
- Чтобы снизить нагрузку, кешируйте результаты запроса категорий, если планируете выполнять диагностику часто.
Сравнение подходов к удалению пустых категорий WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, контроль | Много времени при большом количестве, риск пропустить |
| Плагин очистки (например, WP Sweep) | Удобство, дополнительные функции очистки | Зависимость от стороннего кода, возможна избыточность |
| Кодовое решение (как в статье) | Гибкость, автоматизация, без лишних плагинов | Необходимость навыков, ответственность за код |