Как задать в WordPress вид для типа записи с использованием присвоенной таксономии?
Всем привет! Общий вопрос, на который не нашёл ответа в доке: Как задать в WordPress вид для типа записи с использованием присвоенной таксономии?
Например, я создал таксономию "Страна" для типа записи "Город". Как сделать так, чтобы открывалась запись по адресу "домен/страна/запись"?
Дополнительные вопросы
Все вопросы об одном и том же. И когда уже надоест?
А ведь мог послушать что я тебе сразу говорил..
Но на кой тебе тот принцип? Оно нафик никому ненужно, и ты только лишний гемморой создаёшь сам себе (повторяюсь, да).
Ида, один нюанс - после создания кастомного типа нужно зайти в настройки пермалинков. Обновлять не обязательно но не помешает.
Ответы:
1. Функция has_term() проверяет наличие у поста терминов
if ( has_term( '', 'post_tag' ) ) { echo 'У текущей записи есть метки'; } if ( has_term( 'triller', 'video' ) ) { echo 'Запись имеет термин triller в таксономии video'; } |
if ( has_term( '', 'post_tag' ) ) { echo 'У текущей записи есть метки'; } if ( has_term( 'triller', 'video' ) ) { echo 'Запись имеет термин triller в таксономии video'; }
2. В функцию регистрации типа записи register_post_type() можно передать параметр rewrite в котором описать правила ЧПУ для этого типа записи. Свои правила перезаписи ссылок добавляются на фильтре post_type_link
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В WordPress URL вида
/страна/записьдля кастомного типа записи с учётом таксономии делается через rewrite rules и фильтрpost_type_link. Сам WordPress по умолчанию не подставляет term в permalink кастомного типа автоматически, потому что у записи может быть несколько терминов одной таксономии.Пример: есть CPT
cityи таксономияcountry. Нужно получить URL/france/paris/. При регистрации CPT задайте rewrite со специальным плейсхолдером:register_post_type('city', [ 'public' => true, 'rewrite' => [ 'slug' => '%country%', 'with_front' => false, ], ]);
Потом замените плейсхолдер в ссылке записи:
add_filter('post_type_link', function ($permalink, $post) { if ($post->post_type !== 'city') { return $permalink; } $terms = get_the_terms($post->ID, 'country'); if (empty($terms) || is_wp_error($terms)) { return str_replace('%country%', 'no-country', $permalink); } $term = array_shift($terms); return str_replace('%country%', $term->slug, $permalink); }, 10, 2);
И добавьте rewrite rule, чтобы WordPress понял входящий URL:
add_action('init', function () { add_rewrite_rule( '^([^/]+)/([^/]+)/?$', 'index.php?country=$matches[1]&city=$matches[2]', 'top' ); });
После изменения правил нужно один раз сбросить permalinks: зайти в «Настройки → Постоянные ссылки» и нажать «Сохранить». На проде лучше делать это аккуратно и не постоянно в коде.
Важный момент: такой широкий rewrite может конфликтовать со страницами, рубриками и другими CPT. Поэтому для реального проекта безопаснее иметь префикс, например
/cities/france/paris/. Чистый URL без префикса красивый, но повышает риск конфликтов маршрутов.Если запись может иметь несколько стран, нужно выбрать одну основную: через отдельное meta-поле, Yoast primary term или свою логику. Иначе ссылки будут непредсказуемыми.