У меня есть обычная таксономия, назначенная двум типам сообщений. Как создать URL-адреса для разных архивов терминов для каждого типа сообщений?

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

Я также привязал таксономию «категория событий» к типу post post post post WordPress по умолчанию, используя функцию register_taxonomy_for_object_type .

Теперь у меня есть следующая рабочая схема URL:

  • Доступ осуществляется с помощью структуры URL-адреса site-name.com/article/post-slug
  • События подключаются с использованием структуры URL-адреса site-name.com/event/event-slug
  • В архивах участников категории событий есть URL-структура site-name.com/events/event-category-slug

Я сделал, что в журнале событий категории события отображаются только события, используя действие pre_get_posts со следующим кодом:

if (!$query->is_admin() && $query->is_main_query() && is_tax('event-category')) { $query->set('post_type', 'event'); } 

Моя проблема заключается в том, что я хочу иметь также страницы с архивами категорий, которые показывают только сообщения.

Если возможно, в идеале их можно будет получить с помощью URL site-name.com/articles/event-category-slug

Но если это невозможно, было бы хорошо иметь другой URL-адрес, если он приводит к тому, что страница содержит только сообщения в этой конкретной категории событий.

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

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

 'rewrite' => array('slug' => 'some-slug', 'with_front' => false) 

Вы можете заменить кое-что, что хотите. Возможно, можно заменить его на article/event-category чтобы получить нужные результаты.

Установка with_front в false удаляет блог в качестве префикса. Если вы изменили префикс блога на статью. Затем вы должны иметь возможность установить with_front в true и заменить some-slug на `event-category

Вот ссылка на дополнительную информацию о регистрации пользовательских таксономий https://clarknikdelpowell.com/blog/the-right-way-to-do-wordpress-custom-taxonomy-rewrites/

EDIT: можете ли вы сделать следующий полностью непроверенный, созданный пример кода из приведенной ниже ссылки:

 register_post_type( 'post', array( 'taxonomies' => array( 'event-category' ) ), array( 'rewrite' => array('slug' => 'some-slug', 'with_front' => false) // other arguments may be needed from other registration of taxonomy ) ); 

Ссылка: может ли несколько пользовательских типов сообщений использовать пользовательскую таксономию?

В итоге мне удалось найти решение:

Прежде всего, действие pre_get_posts, которое у меня было первоначально, было неудачным , потому что и события, и сообщения отображаются с использованием одного и того же шаблона ( таксономия-event-category.php ). Код, который я написал в pre_get_posts, заставил wordpress отображать только события в этом шаблоне, поэтому я удалил его.

Я заменил его на этот код, который фильтрует запрос в соответствии с запросом post_type var:

 if (is_tax('event-category')) { $query->set('post_type', get_query_var('post_type', 'event')); } 

(Если запрос var_type не существует, он по умолчанию принимает события).

Затем я добавил следующее правило перезаписи, которое позволяет WordPress распознавать URL адреса статей / категорий событий

 add_rewrite_rule('^articles/(?!page)(.+?)(?:/page/([0-9]*))*/?$', 'index.php?post_type=post&event-category=$matches[1]&paged=$matches[2]', 'top'); 

Требуется часть (?! Page) регулярного выражения, так что правило не запускается на постраничных URL-адресах, таких как статьи / страница / 2 , но все же запускается в статьях / event-category-slug / page / 2

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