Поиск термина произвольной таксономии по названию

16 февр. 2017 г., 22:38:19
Просмотры: 33.1K
Голосов: 5

У меня есть произвольная таксономия под названием albums.

Мне нужно иметь возможность искать по текстовому названию термина таксономии, очевидно, это не стандартный поиск WordPress. Интересует, как лучше всего это реализовать?

Допустим, есть альбом под названием 'Football Hits',

Я начинаю вводить 'foot' и выполняю поиск, мне нужно только получить название альбома и его постоянную ссылку.

Спасибо!

0
Все ответы на вопрос 2
0
13
// Получаем список таксономий для поисковой строки
function get_tax_by_search($search_text){

$args = array(
    'taxonomy'      => array( 'my_tax' ), // название таксономии
    'orderby'       => 'id', 
    'order'         => 'ASC',
    'hide_empty'    => true,
    'fields'        => 'all',
    'name__like'    => $search_text
); 

$terms = get_terms( $args );

 $count = count($terms);
 if($count > 0){
     echo "<ul>";
     foreach ($terms as $term) {
       echo "<li><a href='".get_term_link( $term )."'>".$term->name."</a></li>";

     }
     echo "</ul>";
 }

}

// пример использования
get_tax_by_search('Foo');
16 февр. 2017 г. 23:23:50
7

Итак, вы действительно можете искать записи по названию таксономии — как пользовательской, так и стандартной. Ответ кроется в части "tax_query" WP_Query. Вот пример из Codex, адаптированный под ваши нужды:

<ul>
<?php

global $post;
$album_title = $_GET['album-title'];
$args = array(
    'post_type' => 'post',
    'posts_per_page' => 5,
    'tax_query' => array( // ВАЖНО: массив массивов!
        array(
            'taxonomy' => 'albums',
            'field'    => 'name',
            'terms'    => $album_title
        )
    )
);

$myposts = get_posts( $args );
foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
    <li>
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    </li>
<?php endforeach; 
wp_reset_postdata();?>

</ul>

ОБНОВЛЕНИЕ

Я не тестировал этот вариант, но теоретически он должен работать. Для поиска любых записей, содержащих «foot»:

<ul>
<?php

global $post;
$album_title = $_GET['album-title']; // предположим, пользователь ввёл 'foot'
$args = array(
    'post_type' => 'post',
    'posts_per_page' => 5,
    'tax_query' => array( // ВАЖНО: массив массивов!
        array(
            'taxonomy' => 'albums',
            'field'    => 'name',
            'terms'    => $album_title,
            'operator'    => 'LIKE'
        )
    )
);

$myposts = get_posts( $args );
foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
    <li>
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    </li>
<?php endforeach; 
wp_reset_postdata();?>

</ul>

Надеюсь, это поможет!

16 февр. 2017 г. 22:57:00
Комментарии

Спасибо! Хотя мне нужно, чтобы поиск был более ориентирован на пользователя. То есть пользователь вводит слово "foot", и система должна подтянуть соответствующий альбом Football Hits.

DIM3NSION DIM3NSION
16 февр. 2017 г. 23:23:17

Конечно — просто замените жестко заданный заголовок на переменную... Как именно вы получите это значение поиска от пользователя — решать вам... Я обновил свой ответ с одним из вариантов в качестве примера...

nibnut nibnut
16 февр. 2017 г. 23:25:23

Спасибо, MacPrawn, ценю вашу помощь. Хотя, конечно, вышеуказанный код не загрузит термин Football Hits, если поисковый запрос — это просто "foot". Возможно, я ошибаюсь.

DIM3NSION DIM3NSION
17 февр. 2017 г. 00:04:13

Извините - я пропустил часть, где вы хотели частичные совпадения... Я обновил свой ответ.

nibnut nibnut
17 февр. 2017 г. 00:51:25

Я проверил вышеуказанное, однако мне нужно, чтобы он просто выводил соответствующее название альбома, а не записи внутри этого альбома. То есть не записи, отнесенные к категории Football Hits, а буквально только постоянную ссылку на альбом.

DIM3NSION DIM3NSION
17 февр. 2017 г. 00:57:26

А, понятно. Тогда, думаю, ответ от @TrubinE справится лучше в этом случае.

nibnut nibnut
17 февр. 2017 г. 12:36:17

Спасибо за вашу помощь, MacPrawn

DIM3NSION DIM3NSION
17 февр. 2017 г. 21:02:24
Показать остальные 2 комментариев