绕过WP查询中的“supress_Filters”

时间:2020-01-22 作者:FooBar

显然,出于某种不合逻辑的原因,开发人员决定获取所有语言帖子的唯一方法是添加supress_filters=true 到WP\\u查询(而不是像这样language_code=all 选项)。

无论如何,我的情况是,我需要获取所有语言的帖子,但也需要使用过滤器修改WP\\u查询。有没有办法强制将我的过滤器添加到查询中,即使supress_filters 设置为false?

这是我需要添加的过滤器:

add_filter( \'posts_where\', function($where, $wp_query) {
    global $wpdb;

    if($search_term = $wp_query->get( \'custom_search\' )){
        $search_term = $wpdb->esc_like($search_term);
        $search_term = \' \\\'%\' . $search_term . \'%\\\'\';
        $where .= \' AND (\' . $wpdb->posts . \'.post_title LIKE \' . $search_term . \' OR \' . $wpdb->posts . \'.ID LIKE \' . $search_term . \' OR \' . $wpdb->posts . \'.post_name LIKE \' . $search_term . \')\';
    }

    return $where;
}, 10, 2 );
但添加后会将其删除supress_filters=true (因为我需要获取所有语言的帖子)

2 个回复
SO网友:Howdy_McGee

查看WP_Query Class 您应该能够使用pre_get_posts 在运行任何其他筛选器之前修改查询,包括关闭suppress_filters 旗帜例如:

/**
 * Modify WP_Queries
 * @link https://wordpress.stackexchange.com/q/356950/7355
 *
 * @param WP_Query $query
 *
 * @return void
 */
function wpse356950_query_modifications( $query ) {

    // Don\'t run on admin
    if( is_admin() ) {
        return;
    }

    // Some conditional to tell our query from other queries
    if( $query->get( \'suppress_filters\' ) ) {
        $query->set( \'suppress_filters\', false );
    }

}
add_action( \'pre_get_posts\', \'wpse356950_query_modifications\' );

SO网友:FooBar

我发现的一种工作方式是删除WPML core手动添加的过滤器,如下所示:

global $wpml_query_filter;

/**
 * WPML fetch in all languages
 */

    remove_filter( \'posts_join\', array( $wpml_query_filter, \'posts_join_filter\' ), 10, 2 );
    remove_filter( \'posts_where\', array( $wpml_query_filter, \'posts_where_filter\' ), 10, 2 );
在我的场景中这没关系,因为这个特定页面只有一个WP\\u查询。如果您有多个需要获取特定语言的筛选器,我建议您在运行WP\\u查询后读取筛选器。

相关推荐

为内置钩子调用do_action和Apply_Filters是否安全?

我正在开发一个插件,它需要复制一些内置的WordPress逻辑。(此逻辑不能用任何内置方法调用,也不能独立连接到。)在这个动作序列中,WordPress的正常行为是调用动作挂钩(do_action(\'wp_login\', ...)) 和过滤器挂钩(apply_filters(\'login_redirect\', ...)).如果在对应于在Core中调用它们的时间点调用它们,那么直接从我的插件调用这些内置钩子是否安全(并且是可以接受的做法)?或者,其他与此相关的开发人员期望在非常特定的时间执行操作的风