好吧,这是可行的,但可能会把一些事情搞砸,所以风险由你自己承担,但一切都是如此:)
我一直在尝试这样做,以便使用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
全局返回到a
WP_Query
实例,并且没有用于在以后再次更改它的筛选器。
如果你真的需要query_posts()
(你不应该!)你可以做到$wp_query->query( $args )
相反