Как изменить структуру ссылок товаров 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/