Как исключить шаблон страницы WordPress (пользовательский шаблон) из результатов поиска? - PullRequest
4 голосов
/ 18 сентября 2011

Я создал пользовательский шаблон страницы.

<?php
/*
 * Template Name: foo
 */
?>

Это имя файла "foo.php".

Я пытался

global $query_string;
query_posts($query_string . "&post_type=post");

Но все страницы будут исключены ....

Как исключить только этот шаблон страницы из результатов поиска wordpress?

Ответы [ 4 ]

4 голосов
/ 11 марта 2015

Упомянутый Николаем запрос очень удобен, но он также удаляет все посты из результатов поиска, поскольку посты не содержат ключ '_wp_page_template'.Чтобы иметь все страницы (без отфильтрованного шаблона), а также все сообщения, вам необходимо сделать следующее:

// exclude any content from search results that use specific page templates
function exclude_page_templates_from_search($query) {
    global $wp_the_query;
    if ( ($wp_the_query === $query) && (is_search()) && ( ! is_admin()) ) {
        $meta_query = 
            array(
// set OR, default is AND
                'relation' => 'OR',
// remove pages with foo.php template from results
                array(
                    'key' => '_wp_page_template',
                    'value' => 'foo.php',
                    'compare' => '!='
                ),
// show all entries that do not have a key '_wp_page_template'
                array(
                    'key' => '_wp_page_template',
                    'value' => 'page-thanks.php',
                    'compare' => 'NOT EXISTS'
                )
            );
        $query->set('meta_query', $meta_query);
    }
}
add_filter('pre_get_posts','exclude_page_templates_from_search');

Обширная информация по этому вопросу может быть найдена в Кодексе WordPress .

3 голосов
/ 28 декабря 2013

Для тех, кто спотыкается в этом потоке и не добивается успеха в более новых версиях WP: вместо этого нужно установить аргументы $ query, возвращая query_posts ... следующим образом:

// exclude any content from search results that use specific page templates
function exclude_page_templates_from_search($query) {

    global $wp_the_query;
    if ( ($wp_the_query === $query) && (is_search()) && ( ! is_admin()) ) {

            $query->set(
                'meta_query',
                array(
          array(
              'key' => '_wp_page_template',
              'value' => 'page-template-1.php',
              'compare' => '!='
              )
          )
      );
    }

}
add_filter('pre_get_posts','exclude_page_templates_from_search');
2 голосов
/ 19 сентября 2011

Попробуйте это:

global $wp_query;
$args = array_merge($wp_query->query, array(
    'meta_query' => array(
        array(
            'key' => '_wp_page_template',
            'value' => 'foo.php',
            'compare' => '!='
        )
    ),
));
query_posts( $args );
1 голос
/ 24 октября 2011

Спасибо, Николай! По какой-то причине прошлой ночью я просто не получал это на работу, но сегодня, через час или два, я сделал Возможно, это просто тот факт, что я использовал неправильный фильтр или пропустил последнюю строку вашего кода.

В моем случае я хотел исключить контент на основе нескольких шаблонов, поэтому добавил больше элементов массива ключ / значение / сравнение. Я также хотел сделать это только во время поиска, поэтому добавил условное предложение для этого. Вот полная функция, которую я добавил в файл functions.php моей темы:

// exclude any content from search results that use specific page templates
function exclude_page_templates_from_search($query) {

    global $wp_the_query;

    if ( ($wp_the_query === $query) && (is_search()) && ( ! is_admin()) ) {

        $args = array_merge($wp_the_query->query, array(
        'meta_query' => array(
            array(
                'key' => '_wp_page_template',
                'value' => 'page-template-1.php',
                'compare' => '!='
                ),
            array(
                'key' => '_wp_page_template',
                'value' => 'page-template-2.php',
                'compare' => '!='
                ),
            array(
                'key' => '_wp_page_template',
                'value' => 'page-template-3.php',
                'compare' => '!='
                )
            ),
        ));

        query_posts( $args );

    }

}
add_filter('pre_get_posts','exclude_page_templates_from_search');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...