Как задать в WordPress вид для типа записи с использованием присвоенной таксономии?

Ссылка скопирована
1 ответ

Всем привет! Общий вопрос, на который не нашёл ответа в доке: Как задать в WordPress вид для типа записи с использованием присвоенной таксономии?

Например, я создал таксономию "Страна" для типа записи "Город". Как сделать так, чтобы открывалась запись по адресу "домен/страна/запись"?

Дополнительные вопросы

Все вопросы об одном и том же. И когда уже надоест?

  • Refguser, так как не смог разобраться в данном вопросе до конца.
  • Даниело Фронтендье, аа . всё надеешься что количество перерастёт в качество?
    А ведь мог послушать что я тебе сразу говорил..
  • Refguser, я помню твой совет и он верный, без спора, но, мне не понятен принцип кастомизации url's в WordPress.
  • Даниело Фронтендье, и поэтому всё время спрашиваешь про шаблоны.. Логика железная. :)
    Но на кой тебе тот принцип? Оно нафик никому ненужно, и ты только лишний гемморой создаёшь сам себе (повторяюсь, да).
  • Refguser, я отказался от идеи перезаписи урлов, сейчас меня интересует как это сделать "из коробки"?
  • Даниело Фронтендье, изучить иерархию шаблонов.
    Ида, один нюанс - после создания кастомного типа нужно зайти в настройки пермалинков. Обновлять не обязательно но не помешает.
  • Ответы:

    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

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    2
    Web-разработка Ответ

    В 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,
        ],
    ]);

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

    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'
        );
    });

    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 или свою логику. Иначе ссылки будут непредсказуемыми.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно