Проблема дублирования слагов в WooCommerce при массовом импорте товаров
При импорте большого количества товаров в WooCommerce часто возникает ситуация, когда слаги (URL-адреса товаров) дублируются или генерируются некорректно. Это приводит к ошибкам 404, потере SEO-позиций и конфликтам с другими товарами. В WooCommerce слаг товара по умолчанию формируется из названия, но при повторении названий система добавляет окончание с числом. Однако при импорте через CSV или массовом обновлении слаги могут не обновляться автоматически.
Диагностика проблемы с слагами товаров
Для проверки наличия дубликатов слагов в базе данных выполните следующий SQL-запрос для таблицы wp_posts (замените префикс wp_ на ваш, если он другой):
SELECT post_name, COUNT(*) AS count FROM wp_posts WHERE post_type = 'product' GROUP BY post_name HAVING count > 1;Если запрос вернул строки, значит, слаги неуникальны и необходимо их исправить.
Также проверьте, как формируются слаги при импорте: если импортируемый файл содержит поле post_name, WooCommerce использует его без изменений, что может создавать дубли.
Пошаговое решение: автоматическое создание уникальных слагов при импорте и массовом обновлении
1. Создаем функцию для генерации уникального слага
Добавьте следующий код в functions.php вашей дочерней темы или в кастомный плагин:
function wplesson_generate_unique_slug( $slug, $post_ID = null, $post_type = 'product' ) {
global $wpdb;
$original_slug = $slug;
$suffix = 1;
// Проверка на уникальность
while ( $wpdb->get_var( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_name = %s AND post_type = %s AND ID != %d",
$slug, $post_type, $post_ID ? $post_ID : 0
) ) ) {
$slug = $original_slug . '-' . $suffix;
$suffix++;
}
return $slug;
}2. Используем хук для переопределения слага товара при сохранении
Добавьте фильтр, который будет применять уникальный слаг при сохранении товара:
add_filter( 'wp_unique_post_slug', 'wplesson_unique_product_slug_filter', 10, 6 );
function wplesson_unique_product_slug_filter( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) {
if ( $post_type === 'product' ) {
$slug = wplesson_generate_unique_slug( $original_slug, $post_ID, $post_type );
}
return $slug;
}3. Применение при массовом обновлении / импорте с WP All Import или другим плагином
Если используете плагин для импорта, убедитесь, что поле post_name не задается жестко в файле импорта. Если задается, очистите его, чтобы WordPress генерировал слаг автоматически с помощью нашего фильтра.
При массовом обновлении через WP-CLI или кастомный скрипт вызовите функцию wplesson_generate_unique_slug() для каждого товара для обновления слага.
Проверка результата
1. Повторите SQL-запрос на поиск дубликатов слагов. Результат должен быть пустым.
2. Зайдите в админку WooCommerce, отредактируйте товар с ранее дублирующимся слагом, сохраните и проверьте, что слаг уникальный.
3. При импорте новых товаров с одинаковыми названиями проверьте, что слаги автоматически уникализируются, например: product-name, product-name-1, product-name-2.
Частые ошибки и как исправить
- Ошибка: Слаги не меняются после импорта.
Причина: В CSV установлен столбецpost_nameс неуникальными значениями.
Решение: Уберите этот столбец или очистите его перед импортом. - Ошибка: Конфликт с плагинами SEO, которые кэшируют URL.
Причина: Кэширование старых URL.
Решение: Очистите кэш плагинов SEO и кэш браузера. - Ошибка: Функция не срабатывает при массовом обновлении через WP-CLI.
Причина: Не вызван фильтрwp_unique_post_slugили кастомный скрипт напрямую обновляет поле слага.
Решение: Вызовите функцию генерации уникального слага внутри скрипта.
Практические советы по безопасности и производительности
- Не меняйте слаги для товаров, уже проиндексированных поисковиками без необходимости, чтобы не терять SEO-трафик.
- Перед массовым обновлением сделайте резервную копию базы данных.
- Для большого каталога товаров используйте WP-CLI для выполнения скриптов без таймаутов PHP.
- Храните кастомный код в отдельном плагине, чтобы избежать потери при обновлении темы.
- Проверяйте работу кода на staging-сервере, чтобы избежать ошибок на рабочем сайте.
Сравнение способов решения проблемы с слагами WooCommerce
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Ручное редактирование слагов | Простота, контроль | Трудоемко, риск ошибок при большом каталоге | Подходит для единичных товаров |
| Использование плагинов для импорта с уникализацией | Автоматизация процесса | Могут не учитывать все случаи, зависят от плагина | Проверять настройки импорта |
| Кастомный фильтр wp_unique_post_slug | Гибкость, контроль, работает для всех способов импорта | Требует базовых навыков PHP, тестирования | Оптимальный вариант для разработчиков |