Вопрос: Файлы перезаписи URL и архивные шаблоны - тип публикации и таксономия

Я прошу прощения, если это трудный вопрос для понимания, но на самом деле это вопрос иерархии шаблонов /переписывает.

Я настроил несколько правил перезаписи, которые являются успешными, но я надеюсь, что смогу манипулировать ими, чтобы вызывать разные файлы шаблонов в иерархии, чтобы я мог более логично контролировать страницы архива. У меня есть пользовательский тип пост-новостей команды и спортивная таксономия. Моя цель состоит в том, чтобы иметь архив новостей команды только из определенного вида спорта и отдельный спортивный архив для всех сообщений и страниц, связанных с этой таксономией. К сожалению, я могу получить доступ к архиву спортивной таксономии только с моими текущими изменениями, а не с архивом CPT новостей команды.

Вот мои правила переписывания и объяснение того, что, по моему мнению, происходит:

add_rewrite_rule('^athletics/team/([^/]*)/news/?','index.php?post_type=team-news&sport=$matches[1]', 'top');

Этот файл вызывает taxonomy-sport.php , хотя я надеялся, что он вызовет archive-team-news.php . Мне нужна часть sport = , потому что я хочу показывать только новостные сообщения команды для этого вида спорта.

add_rewrite_rule('^athletics/sport/([^/]*)/?','index.php?sport=$matches[1]', 'top');

Эта статья правильно вызывает taxonomy-sport.php < /code> как я и надеялся.

Согласно плагину Query Monitor, иерархия шаблонов при запросе URL /athletics /team /varsity-football /news / такова:

  1. < li> taxonomy-sport-varsity-football.php
  2. taxonomy-sport.php --- тот, который использует
  3. taxonomy.php
  4. archive-team -news.php --- Я хочу, чтобы это был
  5. archive.php
  6. index.php

Есть ли способ заставить работать архив-team-news.php для этого URL? Нужно ли мне фильтровать иерархию ? Я довольно новичок в WP, поэтому не хочу слишком сильно меняться ...

РЕДАКТИРОВАТЬ 1: , чтобы упростить мою цель -

< Насколько я могу судить, p> ? post_type = [1] & amp; taxonomy = [2] всегда будет открывать архивную страницу таксономии . Могу ли я заставить его открыть страницу архива post-type ?

РЕДАКТИРОВАТЬ 2: я изменил 2-й параметр первого правила перезаписи в 'index.php? post_type = team-news' , и теперь отображается правильная страница архива ( archive-team-news.php ), но мне все еще нужно фильтровать дальше по таксономии как-то.

ПРИМЕЧАНИЕ. Плагин таксономии указан в URL-адресе как athletics /team /[taxonomy] /news /, поэтому теперь я пытаюсь Разберите URL-адрес для этого значения в PHP , но я бы предпочел решение WP (менее хакерское).

Ответы и комментарии:

если вы меняете порядок в URL, это что-то меняет index.php? sport = $ match [1] & post_type = team-news?
Создан 16-11-2017 10:01 mmm

Хорошая идея, но нет. Это то, что у меня было поначалу, поэтому я подумал, что если бы я «расставил приоритеты» по типу поста, поставив его первым, он мог бы работать, но это не так. : /
Создан 16-11-2017 10:48 Peter Arthur

Одна вещь, которую вы можете попробовать, это использовать пользовательский запрос var для прохождения налоговой проверки, а затем подключить pre_get_posts, чтобы вручную добавить налоговый запрос. Другое возможное решение - перехватить parse_query и вызвать архив типа записи. Вы можете отфильтровать иерархию, как вы упоминаете, но она все равно будет идентифицирована как налоговый архив в таких вещах, как body_class.
Создан 17-11-2017 02:21 Milo

Я обработал это с помощью ловушки pre_get_posts (спасибо, @Milo), передавая часть URL, которая соответствует слагу, который мне нужен. Надеюсь, что это поможет кому-то в будущем. Улучшения приветствуются. Благодарю.
функция filter_team_news_archives_by_sport_taxonomy ($ query) {

    if (is_post_type_archive ('team-news') && $ query-> is_main_query ()) {

            // Получить $ sport_slug с URL - https://stackoverflow.com/a/36002190/4107296
            $ url = (isset ($ _ SERVER ['HTTPS'])? "https": "http"). ": // $ _ SERVER [HTTP_HOST] $ _SERVER [REQUEST_URI]";
            $ parsed = parse_url ($ url);
            $ chunks = explode ('/', trim ($ parsed ['path'], '/'));
            // если URL-адрес имеет следующий формат: / athletics / team / [sport-slug] / news
            if ($ chunks [0] === 'атлетика' && $ chunks [1] === 'команда' && $ chunks [3] === 'news') {
                $ sport_slug = $ chunks [2];
                $ query-> set ('tax_query', массив (массив (
                    'таксономия' => 'спорт',
                    'field' => 'slug',
                    'term' => $ sport_slug,
                )));
            }
    }
}

add_action ('pre_get_posts', 'filter_team_news_archives_by_sport_taxonomy');
Создан 20-11-2017 08:19 Peter Arthur438