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

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

?&term=abc

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

?&term=NOTabc
6 голосов | спросил Rob 3 FebruaryEurope/MoscowbFri, 03 Feb 2012 15:57:55 +0400000000pmFri, 03 Feb 2012 15:57:55 +040012 2012, 15:57:55

2 ответа


10

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

  1. У вас есть тег шаблона, который называется is_search() для определения, если вы находитесь на странице поиска или нет.
  2. Затем он вызывает get_search_template(), который в основном является оберткой для get_query_template('search').
  3. Когда вы просматриваете последнюю функцию, вы увидите, что она в основном выполняет locate_template(), которая проверяет существование файла, а затем делает load_template().
  4. Там ваш проверочный код $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, чтобы показать вам, что вы можете еще больше модифицировать только одним фильтром (сделайте ---- +: = 12 =: + ---- массива var_dump для получения дополнительной информации) , Вы также можете использовать фильтр $pieces, который выполняется до фильтра предложений.

posts_where

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

В следующем примере я использую фильтр // 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; } , чтобы показать вам, как вы можете изменить posts_search только для поискового запроса. Это почти то же самое, что и фильтр where.

posts_where

Сноски:

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

ответил kaiser 3 FebruaryEurope/MoscowbFri, 03 Feb 2012 20:58:13 +0400000000pmFri, 03 Feb 2012 20:58:13 +040012 2012, 20:58:13
0

Очень подробный и тщательный ответ @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;
            }
ответил Mohsin 26 Jpm1000000pmThu, 26 Jan 2017 17:13:00 +030017 2017, 17:13:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132