Удалить некоторые страницы из поиска

8

На моем сайте я хочу, чтобы некоторые страницы не запрашивались поисковой формой (поэтому они не отображаются, когда у меня есть что-то вроде www.ex.com/?s=banana)

Есть ли способ «удалить» страницы со страницы результатов поиска (без слепого выполнения условия if is_page (id), display: none)

Fredy31
источник

Ответы:

14

В WP_Query () есть аргумент post__not_in, в котором вы можете исключить определенные идентификаторы постов.

Вы должны создать новый WP_Query внутри вашего search.php и использовать текущие $ query_args, а затем добавить свой 'post__not_in'.

Если вы хотите сделать его более динамичным, вы также можете встроить метаданные поста, в которых вы можете выполнить мета-запрос и исключить все, для которых выбрана опция «исключить». (найдите 'register_meta_box_cb' в register_post_type ).

Например,

add_action('pre_get_posts','wpse67626_exclude_posts_from_search');
function wpse67626_exclude_posts_from_search( $query ){

    if( $query->is_main_query() && is_search() ){
         //Exclude posts by ID
         $post_ids = array(7,19,21);
         $query->set('post__not_in', $post_ids);
    }

}
Эрик Холмс
источник
3
+1. Было бы добавить, что если исключаемые вами сообщения относятся к определенному типу сообщений, вы можете исключить их из поиска, когда выregister_post_type
Стивен Харрис
1

Чтобы исключить все страницы из результатов поиска (т.е. без необходимости вручную указывать идентификаторы страниц), вот улучшенная версия функции @ EricHolmes:

add_action( 'pre_get_posts', 'wpse67626_exclude_pages_from_search' );
function wpse67626_exclude_pages_from_search( $query ) {

    // Manually supply Post/Page IDs to exclude from search results
    // $exclude_page_ids = array( 7, 19, 21 );

    // Or just get all page IDs
    $exclude_page_ids = get_all_page_ids();

    if (
        !$query->is_admin &&
        $query->is_search &&
        $query->is_main_query() &&
        !empty( $exclude_page_ids ) 
    ) {

        $query->set( 'post__not_in', $exclude_page_ids );

    }
}

Больше информации:

(АЛЬТЕРНАТИВА) Хотя, учитывая то, что вы делаете, вы можете просто установить exclude_from_searchдля pageтипа сообщения значение true, которое мне кажется наилучшим способом исключения типа сообщения из поиска. Смотрите ответ @ prettyboymp за это .

Больше информации:

это я
источник