Как передавать URL-параметры для расширенных запросов таксономии с несколькими терминами для одной пользовательской таксономии
Этот ответ предоставляет код для запроса, который возвращает совпадение 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 как требуется. Смотрите подробности в моем ответе ниже.
После добавления
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. Думаю, это все же допустимо. Хотя кажется немного 'неправильным'.
