如何从搜索结果中排除wordpress页面模板(自定义模板)?

时间:2011-09-18 17:04:37

标签: php wordpress wordpress-theming

我创建了自定义页面模板。

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

此文件名为“foo.php”。

我试过

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

但所有页面都将被排除....

如何从wordpress搜索结果中仅排除此页面模板?

5 个答案:

答案 0 :(得分:4)

提到by Nicolay的查询非常方便,但它也会删除搜索结果中的所有帖子,因为帖子不包含'_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');

有关此问题的详细信息,请in the WordPress Codex

答案 1 :(得分:3)

对于那些偶然发现这个帖子并且在WP更新版本上没有成功的人:必须设置$ query args而不是重做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 :(得分:2)

试试这个:

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 );

答案 3 :(得分:1)

谢谢尼古拉!出于某种原因昨晚我只是没有让这个工作,但今天又过了一两个小时,我做到了。可能只是因为我使用了错误的过滤器或者错过了代码的最后一行。

在我的情况下,我想基于多个模板排除内容,因此,添加了更多键/值/比较数组元素。我也只是想在搜索过程中这样做,所以,为此添加了条件子句。这是我添加到主题的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');

答案 4 :(得分:0)

我不得不排除多个页面模板,因此我不得不对上面的代码进行一些修改,但是最后,这对我有用:

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' => array('page-landings-new.php', 'page-landings-EU.php', 'page-thankyou.php'),
                    'compare' => 'NOT IN'
                ),
                // 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');

也许对外面的人有用。