Intereting Posts
Query Posts, но только возвращает 1 из пользовательской таксономии? Спецификация сервера Экспорт сообщений WordPress и метаданных в формате CSV Каталогизированное меню иерархии для СТРАНИЦ! Попытка управлять шаблонами в блоге с множеством пользовательских таксономий Скрыть боковую панель и изменить макет страницы блога с помощью функции is_page () Измените put the_post_thumbnail в PHP WP_Terms_List_Table Быстрое редактирование не работает Как изменить панель администратора, только если мой плагин загружен Список пользовательской таксономии, основанный на количестве сообщений и категории Как определить количество записей в нескольких категориях 3 уровня Глубокое навигационное меню Не показывать все уровни Настройка тега с помощью семантического интерфейса Мои атрибуты сообщений отсутствуют в моей установке WordPress как получить конкретный контент страницы

Исключить конкретный срок поиска

Можно найти сообщения с определенным сроком, добавив URL-адрес:

?&term=abc 

Можно ли сделать противоположное и выполнить поиск, исключая конкретный термин? Что-то вроде:

 ?&term=NOTabc 

Solutions Collecting From Web of "Исключить конкретный срок поиска"

Основное объяснение

  1. У вас есть тег шаблона, который называется is_search() для определения, если вы находитесь на странице поиска или нет.
  2. Затем он вызывает get_search_template() который в основном является функцией-оболочкой для get_query_template('search') .
  3. Когда вы locate_template() в последнюю функцию, вы увидите, что в основном это locate_template() , которая проверяет существование файла, а затем выполняет load_template() .
  4. Там $wp_query->query_vars ваш $wp_query->query_vars и $_template_file извлекается и загружается.

Примечание перед запросом var …

WordPress использует запрос var s чтобы сохранить искомый термин в его запросе. Если вы используете пользовательскую строку запроса, вам необходимо изменить фильтр get_search_query следующим образом:

 /** * Modify search query var * Doesn't need to be wrapped into esc_attr(), as it's already done by core * * @param string $s | The query var to save the search in * @return string $s */ function change_search_query_var( $s ) { $s = 'your_custom_query_var'; return $s; } add_filter( 'get_search_query', 'change_search_query_var', 20, 1 ); 

Некоторые решения (ы)

Теперь у нас есть разные возможные решения:

Простое решение

Работает в шаблоне и лучше подходит для исключения таксономии.

A) Получите все сообщения в цикле шаблона, проверьте каждое сообщение в цикле для каждого (таксономического) термина 1), а затем исключите / не показывайте его.

В вашем цикле в файле шаблона search.php:

 if ( have_posts() ) { while ( have_posts() ) { the_post(); global $post; // Skip if the post has the term attached if ( is_object_in_taxonomy( $post->ID, 'YOUR_TAXONOMY', array( 'TERM A', 'TERM B', '...' ) ) continue; } } 

Это всего лишь пример цикла.

Усовершенствованное решение (ы)

Выполняется перед запуском реального основного запроса и лучше подходит для исключения терминов в целом.

B.1) Отфильтруйте термин из запроса шаблона поиска.

В следующем примере я использую фильтр posts_clauses чтобы показать вам, что вы можете еще больше модифицировать только одним фильтром (сделайте var_dump массива $pieces для получения дополнительной информации). Вы также можете использовать фильтр posts_where , который выполняется перед фильтром clauses.

 // In your functions.php file /** * Modify the search query where clause * Like escapes the term for security reasons * * @param array $pieces | The array of post clauses: Where, Group by, etc. * @return array $pieces */ add_filter( 'posts_clauses', 'alter_search_query', 10, 2 ); function alter_search_query( $pieces, $query ) { // Target all search queries in the front-end: if( is_admin() || ! $query->is_search() ) return $pieces; global $wpdb; $term = $wpdb->esc_like( 'YOUR_TERM' ); $pieces['where'] .= $wpdb->prepare( " AND {$wpdb->posts}.post_title NOT LIKE '%s'", "%{$term}%" ); return $pieces; } 

B.2) Отфильтровать термин из запроса шаблона поиска в более эффективном и конкретном виде.

В следующем примере я использую фильтр posts_search чтобы показать вам, как вы можете изменить предложение where только для поискового запроса. Это почти то же самое, что и фильтр posts_where .

 // In your functions.php file /** * Modify the search query where clause * Like escapes the term for security reasons * * @param array $pieces | The array of post clauses: Where, Group by, etc. * @return array $pieces */ add_filter( 'posts_search', 'alter_search_where', 10, 2 ); function alter_search_where( $search_term, $query ) { // Target all search queries in the front-end: if( is_admin() || ! $query->is_search() ) return $search_term; global $wpdb; $term = $wpdb->esc_like( 'YOUR_TERM' ); $search_term .= $wpdb->prepare( " AND {$wpdb->posts}.post_title NOT LIKE '%s'", "%{$term}%" ); return $search_term; } 

Примечания:

1) Вы не были понятны, если речь идет о поиске или о таксономии .

Очень подробный и тщательный ответ @kaiser опубликовал выше. Я хотел использовать первый метод, но похоже, что функция первого метода, используемая в Current wp 4.7, не работает.

Мы должны использовать другую функцию WordPress, которая называется: has_term вместо is_object_in_taxonomy чтобы проверить конкретные термины в таксономии, назначенной на текущую должность.

Вот окончательный код, который работал для меня с помощью функции has_term в вашем search.php любого настраиваемого шаблона страницы, который вы используете для результатов поиска, в моем случае он пропускает списки свойств из поиска, если статус листинга ПРОДАЕТСЯ ИЛИ СДАЕТСЯ:

 if ( have_posts() ) : while ( have_posts() ) : the_post(); //Skip the post if property taxonomy rl_status is sold or rented: if(has_term(array( 'sold', 'rented' ), 'rl_status', get_the_ID() ){ continue; }