Пользовательский тип записи возвращает 404, если необязательная таксономия не включена - PullRequest
1 голос
/ 22 января 2020

Я пытаюсь создать пользовательский тип записи 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

...