Вопрос или проблема
Я создаю пользовательский тип записи и соответствующую кастомную таксономию.
Вот код:
add_action( 'init', 'register_my_types' );
function register_my_types() {
register_post_type( 'help',
array(
'labels' => array(
'name' => __( 'Help Manager' ),
'singular_name' => __( 'Help' )
),
'public' => true,
'has_archive' => true,
'rewrite' => array(
'slug' => 'help/%help_categories%',
'with_front' => true
)
)
);
register_taxonomy( 'help_categories', array( 'help' ), array(
'hierarchical' => true,
'label' => 'Help Categories',
'rewrite' => array(
'slug' => 'help',
'with_front' => true
)
)
);
}
Я делаю переписывание, чтобы включить это в один красивый URL:
function so23698827_add_rewrite_rules( $rules ) {
$new = array();
$new['help/([^/]+)/(.+)/?$'] = 'index.php?help=$matches[2]';
$new['help/(.+)/?$'] = 'index.php?help_categories=$matches[1]';
return array_merge( $new, $rules ); // Убедитесь, что наши правила идут первыми
}
add_filter( 'rewrite_rules_array', 'so23698827_add_rewrite_rules' );
/**
* Обработать заполнитель URL '%project_category%'
*
* @param str $link Ссылка на запись
* @param WP_Post object $post Объект записи
* @return str
*/
function so23698827_filter_post_type_link( $link, $post ) {
if ( $post->post_type == 'help' ) {
if ( $cats = get_the_terms( $post->ID, 'help_categories' ) ) {
$link = str_replace( '%help_categories%', current( $cats )->slug, $link );
}
}
return $link;
}
add_filter( 'post_type_link', 'so23698827_filter_post_type_link', 10, 2 );
Я хочу включить любую подкатегорию в URL. Например, у меня есть следующая структура:
- Пользовательский тип записи
- Главная категория
- Подкатегория
- Пример записи
- Подкатегория
- Главная категория
Структура URL должна быть следующей www.domain.com/custom_post_type/main-category/sub-category/sample-post
Можете помочь мне это реализовать, пожалуйста
Вы можете попробовать этот плагин (или посмотреть его код)
https://wordpress.org/plugins/wp-better-permalinks/
Он позволяет вам изменить структуру пользовательских дружественных постоянных ссылок на Пользовательский тип записи > Таксономия > Запись и Пользовательский тип записи > Таксономия вместо стандартной структуры WordPress.
Он предоставляет различные шаблоны структуры постоянных ссылок:
Пользовательский тип записи > Одиночный термин (или Дерево терминов) > Запись
Пользовательский тип записи > Запись (когда не выбрана категория)
Пользовательский тип записи > Одиночный термин (или Дерево терминов)
Это очень помогло мне с этой проблемой…
Ответ или решение
Построение ЧПУ для Кастомного Пост Type, Таксономий и Подкатегорий
При разработке кастомного типа постов и таксономий в WordPress важной задачей является создание удобных и читабельных URL-адресов. Для достижения цели создания структуры URL, такой как www.domain.com/custom_post_type/main-category/sub-category/sample-post, необходимо правильно настроить как сам кастомный тип, так и таксономии с использованием механизма перезаписи (rewrite rules).
Настройка Кастомного Пост Type и Таксономий
В приведённом вами коде заложены основные функциональные возможности кастомного типа постов, но для достижения желаемой структуры URL необходимо внести некоторые изменения. Вы уже создали кастомный тип постов help
и таксономию help_categories
, однако вам также потребуется поддержка подкатегорий и правильная обработка их в URL-адресах.
Код для Регистрирования Кастомного Типа и Таксономий:
add_action( 'init', 'register_my_types' );
function register_my_types() {
register_post_type( 'help',
array(
'labels' => array(
'name' => __( 'Help Manager' ),
'singular_name' => __( 'Help' )
),
'public' => true,
'has_archive' => true,
'rewrite' => array(
'slug' => 'help/%help_categories%',
'with_front' => true
)
)
);
register_taxonomy( 'help_categories', array( 'help' ), array(
'hierarchical' => true,
'label' => 'Help Categories',
'rewrite' => array(
'slug' => 'help',
'with_front' => true
)
));
// Регистрируем подкатегории
register_taxonomy( 'help_subcategories', 'help_categories', array(
'hierarchical' => true,
'label' => 'Help Subcategories',
'rewrite' => array(
'slug' => 'help',
'with_front' => true
)
));
}
Настройка Перезаписи URL
Чтобы настроить перезапись URL для формирования нужной структуры, стоит использовать функцию add_rewrite_rules
. Мы добавим правила для обработки подкатегорий. Вот обновлённый код:
function so23698827_add_rewrite_rules( $rules ) {
$new = array();
$new['help/([^/]+)/([^/]+)/([^/]+)/?$'] = 'index.php?help=$matches[3]';
$new['help/([^/]+)/([^/]+)/?$'] = 'index.php?help_subcategories=$matches[2]&help_categories=$matches[1]';
$new['help/([^/]+)/?$'] = 'index.php?help_categories=$matches[1]';
return array_merge( $new, $rules ); // Сливаем с существующими правилами
}
add_filter( 'rewrite_rules_array', 'so23698827_add_rewrite_rules' );
Модификация Построения Ссылок
Чтобы динамически формировать ссылки на посты с учётом категорий и подкатегорий, нужно модифицировать функцию фильтрации ссылок:
function so23698827_filter_post_type_link( $link, $post ) {
if ( $post->post_type == 'help' ) {
if ( $terms = get_the_terms( $post->ID, 'help_categories' ) ) {
$category = current($terms)->slug;
if ( $sub_terms = get_the_terms( $post->ID, 'help_subcategories' ) ) {
$sub_category = current($sub_terms)->slug;
$link = str_replace( '%help_categories%', $category, $link );
$link = str_replace( '%help_subcategories%', $sub_category, $link );
} else {
$link = str_replace( '%help_categories%', $category, $link );
}
}
}
return $link;
}
add_filter( 'post_type_link', 'so23698827_filter_post_type_link', 10, 2 );
Применение и Тестирование
После внесения всех изменений нужно выполнить следующее:
- Перейдите в админ-панель WordPress.
- Откройте раздел Настройки → Постоянные ссылки.
- Нажмите кнопку "Сохранить изменения", чтобы обновить правила перезаписи.
Теперь ваша структура URL должна корректно обрабатывать кастомные посты с указанием категорий и подкатегорий.
Заключение
Следуя указанным рекомендациям, вы сможете реализовать требуемую структуру URL в своем проекте. Если потребуется больший контроль над структурой ссылок, рекомендую использовать специализированные плагины, такие как WP Better Permalinks, которые предоставляют более гибкие возможности настройки.
Важно периодически тестировать ваш сайт после внесения изменений, чтобы убедиться в корректности работы всех ссылок и отсутствия ошибок при навигации.