Как изменить фильтр posts_where только для поискового запроса

8

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

Это мой код:

add_filter( 'posts_where' , 'posts_where_statement' );

function posts_where_statement( $where ) {
   global $wp_query;
   global $expp;
   global $wpdb;
   $local_db = $wpdb->prefix."posts";
   $front_page_id = get_option('page_on_front');

   if ( ('page' != get_option('show_on_front') || $front_page_id != $wp_query->query_vars['page_id']) && (!($wp_query->is_search)) )
       return $where;

   //some $where modifications

   remove_all_actions ( '__after_loop');
   return $where;
}

Есть ли какая-либо другая функция или способ заставить этот хук / фильтр работать только с поисковым запросом? (тот, который выбирает результаты из пользовательского ввода)

dtd93
источник

Ответы:

17

Проблема:

Проблема с вашим текущим фрагментом состоит в том, что вы просто проверяете глобальный основной объект запроса, независимо от того, что является текущим объектом запроса.

Временное решение:

Обратите внимание, что вторым входным аргументом для posts_whereобратного вызова фильтра является текущий объект запроса.

Используйте это, чтобы определить, является ли это основным поисковым запросом в интерфейсе:

add_filter( 'posts_where', function ( $where, \WP_Query $q ) 
{
    if( ! is_admin() && $q->is_main_query() && $q->is_search()) // No global $wp_query here
    {
        // ... your modifications
    }

    return $where;      

}, 10, 2 ); // Note the priority 10 and number of input arguments is 2

Также есть posts_searchфильтр для части поиска WHERE, если это то, что вам нужно изменить.

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

birgire
источник
+1 для подсказки типа. Не фанат, $qхотя.
Майкл Эклунд
1
спасибо, было бы неплохо иметь интерфейс. да, это верный пункт в отношении имени переменной. Я должен признать, что полосы прокрутки кода на этом сайте влияют на то, как я пишу ответы - я стараюсь избегать их ;-) Некоторое использование, $wp_queryно это может быть перепутано с глобальным $wp_query, другим использованием $qryили $query, но это также может сбить с толку, когда мы работа с SQL-запросом ;-) Я остановился на $qэтом небольшом фрагменте, и он также выглядит проще, чем, например, например. $wp_query_objОбычно я беру несколько if-условий в отдельную строку @MichaelEcklund
birgire
что означает \ WP_Query $ q? Я имею в виду, почему слэш?
Бретт
@brett Если мы используем пространство имен в нашем плагине, то нам это нужно для классов WordPress, так как WordPress использует глобальное пространство.
Биргире