使用PRE_GET_POST过滤帖子

时间:2015-11-03 作者:Kristina

我正在尝试筛选archive\\u research。php仅显示status=current的研究。

在函数中。php:

add_action( \'pre_get_posts\', \'only_current\' );

function only_current( $query ) {
    if ( $query->is_main_query() ) {
        $args = array(
            \'post_type\' => \'research\',
            \'tax_query\' => array(
                array(
                    \'taxonomy\' => \'status\',
                    \'field\'    => \'slug\',
                    \'terms\'    => \'current\',
                ),
             ),
        );
        $query = new WP_Query( $args );
    }
}
在档案研究中。php:

        // theloop
        if ( have_posts() ) : while ( have_posts() ) : the_post();
            // print title etc
结果:研究档案显示所有研究。

我试过对这个做许多细微的改动。为了便于阅读,我将尝试在这里总结它们,而不粘贴一堆冗余代码:

删除tax\\u查询。。相同的结果(预期)

  • 将tax\\u查询更改为不存在的分类术语。。相同的结果更换$query = new WP_Query( $args ) 具有$query->set(\'meta_query\', $args)$query->set($args) .. 相同的结果更换have_posts()the_post() 在存档研究中$wp_query->have_posts()$wp_query->the_post() .. 相同的结果将调用添加到do_action(\'only_current\') 之前// theloop .. 同样的结果,所以这里的共同主题是,无论我做什么,我都会得到同样的结果。一定有一个非常明显的解决方案,我没有找到,如果有人能指出这一点,我将不胜感激。

    可能有用的最后一点调试信息:

    字符串(222)“从wp\\U posts中选择SQL\\U CALC\\U FOUND\\U ROWS wp\\U posts.ID,其中1=1,wp\\U posts.post\\U type=\'研究\'和(wp\\U posts.post\\U status=\'发布\'或wp\\U posts.post\\U status=\'专用\')按wp\\U posts.post\\U date DESC LIMIT 0,10排序”

    这是调用的结果echo var_dump($wp_query->request) 之前// theloop

  • 1 个回复
    SO网友:Andrew

    您正在创建一个新查询,而不是更改现有查询。

    这个pre_get_posts codex page 有一个注释说明$query参数是通过引用传递的,您应该直接修改它。不需要声明全局变量或返回值。将您的函数更新为:

    add_action( \'pre_get_posts\', \'only_current\' );
    function only_current( $query ) {
    
        if ( is_admin() ) {
            return;
        }
    
        if ( ! $query->is_main_query() ) {
            return;
        }
    
        if ( ! is_post_type_archive( \'research\' ) ) {
            return;
        }
    
        $tax_query = array(
            array(
                \'taxonomy\' => \'status\',
                \'field\'    => \'slug\',
                \'terms\'    => \'current\',
            ),
        );
        $query->set( \'tax_query\', $tax_query );
    }
    
    Thepre_get_posts 过滤器也适用于管理员内部的查询,所以我添加了另一条if语句来检查我们是否位于站点的前端。

    我还添加了一份声明,以检查我们是否在research 存档页。

    上述功能需要放入functions.php 文件或特定于站点的插件。将其放置在archive-research.php 文件将不工作,因为查询将在archive-research.php 已加载模板。

    相关推荐

    从unctions.php调用的Add_Actions未返回好值

    我正试图通过这些功能为我的网站添加一些安全/访问防护。php。然而,每当我尝试通过函数添加时。php(而不是作为插件,我以前做过)失败(总是返回false)。例如:add_action(\"parse_query\", checkaccess()); // in functions.php 以及function checkaccess() { $allowAccess = false; if(is_admin()||is_front_page()||i