Сформулируйте URL-адрес для отображения сообщений с обоими терминами таксономии


Я хотел бы показать архив сообщений, которые имеют два общих термина таксономии. Так, например, я хотел бы показать все сообщения, в которых как термины "соус", так и "сыр" в пользовательской food таксономии.

Хитрость в том, что я хотел бы сделать это с помощью URL-адреса. Самое близкое, к чему я пришел, - это:

example.com?food[]=sauce&food[]=cheese

После проверки запроса $ из фильтра pre_get_posts я вижу, что:

WP_Tax_Query::__set_state(array(
   'queries' => 
  array (
    0 => 
    array (
      'taxonomy' => 'food',
      'terms' => 
      array (
        0 => 'sauce',
        1 => 'cheese',
      ),
      'field' => 'slug',
      'operator' => 'IN',
      'include_children' => true,
    ),
  ),

Поэтому я меняю operator на AND, как итак:

add_action('pre_get_posts', function($query) {

    $query->tax_query->queries[0]['operator'] = 'AND';

});

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

Согласно монитору запросов, основной запрос как таковой (и вы можете видеть, что он ищет записи, которые имеют либо из двух идентификаторов терминов.

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (6,9) )

Итак, как я могу сформулировать URL-адрес, чтобы получать только сообщения с обоими терминами таксономии?

Author: JakeParis, 2021-03-16

2 answers

Похоже, что вы можете определить логический оператор AND с параметрами URL, в частности, добавив "+" между вашими терминами, как это: url?taxonomy=term1+term2

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

Пример: https://example.com/blog?food=sauce +сыр

[tax_query] => WP_Tax_Query Object
        (
        [queries] => Array
            (
                [0] => Array
                    (
                        [taxonomy] => food
                        [terms] => Array
                            (
                                [0] => sauce
                            )
                        [field] => slug
                        [operator] => IN
                        [include_children] => 1
                    )
                [1] => Array
                    (
                        [taxonomy] => food
                        [terms] => Array
                            (
                                [0] => cheese
                            )
                        [field] => slug
                        [operator] => IN
                        [include_children] => 1
                    )
            )
        [relation] => AND

Обратите внимание, что связь определенно И между терминами.

В ходе локального тестирования я могу подтвердить, что возвращенные сообщения содержат только те, которые содержат ОБА термина.

  2
Author: jdm2112, 2021-03-17 19:39:50

Когда я регистрировал свою таксономию, я опустил аргумент "переписать", который затем по умолчанию был равен true. Поэтому по умолчанию WordPress хотел переписать URL-адрес как /food/whatever/. Сложность заключалась в том, что он действительно принимал формат ?food=whatever, но не принимал два разных термина в этом формате при соединении с плюсом.

Решение состояло в том, чтобы указать аргумент перезаписи register_taxonomy() следующим образом:

register_taxonomy( 'food', 'post', [
   ...
   'rewrite' => [
      'slug' => 'filter',
      'with_front' => false,
   ],
   ...
]);

А затем я могу использовать /food/sauce+cheese, как @jdm2112, и указать в документах.

  0
Author: JakeParis, 2021-03-23 16:33:30