В WordPress по умолчанию URL записей формируются на основе структуры постоянных ссылок, но часто возникает задача сделать URL более компактными и логичными, особенно если вы используете кастомные типы постов (Custom Post Types) и кастомные таксономии. В этой статье разберём, как создать иерархию коротких URL в WordPress, сохраняя при этом удобочитаемость и SEO-дружелюбность.
Почему важна иерархия коротких URL в WordPress
Короткие URL удобнее для пользователей и поисковых систем. Они легче запоминаются и выглядят аккуратнее на страницах и в ссылках. Для интернет-магазинов, каталогов и других сайтов с большим количеством контента это особенно актуально.
Иерархия URL помогает структурировать контент, показывая связь между родительскими и дочерними элементами. Например, для типа поста «Продукты» можно сделать URL вида /products/category/product-name/, что будет отражать принадлежность товара к категории.
Но в WordPress по умолчанию для кастомных типов постов и таксономий URL получается длинным и не всегда удобным. Поэтому нужно настраивать правила перезаписи (rewrite rules) и, при необходимости, использовать плагины для упрощения работы.
Настройка иерархии коротких URL через rewrite rules
Рассмотрим пример, где у вас есть кастомный тип поста product и таксономия product_cat. Задача — сделать URL вида site.ru/category-slug/product-slug, без префикса типа поста.
Для этого нужно зарегистрировать кастомный тип поста и таксономию с правильными параметрами rewrite, а также добавить правила перезаписи.
Регистрация кастомного типа поста с кастомным rewrite
function wphierarchy_register_product_cpt() {
$args = [
'label' => 'Продукты',
'public' => true,
'has_archive' => true,
'rewrite' => [
'slug' => '', // убираем префикс типа поста
'with_front' => false,
],
'supports' => ['title', 'editor', 'thumbnail'],
'taxonomies' => ['product_cat'],
];
register_post_type('product', $args);
}
add_action('init', 'wphierarchy_register_product_cpt');Обратите внимание, что мы указали пустой слаг в rewrite, чтобы убрать префикс.
Регистрация таксономии с поддержкой пермалинков
function wphierarchy_register_product_cat_taxonomy() {
$args = [
'label' => 'Категории продуктов',
'hierarchical' => true,
'rewrite' => [
'slug' => '',
'with_front' => false,
'hierarchical' => true
],
];
register_taxonomy('product_cat', ['product'], $args);
}
add_action('init', 'wphierarchy_register_product_cat_taxonomy');Здесь важно указать параметр hierarchical => true в rewrite, чтобы поддерживалась вложенная иерархия категорий.
Добавление кастомных правил перезаписи
WordPress не умеет автоматически правильно разрешать такие URL без префиксов, поэтому добавим собственные правила:
function wphierarchy_add_rewrite_rules() {
add_rewrite_rule(
'^([^/]+)/([^/]+)/?$',
'index.php?product_cat=$matches[1]&product=$matches[2]',
'top'
);
}
add_action('init', 'wphierarchy_add_rewrite_rules');Это правило пытается сопоставить URL с двумя сегментами — первый как категория, второй как продукт.
После внесения изменений необходимо сбросить правила перезаписи, зайдя в админку WordPress в Настройки → Постоянные ссылки и просто сохранив настройки.
Обработка вложенных категорий в URL
Если у вас есть вложенные категории, например /category-parent/category-child/product-name/, то для правильной обработки потребуется более сложное правило.
function wphierarchy_add_rewrite_rules_with_nested_cats() {
add_rewrite_rule(
'^(.+?)/([^/]+)/?$',
'index.php?product_cat=$matches[1]&product=$matches[2]',
'top'
);
}
add_action('init', 'wphierarchy_add_rewrite_rules_with_nested_cats');Здесь в $matches[1] попадёт вся иерархия категорий через слеши, что позволяет поддерживать многоуровневую структуру.
Для правильного разрешения параметров запроса может потребоваться фильтрация через хук request или pre_get_posts, чтобы корректно найти продукт по слагу и учесть категорию.
Пример фильтрации запроса для точного поиска
function wphierarchy_filter_product_query($query) {
if (!is_admin() && $query->is_main_query() && $query->is_singular('product')) {
$product_slug = get_query_var('product');
$category_path = get_query_var('product_cat');
if ($product_slug && $category_path) {
// Можно добавить дополнительную логику проверки принадлежности продукта категории
}
}
}
add_action('pre_get_posts', 'wphierarchy_filter_product_query');Эта функция — скелет для дальнейшей реализации логики, если понадобится фильтровать посты по категориям из URL.
Полезные плагины для работы с короткими URL и иерархиями
Если хочется избежать сложностей с кодом, можно использовать плагины, которые помогают создавать красивые URL и управлять кастомными типами постов:
- Clearfy — оптимизация и управление ЧПУ, включая настройку rewrite.
- WPRemark — управление SEO и пермалинками с возможностью создания иерархий.
- ABC Pagination — улучшенная навигация и пагинация с поддержкой кастомных структур URL.
Советы для успешной реализации иерархии коротких URL в WordPress
1. Всегда сбрасывайте правила перезаписи после изменений, чтобы они вступили в силу.
2. Тестируйте все варианты URL с разной глубиной вложенности, чтобы убедиться, что не возникает конфликтов.
3. Если планируется многоуровневая иерархия категорий и постов, продумывайте логику разрешения URL заранее, чтобы избежать дублирования и ошибок 404.
4. Используйте функции с приставкой wphierarchy_ для вашего кода, чтобы избежать конфликтов с другими плагинами и темами.
Заключение
Создание иерархии коротких URL в WordPress с поддержкой кастомных типов постов — задача технически сложная, но вполне решаемая. Она улучшает удобство сайта и SEO, делает ссылки более понятными и красивыми. Используя правильные параметры rewrite, кастомные правила и фильтры, а также проверенные плагины, вы сможете реализовать гибкую структуру URL под ваши задачи.