Постійні посилання: користувацький тип публікації -> спеціальна таксономія -> публікація


39

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

У мене є власний тип публікації під назвою _shows_.

Усі шоу мають єдину власну таксономію категорії _show-category_.А _show_ніколи не матимуть більше однієї _show-category_.

Я хотів би, щоб мої адреси пройшли таким чином:

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...
    )
);

Далі зареєструйте тип своєї посади та встановіть слугу 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 );

EDIT

Забули has_archiveаргумент register_post_typeвище, на який слід встановити shows.


1
Міло, дякую! Фільтр post_type_link був для мене відсутнім фрагментом. Кожен, хто читає цю тему з тією самою проблемою, єдине, що слід зазначити, є невелика помилка у функції wpa_show_permalinks, де $ post-> post_type == 'show' насправді має бути 'show'. Ще раз дякую Міло!
Пол Т

4
Якщо ви вносите зміни в існуючий екземпляр WordPress, переконайтесь, що ви перейдіть у меню Налаштування> Постійні посилання та натисніть кнопку Зберегти. Зміни, внесені в function.php, не вступлять у дію до тих пір, поки ви цього не зробите.
Джей Нілі

2
Це майже спрацювало для мене в тому, що таксономія відображається на сторінці типу публікації, / post_type / таксономія / є законною сторінкою (раніше 404), але моя / post_type / таксономія / post - 404'ing. Я помітив, коли реєстрував таксономію вище обох "show_category", "show" реєструвались, навіть якщо тільки show_category є систематикою. Я лише реєструю таксономію.
Justinavery

4
@Milo будь-яким способом змусити це працювати з субподатком, як шоу / податки / підподатки / повідомлення?
Бенн

2
Я так хотів, щоб це працювало і для мене, але кожна особливість закінчується 404 ....
Бджола,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.