Постоянные ссылки: пользовательский тип сообщения -> пользовательская таксономия -> сообщение

39

У меня возникают проблемы при работе с правилами переписывания WordPress, и я могу использовать некоторую помощь.

У меня есть пользовательский тип сообщения называется _shows_.

Все шоу имеют единую пользовательскую таксономическую категорию _show-category_.А, _show_которая никогда не будет иметь более одной категории _show-category_.

Я хотел бы, чтобы мои URL были направлены таким образом:

www.mysite.com/shows/  =>  archive-shows.php

www.mysite.com/shows/%category%/ => taxonomy-show-category.php

www.mysite.com/shows/%category%/%postname%/ => single-shows.php

Итак, в качестве примера из реального мира, допустим, у нас есть _show-category_«Foo» и _show_пост под названием «Bar», который имеет «Foo» _show-category_. Я ожидаю, что мое приложение WordPress будет выглядеть так:

www.mysite.com/shows/foo/ => shows all posts under the foo category
www.mysite.com/shows/foo/bar => shows the indivual post

Я стараюсь избегать плагинов, когда это возможно, но я открыт для любого решения.

Пол Т
источник
1
просто указываю вам на то, что я должен был сделать раньше ... wordpress.stackexchange.com/questions/102246/…
reikyoushin

Ответы:

70

Во- первых, зарегистрировать систематики и установить slugаргумент rewriteдля shows:

register_taxonomy(
    'show_category',
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows', 'with_front' => false ),
        // your other args...
    )
);

Затем зарегистрируйте свой тип сообщения и установите slug в shows/%show_category%, и установите has_archiveаргумент в shows:

register_post_type(
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows/%show_category%', 'with_front' => false ),
        'has_archive' => 'shows',
        // your other args...
    )
);

Наконец, добавьте фильтр для post_type_linkзамены категории шоу в отдельных постоянных ссылках шоу:

function wpa_show_permalinks( $post_link, $post ){
    if ( is_object( $post ) && $post->post_type == 'show' ){
        $terms = wp_get_object_terms( $post->ID, 'show_category' );
        if( $terms ){
            return str_replace( '%show_category%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;
}
add_filter( 'post_type_link', 'wpa_show_permalinks', 1, 2 );

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

Забыл has_archiveаргумент register_post_typeвыше, который должен быть установлен в shows.

Milo
источник
1
Майло, спасибо! Фильтр post_type_link был для меня недостающим элементом. Любой, кто читает эту ветку с той же проблемой, единственное, что следует отметить, - это небольшая ошибка в функции wpa_show_permalinks, где $ post-> post_type == 'show' на самом деле должно быть 'show'. Еще раз спасибо, Мило!
Пол Т
4
Если вы вносите изменения в существующий экземпляр WordPress, перейдите в «Настройки»> «Постоянные ссылки» и нажмите «Сохранить». Изменения, которые вы внесли в functions.php, не вступят в силу, пока вы этого не сделаете.
Джей Нили
2
Это почти сработало для меня в том, что таксономия отображается на странице типа поста, / post_type / taxonomy / является допустимой страницей (ранее 404), но мой / post_type / taxonomy / post является 404'ing. Я заметил, что при регистрации таксономии над обоими «show_category» регистрировались «show», хотя таксономией является только show_category. Я только регистрирую таксономию.
Justinavery
4
@Milo, есть ли способ заставить это работать с суб-подоходным налогом, как шоу / налог / подоходный налог / пост?
Бенн
2
Я так хотел, чтобы это сработало и для меня, но каждое единственное число заканчивается в 404 ....
Beee