
Как изменить структуру ссылок товаров WooCommerce без потери функциональности
Изменение структуры ссылок в WooCommerce — задача, с которой часто сталкиваются разработчики, чтобы сделать URL-адреса более понятными и дружественными для SEO. Однако, при изменении ссылок можно столкнуться с ошибками, такими как 404 для товаров, категорий, корзины или других системных страниц.
В этой статье мы расскажем, как правильно настроить пользовательские URL-адреса для товаров и категорий WooCommerce и сохранить корректную работу системных страниц, таких как корзина, оформление заказа и мой аккаунт.
Зачем изменять структуру ссылок?
По умолчанию WooCommerce генерирует ссылки для товаров в формате:/product/product-name/
И ссылки для категорий:
/product-category/category-name/
Иногда требуется изменить структуру, чтобы сделать URL-адреса более понятными, например:
- Для товаров:
/category-name/product-name/
- Для категорий:
/category-name/
Решение: настройка структуры ссылок
Ниже приведён код, который позволяет реализовать пользовательские URL для товаров и категорий, сохраняя работоспособность корзины и других системных страниц. // Изменение ссылок для товаров WooCommerce
add_filter('post_type_link', 'custom_product_permalink', 10, 2);
function custom_product_permalink($permalink, $post) {
if ($post->post_type === 'product') {
$terms = get_the_terms($post->ID, 'product_cat');
if (!empty($terms) && !is_wp_error($terms)) {
$category_slug = $terms[0]->slug; // Берем первую категорию
return home_url('/' . $category_slug . '/' . $post->post_name . '/');
}
}
return $permalink;
}
// Изменение ссылок для категорий товаров
add_filter('term_link', 'custom_category_permalink', 10, 3);
function custom_category_permalink($url, $term, $taxonomy) {
if ($taxonomy === 'product_cat') {
return home_url('/' . $term->slug . '/');
}
return $url;
}
// Добавление правил перезаписи
add_action('init', 'custom_rewrite_rules');
function custom_rewrite_rules() {
// Исключение системных страниц WooCommerce
$excluded_pages = ['cart', 'checkout', 'my-account', 'shop'];
foreach ($excluded_pages as $page) {
add_rewrite_rule('^' . $page . '/?$', 'index.php?pagename=' . $page, 'top');
}
// Правило для товаров
add_rewrite_rule('^([^/]+)/([^/]+)/?$', 'index.php?product=$matches[2]', 'top');
// Правило для категорий товаров
add_rewrite_rule('^([^/]+)/?$', 'index.php?product_cat=$matches[1]', 'top');
}
// Перегенерация правил перезаписи
add_action('after_switch_theme', 'flush_rewrite_rules');
add_action('woocommerce_after_register_post_type', 'flush_rewrite_rules');
Пошаговое объяснение
- Изменение ссылок для товаров:Функция
custom_product_permalink
изменяет структуру ссылок для товаров на/category-name/product-name/
. - Изменение ссылок для категорий:Функция
custom_category_permalink
формирует ссылки для категорий в формате/category-name/
. - Добавление правил перезаписи:Для товаров и категорий добавлены правила, чтобы WordPress мог правильно обрабатывать новые URL. Системные страницы WooCommerce (корзина, оформление заказа и т.д.) исключены из изменений, чтобы они продолжали работать корректно.
- Перегенерация правил перезаписи:При смене темы или загрузке WooCommerce правила автоматически обновляются.
Как применить изменения?
- Вставьте код в файл
functions.php
активной темы или в отдельный плагин. - Перейдите в Настройки → Постоянные ссылки и нажмите «Сохранить изменения». Это обновит правила перезаписи.
Проверка работы
После внедрения изменений проверьте следующие URL:- Товары:
/category-name/product-name/
- Категории:
/category-name/
- Корзина:
/cart/
- Оформление заказа:
/checkout/
- Мой аккаунт:
/my-account/