如何更改本地查询,而不是主查询

时间:2016-05-31 作者:Abirvab

我在一个短代码中完成了一个wp\\u查询。所以,在第页xyz 我有两个wp查询,一个是主查询,另一个是我的查询。我从查询中获得的SQL查询不符合我的预期效果。因此,我需要过滤查询子句以注入我的条件(我认为这是我现在唯一的方法,尽管这是我的自定义查询)。我所有的答案都是用pre_get_posts 使用$this->is_main_query(), 但我认为这不符合我的情况。

如何使用posts_clauses 滤器

我在query_vars_hash 喜欢281f08ffcd75c8.... 这是一个唯一的标识符,以便我可以专门针对我的特定查询?

2 个回复
SO网友:Howdy_McGee

执行此操作的一种简单方法是,只需在查询之前添加过滤器,然后在查询之后删除:

add_filter( \'posts_orderby\', \'filter_function\' );

    $something = new WP_Query( $args );

remove_filter( \'posts_orderby\', \'filter_function\' );
然后您可以将函数添加到functions.php 正常情况下:

/**
 * The below function filters something
 * Added inline on template blah.php
 */
function filter_function() {
    // Things n\' stuff
}
你也可以(如果你想使用pre_get_posts ) 目标不是主要查询:

if( ! $query->is_main_query() ) { /* ... */ }
或作为Milo suggests in an old answer - 设置WP\\U查询将专门使用的查询变量。

SO网友:TheDeadMedic

我的首选项是一个特殊的查询变量,用作触发过滤器的标志:

function wpse_228386_maybe_batman( $clauses, $wp_query ) {
    if ( $wp_query->get( \'iamthebatman\' ) ) {
        // Fight crime
    }

    return $clauses;
}

add_filter( \'posts_clauses\', \'wpse_228386_maybe_batman\', 10, 2 );
现在,您可以在任何地方“激活”它,而无需每次添加/删除过滤器:

$query = new WP_Query([ \'iamthebatman\' => true ]);
只要确保您选择的任何查询变量都是特定于您的项目的,并且不会与WordPress reserved terms.

相关推荐

绕过WP查询中的“supress_Filters”

显然,出于某种不合逻辑的原因,开发人员决定获取所有语言帖子的唯一方法是添加supress_filters=true 到WP\\u查询(而不是像这样language_code=all 选项)。无论如何,我的情况是,我需要获取所有语言的帖子,但也需要使用过滤器修改WP\\u查询。有没有办法强制将我的过滤器添加到查询中,即使supress_filters 设置为false?这是我需要添加的过滤器:add_filter( \'posts_where\', function($where, $wp_query) {