В WordPress кастомные типы записей (Custom Post Types, CPT) позволяют расширять функциональность сайта, добавляя новые виды контента. Однако, неправильная настройка ЧПУ (человеко-понятных URL) для CPT может привести к проблемам с поисковой оптимизацией, конфликтам с другими URL и ошибкам 404. В этой статье мы разберём, как правильно настраивать URL для кастомных типов записей, учитывая особенности перезаписи ссылок, работу с таксономиями и примеры практического кода.
Что такое URL Rewrites и почему это важно для кастомных типов записей
WordPress использует механизм перезаписи URL (rewrite rules) для преобразования человеко-понятных адресов в запросы к базе данных. Для стандартных записей и страниц всё настроено по умолчанию, а для кастомных типов записей нужно вручную задавать правила, чтобы URL выглядел логично и SEO-дружественно.
Если не настроить URL правильно, у вас могут возникнуть проблемы:
- Ошибки 404 при попытке перейти на страницу записи CPT.
- Дублирующийся контент из-за неправильных URL.
- Потеря трафика и ухудшение индексации в поисковиках.
Поэтому важно уделить время правильной конфигурации.
Настройка кастомного типа записи с SEO-дружественным URL
Рассмотрим пример создания кастомного типа записи «portfolio» с ЧПУ в виде site.ru/portfolio/project-name. Для этого используется функция register_post_type с правильными параметрами.
function wpinfo_register_post_type_portfolio() {
$args = array(
'label' => 'Портфолио',
'public' => true,
'has_archive' => 'portfolio',
'rewrite' => array('slug' => 'portfolio', 'with_front' => false),
'supports' => array('title', 'editor', 'thumbnail'),
'show_in_rest' => true,
);
register_post_type('portfolio', $args);
}
add_action('init', 'wpinfo_register_post_type_portfolio');Здесь ключевые моменты:
has_archiveсо значением'portfolio'создаст архив CPT по адресу/portfolio/.rewrite['slug']задаёт базовый сегмент URL для записей.with_front = falseотключает добавление префикса (например, если у вас в permalink стоит /blog/).
Не забудьте после изменения правил перезаписей обновить настройки постоянных ссылок в админке WordPress (Настройки → Постоянные ссылки), чтобы новые правила заработали.
Работа с пользовательскими таксономиями и их URL
Часто кастомные типы записей дополняются своими таксономиями (категориями, тегами). Важно, чтобы URL таксономий тоже были SEO-оптимизированы и не конфликтовали с другими страницами.
Пример регистрации таксономии «portfolio_category» для CPT «portfolio» с ЧПУ site.ru/portfolio/category/design/:
function wpinfo_register_taxonomy_portfolio_category() {
$args = array(
'label' => 'Категории портфолио',
'hierarchical' => true,
'rewrite' => array('slug' => 'portfolio/category', 'with_front' => false),
'show_in_rest' => true,
);
register_taxonomy('portfolio_category', array('portfolio'), $args);
}
add_action('init', 'wpinfo_register_taxonomy_portfolio_category');Так мы чётко структурируем пространство URL, что положительно влияет на SEO и удобство пользователей.
Избегаем конфликтов URL с другими типами записей
Если у вас на сайте много кастомных типов и таксономий, важно следить, чтобы их слаги не пересекались. Например, одновременно использовать portfolio для типа записи и для страницы или другой таксономии — плохая практика, которая приведёт к ошибкам.
Используйте уникальные и логичные префиксы, например portfolio для CPT, portfolio_category с префиксом portfolio/category и т.д.
Обработка вложенных URL и дополнительные параметры
Иногда требуется более сложная структура URL с вложенными таксономиями или дополнительными параметрами. Рассмотрим, как добавить в URL подкатегории или фильтры.
Для этого нужно расширять правила перезаписи вручную с помощью фильтра rewrite_rules_array или использовать хуки при регистрации таксономий.
Например, для отображения фильтра по кастомному полю в URL:
function wpinfo_add_custom_rewrite_rules($rules) {
$new_rules = array(
'portfolio/filter/([^/]+)/?$' => 'index.php?post_type=portfolio&filter=$matches[1]',
);
return $new_rules + $rules;
}
add_filter('rewrite_rules_array', 'wpinfo_add_custom_rewrite_rules');В этом примере мы добавляем правило, которое позволяет использовать URL вида /portfolio/filter/value/, где value — значение фильтра.
Как проверить и отладить правила перезаписи URL
Для проверки, какие правила перезаписи есть в WordPress, используйте функцию print_r($wp_rewrite->rules) или плагины, например, Rewrite Rules Inspector.
Если URL для кастомного типа записи не работает, проверьте:
- Обновлены ли постоянные ссылки в настройках.
- Нет ли конфликтов в слагах.
- Правильно ли зарегистрирован CPT и таксономии.
- Не перекрываются ли правила другими плагинами или темами.
Полезные плагины для работы с URL и CPT
Для упрощения работы с перезаписями и URL можно использовать плагины:
- Clearfy Pro — для оптимизации и управления SEO-настройками, включая управление URL.
- ABC Pagination — для гибкой пагинации, которая часто необходима при кастомных архивах.
Использование этих инструментов облегчает настройку URL и повышает стабильность сайта.
Пример полной регистрации CPT с таксономией и ЧПУ
function wpinfo_register_portfolio_cpt_and_tax() {
// Регистрируем CPT
register_post_type('portfolio', array(
'labels' => array('name' => 'Портфолио'),
'public' => true,
'has_archive' => 'portfolio',
'rewrite' => array('slug' => 'portfolio', 'with_front' => false),
'supports' => array('title', 'editor', 'thumbnail'),
'show_in_rest' => true,
));
// Регистрируем таксономию
register_taxonomy('portfolio_category', 'portfolio', array(
'label' => 'Категории портфолио',
'hierarchical' => true,
'rewrite' => array('slug' => 'portfolio/category', 'with_front' => false),
'show_in_rest' => true,
));
}
add_action('init', 'wpinfo_register_portfolio_cpt_and_tax');После добавления этого кода в functions.php вашей темы или в кастомный плагин, не забудьте обновить постоянные ссылки.
Заключение
Правильная настройка URL для кастомных типов записей — залог удобства пользователей и хорошего SEO. Используйте уникальные слаги, структурируйте URL с помощью таксономий, проверяйте конфликты и обновляйте правила перезаписи. Если нужно, расширяйте функционал с помощью фильтров и плагинов, чтобы обеспечить гибкость и масштабируемость.