Несколько пользовательских типов сообщений с использованием той же таксономии = расстройства URL

У меня есть два пользовательских типа сообщений:

  • Мероприятия
  • Компании

У меня новая таксономия, что обе эти акции CTP:

  • Места

Если я перейду на «domain.com/events/», я вижу архив всех событий, и если я перейду в «domain.com/businesses/», я увижу архив всех предприятий. Все идет нормально.

Если я перейду на «domain.com/locations/», я вижу архив всех событий и предприятий, что хорошо.

Однако, как я могу просматривать только места событий? «domain.com/locations/events» или «domain.com/events/locations» не работает.

Должен ли я изменить параметры перезаписи для таксономии местоположений или CPT? Кажется, я застрял!

Solutions Collecting From Web of "Несколько пользовательских типов сообщений с использованием той же таксономии = расстройства URL"

Вам нужно будет добавить некоторые новые правила перезаписи, к счастью, WordPress делает это довольно просто, используя несколько вызовов функций.

 // use the init action to modify rewrite rules add_action( 'init', function() { global $wp_rewrite; // add rewrite tag for the post type // - %posttype% is a new tag that will be replaced with the regex in the actual query // - the regex will extract the post_type name from the URL and use it in the query add_rewrite_tag( '%posttype%', '([^/]+)', 'post_type=' ); // create the new permastruct by combining the post type & taxonomy permastructs // - custom taxonomies and post types are added to the extra_permastructs array in WP_Rewrite // - change 'category' to desired taxonomy // - output will be '%posttype%/category/%category%' $types_and_cats_permastruct = '%posttype%' . $wp_rewrite->get_extra_permastruct( 'category' ); // add the permastruct for post type & taxonomy add_permastruct( 'post_type_and_category', $types_and_cats_permastruct, array( 'with_front' => true, // - with_front (bool) - Should the structure be prepended with WP_Rewrite::$front? Default is true. 'ep_mask' => EP_ALL_ARCHIVES, // - ep_mask (int) - Endpoint mask defining what endpoints are added to the structure. Default is EP_NONE. 'paged' => true, // - paged (bool) - Should archive pagination rules be added for the structure? Default is true. 'feed' => true, // - feed (bool) - Should feed rewrite rules be added for the structure? Default is true. 'forcomments' => false, // - forcomments (bool) - Should the feed rules be a query for a comments feed? Default is false. 'walk_dirs' => false, // - walk_dirs (bool) - Should the 'directories' making up the structure be walked over and rewrite // rules built for each in turn? Default is true. 'endpoints' => true // - endpoints (bool) - Should endpoints be applied to the generated rewrite rules? Default is true. ) ); } ); 

Поэтому, чтобы объяснить, что я делаю выше:

  1. Добавляем тег rewrite с помощью add_rewrite_tag() чтобы при добавлении пользовательского типа типа сообщения в URL-адрес (например, / events / location / uk /) он будет распознаваться с помощью обычного выражения, а в результате запроса WP post_type=events будет содержать post_type=events
  2. Создавая новый permastruct для создания правил для использования тега, который мы только что добавили, и существующей таксономии, в вашем случае это будет местоположение so /event/location/uk покажет uk события и /business/location/uk покажет uk предприятия
  3. Добавление нового permastruct с помощью add_permastruct() чтобы WP генерировал новые правила перезаписи при обновлении постоянных ссылок. В третьем параметре очень важно, чтобы walk_dirs установили значение false, поскольку вы получите некоторые нежелательные агрессивные правила перезаписи с архивами для /%posttype%/category/ and /%posttype%/

Gotchas

  • Создание ссылок – если вы хотите использовать the_terms() для вывода ссылок на местоположение для бизнеса или события, которое отображает только исходный тип сообщения, вам придется отфильтровать URL-адреса или написать пользовательскую функцию для вывода URL-адресов в соответствии с вашими пермаструктурами
  • Если вы никогда не хотите, чтобы в архиве перечислялись как события, так и предприятия, тогда две отдельные таксономии являются лучшей идеей, так как вам будет легче узнать, есть ли у этого термина какие-либо должности в нем, например. при создании ссылок и принятии решения о том, следует ли выводить ссылку на пустой архив или нет. В этом случае ответ @ Ричард-хауарт верен

Вы можете указать slug для использования в args при вызове функции register_taxonomy с помощью «rewrite».

Итак, у вас будет что-то вроде следующего:

 $args = array( 'labels' => $labels, 'rewrite' => array( 'slug'=>'events/locations' ) ); register_taxonomy( 'event_location_tax_name', 'event_location_cpt_name', $args ); 

И затем повторите для бизнеса:

 $args = array( 'labels' => $labels, 'rewrite' => array( 'slug'=>'businesses/locations' ) ); register_taxonomy( 'business_location_tax_name', 'business_location_cpt_name', $args ); 

Надеюсь, это поможет?!

Спасибо, Рик