You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在WP_Query中使用OR条件以生成指定SQL查询结果?

在WP_Query中实现OR条件查询

当然可以实现你要的WHERE post_type = "post" OR post_author = 123效果,WP_Query默认采用AND逻辑组合条件,但可以通过过滤器修改查询语句,或者结合自定义参数构造OR逻辑。

下面是具体实现方案:

方法一:使用posts_where过滤器修改查询语句

这个方法直接调整WP_Query生成的SQL中的WHERE部分,精准实现OR条件:

// 定义过滤器函数,添加OR逻辑
function custom_or_post_query( $where, $query ) {
    // 自定义标记参数,仅对目标查询生效,避免影响全局查询
    if ( $query->get( 'enable_or_condition' ) ) {
        global $wpdb;
        // 移除默认生成的post_type/author相关AND条件(如果存在)
        $where = preg_replace( "/AND \(.*?post_type.*?\)/", "", $where );
        $where = preg_replace( "/AND \(.*?post_author.*?\)/", "", $where );
        // 添加目标OR条件
        $where .= " AND ({$wpdb->posts}.post_type = 'post' OR {$wpdb->posts}.post_author = 123)";
    }
    return $where;
}
add_filter( 'posts_where', 'custom_or_post_query', 10, 2 );

// 调用WP_Query并传入自定义标记
$args = array(
    'enable_or_condition' => true,
    'posts_per_page' => -1, // 可根据需求调整分页参数
);
$custom_query = new WP_Query( $args );

// 循环输出查询结果
if ( $custom_query->have_posts() ) {
    while ( $custom_query->have_posts() ) {
        $custom_query->the_post();
        echo '<h2>' . get_the_title() . '</h2>';
    }
    wp_reset_postdata();
}

方法二:结合$wpdb执行原生SQL(灵活度更高)

如果不需要严格依赖WP_Query对象结构,也可以直接通过$wpdb执行原生SQL,再转换为WP_Post对象处理:

global $wpdb;
// 执行原生查询,注意过滤动态参数避免SQL注入
$posts = $wpdb->get_results(
    $wpdb->prepare(
        "SELECT * FROM {$wpdb->posts} 
         WHERE (post_type = 'post' OR post_author = %d) 
         AND post_status = 'publish'",
        123 // 动态参数时替换为变量即可
    )
);

// 转换为WP_Post对象并输出
foreach ( $posts as $post ) {
    setup_postdata( $post );
    echo '<h2>' . get_the_title() . '</h2>';
}
wp_reset_postdata();

内容的提问来源于stack exchange,提问作者Валерий Новожилов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:10:23