Как передавать URL-параметры для расширенных запросов таксономии с несколькими терминами для одной пользовательской таксономии

16 авг. 2011 г., 01:29:39
Просмотры: 20.2K
Голосов: 7

Этот ответ предоставляет код для запроса, который возвращает совпадение OR для термина таксономии:


global $query_string;
$args['tax_query'] = array(
    array(
         'taxonomy' => 'status'
        ,'terms'    => array( 'available', 'pending' ) // изменить на "sold" для второго запроса
        ,'field'    => 'slug'
    ),
);

Я хотел бы, чтобы мой шаблон таксономии получал значения терминов для массива ( ,'terms' => array( 'available', 'pending' ) ) из URL, так же как для одного термина.

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

Благодаря этому посту у меня есть постоянные ссылки, соответствующие файлам шаблонов следующим образом:

example.com/cptslugs                соответствует шаблону archive-cptname.php
example.com/cptslug/cpt-post        соответствует шаблону single-cptname.php
example.com/cptslugs/ctxslug/term   соответствует шаблону taxonomy-ctxname.php

Я хотел бы иметь что-то вроде:

example.com/cptslugs/ctxslug/term1/term2/

соответствующее моему шаблону taxonomy-ctxname.php так, чтобы get_query_var('term') возвращал массив терминов (term1,term2) из url.

но если бы я мог получить

example.com/cptslugs/ctxslug/?terms=term1,term2

для соответствия моему шаблону taxonomy-ctxname.php так, чтобы get_query_var('term') возвращал массив терминов (term1,term2) из url, возможно через правило перезаписи и фильтр, это тоже подошло бы.

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

ОБНОВЛЕНИЕ

Хорошо - @scribu пришел на помощь! -- возможно. Продолжил поиск и вот что нашел. Думал, что всё понял, но не могу заставить это работать.

?tax1=term1,term2&tax2=term2+term3

соответствует:


query_posts( array(
  'tax1' => 'term1,term2',
  'tax2' => 'term3+term4'
) );

что далее соответствует:


query_posts( array(
  'tax_query' => array(
    array(
      'taxonomy' => 'tax1',
      'field' => 'slug',
      'terms' => array('term1', 'term2'),
      'operator' => 'OR'
    ),
    array(
      'taxonomy' => 'tax2',
      'field' => 'slug',
      'terms' => array('term3', 'term4'),
      'operator' => 'AND'
    ),
) );

example.com/?ctxname=term1,term2

отображает шаблон главной страницы. Исправление: отображает taxonomy-ctxname.php когда ctxname написано правильно. Представьте себе!

example.com/?cptslug/ctxslug=term1,term2

(таксономия зарегистрирована со слагом cptslug/ctxslug) также отображает шаблон главной страницы.

example.com/cptslug/?ctxslug=term1+term2

отображает шаблон archive-ctpname.php.

Как получить URL, который отображает шаблон taxonomy-ctxname.php или taxonomy.php?

Затем, когда я разберусь с этим - предложения по красивым url приветствуются, но не обязательны.

ОБНОВЛЕНИЕ ДВА

example.com/?ctxname=term1,term2

и

example.com/ctpslugs/ctxslug/term1,term2/

Оба отображают taxonomy-ctxname.php как требуется. Смотрите подробности в моем ответе ниже.

0
Все ответы на вопрос 1
0

После добавления

 print_r($wp_query); 

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

example.com/?ctxname=term1+term2

ЧПУ-адреса с операторами '+' и ',' (обозначающими И и ИЛИ соответственно) распознаются только тогда, когда они не закодированы в URL.

example.com/cptslugs/ctxslug/term1,term2/ 

создает следующий объект WP_Tax_Query

[tax_query] => WP_Tax_Query Object
      (
          [queries] => Array
              (
                  [0] => Array
                      (
                          [taxonomy] => announcements_cats
                          [terms] => Array
                              (
                                  [0] => term1
                                  [1] => term2
                              )

                          [include_children] => 1
                          [field] => slug
                          [operator] => IN
                      )

                  [1] => Array
                      (
                          [taxonomy] => category
                          [terms] => Array
                              (
                                  [0] => 1
                              )

                          [include_children] => 
                          [field] => term_id
                          [operator] => NOT IN
                      )

              )

          [relation] => AND
      )

В то время как

example.com/cptslugs/ctxslug/term1+term2/

создает следующий объект WP_Tax_Query

[tax_query] => WP_Tax_Query Object
      (
          [queries] => Array
              (
                  [0] => Array
                      (
                          [taxonomy] => ctxname
                          [terms] => Array
                              (
                                  [0] => term1
                              )

                          [include_children] => 1
                          [field] => slug
                          [operator] => IN
                      )

                  [1] => Array
                      (
                          [taxonomy] => ctxname
                          [terms] => Array
                              (
                                  [0] => term2
                              )

                          [include_children] => 1
                          [field] => slug
                          [operator] => IN
                      )

                  [2] => Array
                      (
                          [taxonomy] => category
                          [terms] => Array
                              (
                                  [0] => 1
                              )

                          [include_children] => 
                          [field] => term_id
                          [operator] => NOT IN
                      )

              )

          [relation] => AND
      )

P.S.: Согласно этому: символы '+' и ',' являются 'зарезервированными символами' и могут использоваться в пути, параметрах и фрагменте URI, но не должны появляться в других частях URI. Думаю, это все же допустимо. Хотя кажется немного 'неправильным'.

16 авг. 2011 г. 09:20:53