Я пытаюсь создать пользовательский тип записи WordPress (faq) и таксономию (faq-category) со следующей структурой URL:
/ faqs /% faq-category% /% postname%
Я хочу, чтобы / faqs была страницей архива для всех сообщений faq, а / faqs /% faq-category% - страницей архива для всех сообщений faq с заданной таксономией.
Однако faq -категория не является обязательной, и не все часто задаваемые вопросы будут иметь. В этом сценарии мне нужна следующая структура URL:
/ faqs /% postname%
Я могу получить / faqs /% faq-category% /% postname%, чтобы вернуть правильный post и / faqs & / faqs /% faq-category% оба возвращают страницы архива, но когда я пытаюсь добавить сообщение без выбранной faq-категории (/ faqs /% postname%), я получаю 404.
Я регистрирую свой пользовательский тип записи и таксономию в плагине mu (я использую roots.io и расширенную библиотеку cpt ):
<?php
/**
* Test Custom CPT
*/
add_action( 'init', function() {
/**
* Test custom taxonomy
*/
register_extended_taxonomy( 'faq-category', 'faq', array(
# Use radio buttons in the meta box for this taxonomy on the post editing screen:
'meta_box' => 'radio',
# Show this taxonomy in the 'At a Glance' dashboard widget:
'dashboard_glance' => true,
# Set archive:
'has_archive' => 'faq-category',
# Show all posts on the post type archive:
'archive' => array(
'nopaging' => true
),
), array(
# Override the base names used for labels:
'singular' => 'FAQ Category',
'plural' => 'FAQ Categories',
'slug' => 'faq-category'
) );
/**
* Test custom post type
*/
register_extended_post_type( 'faq', array(
# Set icon
'menu_icon' => 'dashicons-products',
# Set query var
'query_var' => true,
# Make cpt public
'public' => true,
# Make cpt queryable
'publicly_queryable' => true,
# Non hierarchical post type
'hierarchical' => false,
# Add the post type to the site's main RSS feed
'show_in_feed' => true,
# Set archive
'has_archive' => 'faqs',
# Allow Gutenberg editor
'show_in_rest' => true,
# Show all posts on the post type archive:
'archive' => array(
'nopaging' => true
),
# Add supports to cpt
'supports' => array('title', 'taxonomy', 'editor', 'author', 'comments'),
), array(
# Override the base names used for labels:
'singular' => 'FAQ',
'plural' => 'FAQs',
'slug' => 'faq'
) );
} );
I Я также создаю пользовательскую структуру постоянных ссылок и связанный фильтр в плагине mu:
// Add our custom permastructures for custom taxonomy and post
add_action('init', 'add_faq_permastructure');
function add_faq_permastructure()
{
global $wp_rewrite;
add_permastruct('faq-category', 'faqs/%faq-category%', false);
add_permastruct('faq', 'faqs/%faq-category%/%faq%', false);
}
// Make sure that all links on the site, include the related taxonomy terms
add_filter('post_type_link', 'faq_permalinks', 10, 2);
function faq_permalinks($permalink, $post)
{
if ($post->post_type !== 'faq')
return $permalink;
$terms = get_the_terms($post->ID, 'faq-category');
if (!$terms)
return str_replace('%faq-category%/', '', $permalink);
$post_terms = array();
foreach ($terms as $term)
$post_terms[] = $term->slug;
return str_replace('%faq-category%', implode(',', $post_terms), $permalink);
}
Вот несколько ресурсов, которые я использовал для этого: https://gist.github.com/kasparsd/2924900 https://discourse.roots.io/t/category-listing-page-with-custom-taxonomy/12848/16