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

1 авг. 2013 г., 19:16:22
Просмотры: 77K
Голосов: 49

У меня возникли трудности с правилами перезаписи 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/ => показывает все записи в категории foo
www.mysite.com/shows/foo/bar => показывает отдельную запись

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

2
Комментарии

просто указываю вам на то, что мне уже приходилось делать ранее.. http://wordpress.stackexchange.com/questions/102246/wordpress-returns-404-on-custom-rewrite-rule-conflict-in-parameters

reikyoushin reikyoushin
1 авг. 2013 г. 20:14:18

Отличный вопрос, и принятый ответ от @Milo так хорошо написан, что действительно должен быть в официальной документации WordPress. Это ОЧЕНЬ распространенный сценарий использования правильных URL.

Khom Nazid Khom Nazid
6 апр. 2022 г. 04:36:29
Все ответы на вопрос 1
22
93

Сначала зарегистрируйте свою таксономию и установите аргумент slug в rewrite как shows:

register_taxonomy(
    'show_category',
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows', 'with_front' => false ),
        // другие ваши аргументы...
    )
);

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

register_post_type(
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows/%show_category%', 'with_front' => false ),
        'has_archive' => 'shows',
        // другие ваши аргументы...
    )
);

Наконец, добавьте фильтр к 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.

1 авг. 2013 г. 20:44:32
Комментарии

Мило, спасибо! Фильтр post_type_link был тем недостающим элементом, который я искал. Всем, кто читает эту ветку с такой же проблемой: обратите внимание, что в функции wpa_show_permalinks есть небольшая ошибка - вместо $post->post_type == 'show' должно быть 'shows'. Еще раз спасибо, Мило!

Paul T Paul T
2 авг. 2013 г. 08:38:46

Спасибо, Мило! Это решило мою проблему. Я пытался достичь похожего результата с помощью этого плагина, но переписанные URL выдавали 404 ошибку. Видимо, ручное решение было правильным путем.

Martin Sotirov Martin Sotirov
2 авг. 2015 г. 17:23:08

@milo, переходя с http://wordpress.stackexchange.com/questions/199456/custom-taxonomy-post-slug-permalink, я постоянно получаю 404 с этим подходом. Моя структура постоянных ссылок: %category%/%postname%

Atticus Atticus
23 авг. 2015 г. 20:47:23

Если вы вносите изменения в существующий экземпляр WordPress, обязательно перейдите в Настройки > Постоянные ссылки и нажмите "Сохранить". Изменения, которые вы внесли в functions.php, не вступят в силу, пока вы этого не сделаете.

Jay Neely Jay Neely
5 янв. 2016 г. 02:14:37

Это почти сработало у меня: таксономия отображается на странице типа записи, страница /post_type/taxonomy/ работает (ранее выдавала 404), но моя страница /post_type/taxonomy/post возвращает 404. Я заметил, что при регистрации таксономии выше регистрировались и "show_category", и "show", хотя только show_category является таксономией. Я регистрирую только таксономию.

justinavery justinavery
28 сент. 2016 г. 10:16:31

@Milo есть ли способ заставить это работать с подподтаксономией типа shows/tax/subtax/post ?

Benn Benn
26 янв. 2017 г. 16:22:16

Мне тоже было бы интересно узнать, как заставить это работать с дочерними таксономиями, например /shows/tax/subtax/postname

Solomon Closson Solomon Closson
22 февр. 2017 г. 05:01:39

Это действительно ценный прием, спасибо. Однако есть небольшая проблема: при использовании 'post_type_link' кнопка изменения/редактирования в админке на странице редактирования записи исчезает. Это означает, что slug записи станет неизменяемым, и если вы позже измените post_title, вы не сможете отразить это изменение в slug.

Luca Reghellin Luca Reghellin
4 авг. 2017 г. 08:57:46

Как (внутренне) 'shows/%show_category%' автоматически преобразуется в правильную таксономию/термин? Мне просто интересно. Официальная документация register_post_type не объясняет этого и не дает никакой информации, создавая впечатление, что мы можем передавать только обычные строки вместо полных структур постоянных ссылок. Также я не могу найти никакой документации о автоматическом создании тегов структуры постоянных ссылок при создании таксономии.

Luca Reghellin Luca Reghellin
4 авг. 2017 г. 12:07:51

@Stratboy Мне нужно попробовать еще раз, я не помню, чтобы в этом случае slug записи нельзя было редактировать. Я знаю, что в более сложных структурах мне приходилось использовать add_permastruct вместо этого. WP ничего не делает с %show_category% в данном случае, это просто заполнитель, который вам нужно заменить самостоятельно в фильтре post_type_link. На самом деле это может быть любой допустимый тег rewrite, например, если вы хотите использовать произвольное поле или что-то еще в URL.

Milo Milo
4 авг. 2017 г. 12:48:54

На самом деле, если вы посмотрите на $wp_rewrite сразу после регистрации типов записей, но до фильтра post_type_link, вы заметите, что тег %show_category% был сгенерирован, так же как и связанные с ним permastructures. Так что это странно, они существуют, поэтому распознаются, но, вероятно, WordPress не знает, как их обрабатывать.

Luca Reghellin Luca Reghellin
4 авг. 2017 г. 13:01:45

@stratboy show_category должен быть допустимым тегом rewrite, что и есть, потому что он был добавлен как часть регистрации таксономии, но это также может быть просто тег, добавленный через add_rewrite_tag. За кулисами это делает то же самое.

Milo Milo
4 авг. 2017 г. 16:44:44

Что делать, если вам нужен разный slug на разных языках? (например, WPML). И если у некоторых записей не задана категория, будет ли у них просто /shows/название-записи? Спасибо!

trainoasis trainoasis
5 дек. 2018 г. 09:05:14

В случае с WPML это работает для языка по умолчанию, но, к сожалению, не для других

Ivan Topić Ivan Topić
27 февр. 2019 г. 13:07:35

Мне так хотелось, чтобы это сработало и у меня, но каждая отдельная запись заканчивается ошибкой 404....

Beee Beee
2 мар. 2019 г. 18:39:59

К сожалению, у меня тоже получаются только 404 ошибки... даже после обновления постоянных ссылок.

W Biggs W Biggs
6 нояб. 2019 г. 00:04:46

WordPress 5.2.4 и WordPress 5.3 также приводили к 404 ошибкам с этим решением. Я создал вопрос на форуме поддержки WP, спрашивая, может ли кто-то поделиться знаниями о том, что изменилось в механизме перезаписи за последние годы, что могло сломать эту возможность.

Сейчас я использую плагин для управления структурой постоянных ссылок, и похоже, что этот плагин выполняет некоторый парсинг wp_query, чтобы ссылки работали корректно.

Rebecca Dessonville Rebecca Dessonville
13 нояб. 2019 г. 17:08:16

У меня была такая же проблема с 404 ошибками на страницах отдельных постов шоу, как и у других пользователей, но мне удалось обойти её, добавив add_rewrite_rule( 'shows/([^/]+)/([^/]+)', 'index.php?show =$matches[2]', 'top' ); в functions.php. Это правило будет сопоставлять вторую часть слага после 'show' с именем поста шоу.

Sarah Sarah
8 янв. 2020 г. 15:31:35

Решение Мило почти работает. К сожалению, тип записи теряется, и вместо пользовательского типа записи (CPT) используется шаблон по умолчанию.

bitkorn bitkorn
12 мая 2020 г. 13:33:27

Это почти сработало у меня – главная страница типа записи и страницы категорий работали нормально, но возникала проблема с отдельными записями! (WordPress считал запись подкатегорией и возвращал ошибку 404.) Недостающим шагом был фильтр rewrite_rules_array, как описано здесь: https://stackoverflow.com/a/23702560/915762

JoLoCo JoLoCo
27 июл. 2020 г. 20:40:48

Есть один минус – нельзя использовать одинаковые слаги для разных таксономий. Например, /post-type/taxonomy-1/seo-agency/ и /post-type/taxonomy-2/seo-agency/ не будут работать одновременно.

Faisal Ashfaq Faisal Ashfaq
11 сент. 2021 г. 22:35:45

@Sarah О БОЖЕ, ты мой СПАСИТЕЛЬ! Теперь это работает, наконец-то, О МОЙ БОГ! Спасибо тебе огромное! У меня был очень похожий кейс: у меня был тип записи "resource" с таксономией "resource_category". Страницы таксономии работали, архив работал, но одиночные записи — нет. Сработало это: add_rewrite_rule( '^resources/([^/]+)/([^/]+)', 'index.php?resource=$matches[2]', 'top' );

EmilyH EmilyH
12 окт. 2022 г. 23:24:56
Показать остальные 17 комментариев