WordPress как на ладони

Поиск элементов таксономии get_terms

В файле taxonomy.php есть функция get_terms()

Где находятся параметры поля search

if ( ! empty( $args['search'] ) ) {
	$like = '%' . $wpdb->esc_like( $args['search'] ) . '%';
	$where .= $wpdb->prepare( ' AND ((t.name LIKE %s) OR (t.slug LIKE %s))', $like, $like );
}

То есть через функцию get_terms можно настроить фильтр и поиск по таксономии
Через поле search осуществляется поиск по названию и ярлыку такс.

Хочу сделать чтобы поиск осуществлялся по названию и указанному произвольному полю, которое дополнительно было добавлено для таксономии.

Я знаю что можно настроить meta_query, но мне не особо подходит этот вариант.

0
lethalblo
2.8 лет назад 15
  • 0
    qwert555154 naytikurs.ru

    Для класса WP_Term_Query есть хук terms_clauses.

    lethalblo 2.8 лет назад

    Можно чуть подробней, как осуществить задуманное? Тут главное вывести имя нужного поля в переменную, таким образом чтобы поиск по этому полю осуществлялся из БД. как мне кажется..

    qwert555 2.8 лет назад

    Мета поля это отдельная таблица, нужно использовать join

    Примерно так (не проверял)

    add_filter( 'terms_clauses', 'myfunc', 10, 3 );
    
    function myfunc( $pieces, $taxonomies, $args ) {
    
    	if( ! empty( $args['add_myfunc'] ) ){
    		global $wpdb; 
    		$like = '%' . $wpdb->esc_like( $args['search'] ) . '%';
    		$pieces['join']  .= ' INNER JOIN ' . $wpdb->termmeta . ' AS tm ON t.term_id = tm.term_id ';
    		$pieces['where'] .=  $wpdb->prepare( ' OR  ((tm.meta_key = %s) AND (tm.meta_value LIKE %s))', 'имя поля', $like );
    	}
    
    	return $pieces;
    }

    при использовании get_terms добавить 'add_myfunc' => true, чтобы везде не применялся фильтр

    lethalblo 2.8 лет назад

    Не работает. Думаю можно делать даже не хук, а просто правку в самом файле taxonomy.php

    qwert555 2.8 лет назад

    Код рабочий

    "имя поля" - это заменили на свое?

    lethalblo 2.8 лет назад

    заменил, код добавил в свой function

    lethalblo 2.8 лет назад

    Оказалось, что действительно работает, но немного некорректно.

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

    Kama 2.8 лет назад

    Попробуй в предложенном коде заменить:

    $pieces['join'] .= ' INNER JOIN ' . $wpdb->termmeta . ' AS tm ON t.term_id = tm.term_id ';
    
    // на 
    $pieces['join'] .= $wpdb->prepare( " LEFT JOIN $wpdb->termmeta AS tm ON ( t.term_id = tm.term_id AND tm.meta_key = %s ) ", 'ИМЯ_ПОЛЯ' );
    lethalblo 2.8 лет назад

    Спасибо код работает. Еще вопрос можно.

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

    Можно сделать так чтобы пробелы в конце и к примеру двойные пробелы между словами не учитывались? (при обычном поиске записей, лишние пробелы не учитываются)

    Вот так выглядит мой поиск:

    $terms = get_terms ( 'akter', array( 
    	'number' => 7,   
    	'add_myfunc' => true, 
    	'search'  => get_search_query(),
    	'hide_empty' => false,  
    	)
    );
    Kama 2.8 лет назад

    Попробуй

    'search'  => trim( get_search_query() ),
    lethalblo 2.8 лет назад

    В конце и в начале лишние пробелы убирает, но если между словами поставить два пробела тогда результатов нет. Спасибо за помощь.

    Kama 2.8 лет назад
    'search'  => implode( ' ', array_filter( explode( ' ', get_search_query() ) ) ),
    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация