Как выполнить поиск в определенной категории таксономии
Моя проблема заключается в следующем: у меня есть 3 пользовательских таксономии, скажем, "автор", "заголовок" и "редактор", каждая из которых применяется к обычным сообщениям. Допустим, у меня есть post_1 с полем "автор" "Хорхе Борхес" и post_2 с "Рэй Брэдбери".
Я пытаюсь получить форму поиска с выпадающим меню, содержащим три таксономии и текстовое поле, так что если я выберу, например, "автора" и поиска "Хорхе Борхес", результат будет post_1.
Две другие таксономии должны работать так же.
Я не мог найти ничего подобного, так как многие вопросы касаются создания выпадающего меню со всеми случаями таксономии, а это не то, что я хочу. Я хочу выпадающее меню с категориями таксономии, а не значениями.
1 ответ
Хорошо, вот то, что я придумал и протестировал на своем сайте.
Обратите внимание, что это довольно сыро (то есть без стилевого оформления), и вам, вероятно, потребуется добавить к нему некоторую устойчивость на случай, если вы получите неожиданные результаты, но, боюсь, это все зависит от вас.
Вот форма поиска. Я не добавил action
потому что я не знаю, куда вы хотите перенаправить форму. Однако по умолчанию вы будете перенаправлены обратно на ту же страницу, так что вы можете просто запросить там сообщения.
<form method="POST">
<h3>Search for posts</h3>
<?php
$taxonomies[] = get_taxonomy('author');
$taxonomies[] = get_taxonomy('title');
$taxonomies[] = get_taxonomy('editor');
$options = array();
if(!empty($taxonomies)) : foreach($taxonomies as $taxonomy) :
if(empty($taxonomy)) : continue; endif;
$options[] = sprintf("\t".'<option value="%1$s">%2$s</option>', $taxonomy->name, $taxonomy->labels->name);
endforeach;
endif;
if(!empty($options)) :
echo sprintf('<select name="search-taxonomy" id="search-taxonomy">'."\n".'$1%s'."\n".'</select>', join("\n", $options));
echo '<input type="text" name="search-text" id="search-text" value=""></input>';
echo '<input type="button" name="search" id="search" value="Search"></input>';
endif;
?>
</form>
Теперь добавьте это непосредственно перед выводом своих сообщений -
if(!empty($_POST['search-text'])) :
$args = get_search_args();
query_post($args);
endif;
Наконец, добавьте это к вашему function.php
так что вы можете взять соответствующие $args
function get_search_args(){
/** First grab all of the Terms from the selected taxonomy */
$terms = get_terms($_POST['search-taxonomy'], $args);
$needle = $_POST['search-text'];
/** Now get the ID of any terms that match the text search */
if(!empty($terms)) : foreach($terms as $term) :
if(strpos($term->name, $needle) !== false || strpos($term->slug, $needle) !== false) :
$term_ids[] = $term->term_id;
endif;
endforeach;
endif;
/** Construct the args to use for quering the posts */
$args = array(
'order' => ASC,
'orderby' => 'name',
'post_status' => 'publish',
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => $_POST['search-taxonomy'],
'field' => 'term_id',
'terms' => $term_ids,
'operator' => 'IN'
)
)
);
return $args();
}