Как выполнить поиск в определенной категории таксономии

Моя проблема заключается в следующем: у меня есть 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();

}
Другие вопросы по тегам