WordPress архивы родительской / детской таксономии - PullRequest
0 голосов
/ 18 апреля 2020

Я имею дело с WordPress Custom Post Types и Custom Taxonomies.

Я уже прочитал тонны подобных вопросов, но, к сожалению, до сих пор не пришел к точному случаю.

Моя цель:

Архивы:

siteurl / rewrite / parent-term-slug /                                  => archive 
siteurl / rewrite / parent-term-slug / child-term-slug                  => archive

Сообщений:

siteurl / rewrite / parent-term-slug / post-name-slug                   => post
siteurl / rewrite / parent-term-slug / child-term-slug / post-name-slug => post

Для достижения вышеуказанных результатов, У меня есть:

function register_my_cpt() {

    ...

    $my_cpt_arguments = array(

        ...
        'hierarchical'          => true,
        'has_archive'           => true,
        'rewrite'               => array('slug' => $rewrite . '/%term_slugs%', 'hierarchical' => true),

    );  

    register_post_type($my_cpt, $my_cpt_arguments);

}

add_action('init', 'register_my_cpt');

Затем у меня есть:

function manage_post_links($post_link, $post_object){

    if(is_object($post_object) && $post_object->post_type === $my_cpt){

        $get_object_terms = wp_get_object_terms($post_object->ID, $my_tax);

        $object_terms_slug = array();

        foreach($get_object_terms as $get_object_term) {

            $object_terms_slug[] = $get_object_term->slug;

        }

        $object_terms = implode('/',$object_terms_slug);

        if($object_terms){

                    return str_replace('%term_slugs%' , $object_terms , $post_link);
         }

    }

    return $post_link;

}

add_filter('post_type_link', 'manage_post_links', 1, 2);

И снова у меня есть

function register_my_taxonomy() {

    ...

    $my_tax_arguments = array(

        ...
        'hierarchical'          => true,
        'has_archive'           => true,
        'rewrite'               => array('slug' => $rewrite, 'hierarchical' => true),

    );  

    register_taxonomy($my_tax, $my_tax_arguments);

}

add_action('init', 'register_my_taxonomy');

Обратите внимание, что $rewrite имеет то же значение в custom taxonomy и custom post type

Мои текущие результаты:

Архивы:

siteurl / rewrite / parent-term-slug /                                  => it works
siteurl / rewrite / parent-term-slug / child-term-slug                  => it works

Сообщений:

siteurl / rewrite / parent-term-slug / post-name-slug                   => it DOES NOT work
siteurl / rewrite / parent-term-slug / child-term-slug / post-name-slug => it DOES NOT work

Полагаю, проблема в том, что из-за этой структуры я заставляю WordPress искать архив, даже когда вызывается один пост-слаг. Может быть, я должен отфильтровать запрос, проверив, существует ли архив, и, если нет, я должен заставить искать содержание сообщения.

Я прав?

РЕДАКТИРОВАТЬ

Это решение, встречающееся во многих других похожих вопросах, помогает мне понять, что, возможно, мне следует поработать над правилами перезаписи.

function manage_rewrite_rules($rules) {

    $newRules = array();    
    $newRules[$rewrite.'/(.+)/(.+)/(.+)/?$']    = 'index.php?'.$my_cpt.'=$matches[3]';
    $newRules[$rewrite.'/(.+)/(.+)/?$']         = 'index.php?'.$my_tax.'=$matches[2]';

    return array_merge($newRules, $rules);
}

add_filter('rewrite_rules_array', 'manage_rewrite_rules');

Этот набор правил (если я не ошибаюсь) говорит WordPress отображать содержимое сообщения, когда URL-адрес

siteurl / rewrite / one / two / three /

, и отображать содержимое архива, если URL-адрес

siteurl / rewrite / one / two / 

Проблема заключается в том, что у меня есть и архивы, и сообщения с URL-адресом как

siteurl / rewrite / one / two / 

Итак, теперь моя ситуация такова:

Архивы:

siteurl / rewrite / parent-term-slug /                                  => it works
siteurl / rewrite / parent-term-slug / child-term-slug                  => it works

Сообщений:

siteurl / rewrite / parent-term-slug / post-name-slug                   => it DOES NOT work
siteurl / rewrite / parent-term-slug / child-term-slug / post-name-slug => it works

Насколько это Подводя меня ближе к результату, я подозреваю, что это тупиковый путь.

...