替换主查询中的WP_QUERY类

时间:2013-10-16 作者:s1lv3r

对于一个项目,我需要大量修改WP\\u查询的行为。因此,我所做的是扩展WP\\u查询,基本上如下所示:

class eacf_shared_query extends \\WP_Query {

    function query( $query ) {

        // do things before ...

        $posts = parent::query($query);

        // do things after ...

        return $posts;
    }
这对我现在使用扩展类的所有自定义查询都很有用,但我无法找到将其填充到main\\u查询中的方法。

所以我的问题是:Is there any known way to replace/extend the WP_Query class in the main_query?


我确实发现上述是唯一的解决方案,使用原始类中提供的过滤器后,没有得到任何进一步的解决,原因:

似乎没有保证在查询前后运行的过滤器对,因此我无法安全地实现上面示例中的构造

  • 我的“以后做事情”逻辑包含对WP\\u Query()的嵌套调用,如果使用过滤器,很容易导致查询循环posts_clauses_request 或query.
  • 2 个回复
    最合适的回答,由SO网友:sanchothefat 整理而成

    好吧,这是可行的,但可能会把一些事情搞砸,所以风险由你自己承担,但一切都是如此:)

    我一直在尝试这样做,以便使用GeoQuery扩展类按照距离某个位置的距离来排序事件。

    最简单的方法是:

    add_action( \'after_setup_theme\', \'alt_query_class\', 1, 0 );
    function alt_query_class() {
        if ( ! is_admin() && $GLOBALS[ \'wp_query\' ] instanceof WP_Query ) {
             $GLOBALS[ \'wp_the_query\' ] = new WP_Query_Extended();
             $GLOBALS[ \'wp_query\' ] = $GLOBALS[ \'wp_the_query\' ];
        }
    }
    
    在扩展查询类中,您只需执行上面的操作,但如果您添加的功能不是每个查询运行都需要的,那么您必须执行一些设置/拆卸逻辑,因为我们将用新的WP\\U查询实例替换每个实例。

    就我而言,我使用了pre_get_posts 使用延迟优先级进行筛选,以检查在完成所有查询操作后是否需要添加功能。

    class WP_Query_Extended extends WP_Query {
    
        function query( $args = array() ) {
    
            // setup functions
            add_filter( \'pre_get_posts\', array( $this, \'check_setup_needed\' ), 1000 );
    
            // run the query
            parent::query( $args );
    
            // tear down functions
            $this->teardown();
        }
    
        function check_setup_needed( $query ) {
    
            // test setup criteria
            if ( $query->get( \'somevar\' ) ) {
                $this->setup();
            }
    
            return $query;
        }
    
        function setup() {
            // add any filters etc... here
        }
    
        function teardown() {
            // remove filters etc... here
            remove_filter( \'pre_get_posts\', array( $this, \'check_setup_needed\' ) );
        }
    
    }
    

    UPDATE:

    如果有人使用query_posts() 例如,可能在插件中,或者如果您正在编写插件,则可能是一个主题,然后该函数重置$wp_query 全局返回到aWP_Query 实例,并且没有用于在以后再次更改它的筛选器。

    如果你真的需要query_posts() (你不应该!)你可以做到$wp_query->query( $args ) 相反

    SO网友:Dominic Yun

    我建议你在posts_results 钩子将$posts替换为自定义查询的结果。但是,此方法确实会产生冗余处理,因为首先处理主查询,然后使用自定义结果“覆盖”结果。

    结束

    相关推荐

    使用新的WP-Query()从循环中过滤后期格式;

    嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post