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

如何用WP_Query实现按ID、别名或标题的OR关系文章查询?

当然可以!完全不用拆成两次独立查询,WP_Query本身就支持通过自定义WHERE子句的方式实现这种OR关系的多条件查询,我给你写个实用的示例代码,你可以直接复用或者修改:

实现函数
function get_posts_by_id_name_or_title( $args = array() ) {
    // 设置默认参数,可根据你的需求调整
    $defaults = array(
        'id' => '',
        'name' => '',
        'title' => '',
        'post_type' => 'post',
        'posts_per_page' => -1, // 返回所有匹配的文章,改成数字可限制数量
        'post_status' => 'publish', // 只查询已发布的文章
    );
    $args = wp_parse_args( $args, $defaults );

    // 初始化基础查询参数
    $query_args = array(
        'post_type' => $args['post_type'],
        'posts_per_page' => $args['posts_per_page'],
        'post_status' => $args['post_status'],
    );

    // 添加过滤器修改查询的WHERE子句,实现OR逻辑
    add_filter( 'posts_where', function( $where, $query ) use ( $args ) {
        global $wpdb;
        $conditions = array();

        // 处理文章ID条件
        if ( ! empty( $args['id'] ) && is_numeric( $args['id'] ) ) {
            $conditions[] = $wpdb->prepare( "{$wpdb->posts}.ID = %d", $args['id'] );
        }

        // 处理别名(post_name)条件
        if ( ! empty( $args['name'] ) ) {
            $clean_name = sanitize_title( $args['name'] );
            $conditions[] = $wpdb->prepare( "{$wpdb->posts}.post_name = %s", $clean_name );
        }

        // 处理文章标题条件,这里用模糊匹配,如果你需要精确匹配可以改成=
        if ( ! empty( $args['title'] ) ) {
            $clean_title = $wpdb->esc_like( $args['title'] );
            $conditions[] = $wpdb->prepare( "{$wpdb->posts}.post_title LIKE %s", '%' . $clean_title . '%' );
        }

        // 如果有条件,就把它们用OR连接后追加到WHERE子句
        if ( ! empty( $conditions ) ) {
            $where .= ' AND (' . implode( ' OR ', $conditions ) . ')';
        }

        return $where;
    }, 10, 2 );

    // 执行查询
    $wp_query = new WP_Query( $query_args );
    $posts = $wp_query->posts;

    // 一定要移除过滤器,避免影响后续的其他查询
    remove_filter( 'posts_where', '__return_false', 10 );

    wp_reset_postdata(); // 重置查询数据,避免干扰全局变量
    return $posts;
}
代码说明
  • 安全处理:全程使用$wpdb->prepare和WordPress内置的 sanitize 函数,避免SQL注入风险,这是必须注意的点。
  • 灵活扩展:默认参数里的post_type、post_status等都可以根据你的实际需求调整,比如要查询页面就把post_type改成page。
  • OR逻辑:不管你传入一个还是多个条件(比如同时传ID和标题),都会自动用OR连接,返回匹配任意一个条件的文章。
使用示例
// 按文章ID查询
$posts = get_posts_by_id_name_or_title( array( 'id' => 456 ) );

// 按别名查询(比如文章的slug是"my-awesome-post")
$posts = get_posts_by_id_name_or_title( array( 'name' => 'my-awesome-post' ) );

// 按标题模糊查询(匹配标题包含"WordPress技巧"的文章)
$posts = get_posts_by_id_name_or_title( array( 'title' => 'WordPress技巧' ) );

// 同时按ID和标题查询,返回匹配其中一个条件的文章
$posts = get_posts_by_id_name_or_title( array( 'id' => 456, 'title' => 'WordPress技巧' ) );

内容的提问来源于stack exchange,提问作者Blackbam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:46:28