Вопрос или проблема
Я бы использовал пользовательские типы записей и иерархические таксономии с одинаковым слагом. К счастью, я нашел хорошее решение на основе фильтра post_type_link здесь от TheDeadMedic.
mysite.com/products/category1/product-name1
mysite.com/products/category2/product-name2
mysite.com/products/category1/subcategory1/product-name1
mysite.com/products/category2/subcategory2/product-name2
...
Единственная проблема — страницы подкатегорий выдают 404.
Итак, эти URL работают:
mysite.com/products/category1/product-name1
mysite.com/products/category1/subcategory1/product-name1
Но страницы подкатегорий не работают в иерархической структуре:
mysite.com/products/category1/subcategory1
mysite.com/products/category2/subcategory2
Я могу получить доступ только к этим подкатегориям без иерархической структуры. Итак, эти URL работают:
mysite.com/products/subcategory1
mysite.com/products/subcategory2
У вас есть идеи, как я мог бы расширить решение TheDeadMedic для иерархических таксономий тоже.
Добавьте к регистрации таксономии:
'rewrite' => array( 'hierarchical' => true )
Ответ или решение
Вопрос о том, как настроить постоянные ссылки для пользовательских типов записей и иерархических таксономий с одинаковыми слагами, весьма актуален для разработчиков на платформе WordPress. Как вы уже упомянули, решение на основе фильтра post_type_link
, предложенное TheDeadMedic, является хорошим началом. Однако, чтобы обеспечить корректное поведение подкатегорий и избежать возникновения ошибки 404, потребуется внести некоторые изменения в код и настройки.
1. Настройка пользовательского типа записей и таксономий
Для того чтобы ваши URL-адреса работали корректно, необходимо правильно зарегистрировать ваш пользовательский тип записей и таксономию. Пример кода для регистрации пользовательского типа записей "продукты" и таксономии "категории":
function create_custom_post_type() {
register_post_type('products',
array(
'labels' => array(
'name' => __('Продукты'),
'singular_name' => __('Продукт')
),
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'products', 'with_front' => false),
)
);
register_taxonomy('product_category', 'products', array(
'hierarchical' => true,
'labels' => array(
'name' => __('Категории'),
'singular_name' => __('Категория')
),
'rewrite' => array('slug' => 'products', 'hierarchical' => true),
));
}
add_action('init', 'create_custom_post_type');
2. Настройка перманентных ссылок
Чтобы гарантировать, что URL-адреса подкатегорий работают должным образом, необходимо дополнительно использовать фильтр post_type_link
. Он позволяет изменить структуру URL для ваших пользовательских типов записей с учетом иерархичных таксономий:
function custom_post_type_link($post_link, $id = 0) {
$post = get_post($id);
if ($post->post_type == 'products') {
$terms = wp_get_post_terms($post->ID, 'product_category');
if ($terms) {
$term_slugs = array();
foreach ($terms as $term) {
$term_slugs[] = $term->slug;
}
return str_replace('%product_category%', join('/', $term_slugs), $post_link);
} else {
return str_replace('%product_category%', 'products', $post_link);
}
}
return $post_link;
}
add_filter('post_type_link', 'custom_post_type_link', 10, 2);
3. Добавление поддержки для подкатегорий
Чтобы страницы подкатегорий работали без проблем, вам нужно будет дополнительно зарегистрировать rewrite
для ваших таксономий, как предложено выше. Это позволит WordPress корректно обрабатывать иерархические URL-адреса.
function custom_rewrite_rules() {
add_rewrite_rule('^products/([^/]+)/?$','index.php?product_category=$matches[1]','top');
add_rewrite_rule('^products/([^/]+)/([^/]+)/?$','index.php?product_category=$matches[1]&name=$matches[2]','top');
}
add_action('init', 'custom_rewrite_rules');
4. Сброс постоянных ссылок
После внесения всех вышеперечисленных изменений не забудьте сбросить настройки постоянных ссылок в админке WordPress. Для этого достаточно перейти в раздел «Настройки» > «Постоянные ссылки» и нажать «Сохранить изменения», не внося никаких изменений.
Заключение
Теперь, после выполнения всех вышеописанных шагов, ваши URL-адреса должны работать корректно как для пользовательских типов записей, так и для иерархических категорий. Это позволит избежать ошибок 404 при переходе на страницы подкатегорий и обеспечит удобство навигации по вашему сайту. Если возникнут дополнительные вопросы или потребуется уточнение, не стесняйтесь задавать их.