当前浏览:首页 / WordPress类 / WP_Query

WP_Query

WordPress 查询类

章节目录


    描述

    WordPress 用户新建自定义对文章的各种查询,都可以(推荐)使用该类。

    标准使用示例:

    // The Query
    $the_query = new WP_Query( $args );
     
    // The Loop
    if ( $the_query->have_posts() ) {
        echo '<ul>';
        while ( $the_query->have_posts() ) {
            $the_query->the_post();
            echo '<li>' . get_the_title() . '</li>';
        }
        echo '</ul>';
    } else {
        // no posts found
    }
    /* 还原原始 Post Data */
    wp_reset_postdata();

    它的使用过程是不是和我们在模板中操作使用主循环相似?事实如此,而wp_reset_postdata()的作用就是重置主循环数据,使用WP_Query新建自定义查询会改变全局$post变量的值,所以需要重置回当前主循环原始的文章数据,不然后续可能会出现一些意外问题。

    多个查询示例:

    // The Query
    $query1 = new WP_Query( $args );
     
    // The Loop
    while ( $query1->have_posts() ) {
        $query1->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
     
    /* Restore original Post Data 
     * NB: Because we are using new WP_Query we aren't stomping on the 
     * original $wp_query and it does not need to be reset with 
     * wp_reset_query(). We just need to set the post data back up with
     * wp_reset_postdata().
     */
    wp_reset_postdata();
     
     
    /* The 2nd Query (without global var) */
    $query2 = new WP_Query( $args2 );
     
    // The 2nd Loop
    while ( $query2->have_posts() ) {
        $query2->the_post();
        echo '<li>' . get_the_title( $query2->post->ID ) . '</li>';
    }
     
    // Restore original Post Data
    wp_reset_postdata();
    

    属性

    • $query
      保存WP类传递给$wp_query对象的查询字符串。
    • $query_vars
      包含解析的$query的关联数组:查询变量及其各自值的数组。
    • $queried_object
      如果请求是类别、作者、永久链接或页面,则适用。保存有关请求的类别、作者、文章或页面的信息。
    • $queried_object_id
      如果请求是类别、作者、永久链接或文章/页面,则保留相应的ID。
    • $posts
      从数据库中获取请求的文章。
    • $post_count
      正在显示的文章数。
    • $found_posts
      找到的与当前查询参数匹配的文章总数
    • $max_num_pages
      总页数,结果为:$found_posts / $posts_per_page
    • $current_post
      (循环期间可用) 当前显示的文章的索引
    • $post
      (循环期间可用) 当前正在显示的文章
    • $is_single, $is_page, $is_archive, $is_preview, $is_date, $is_year, $is_month, $is_time, $is_author, $is_category, $is_tag, $is_tax, $is_search, $is_feed, $is_comment_feed, $is_trackback, $is_home, $is_404, $is_comments_popup, $is_admin, $is_attachment, $is_singular, $is_robots, $is_posts_page, $is_paged
      布尔值描述当前是一个什么类型的请求,例如,前3个分别表示:“它是文章详情页吗?”、“它是页面吗?”、“它是任何类型的存档页面吗?”。更详细的介绍请查看条件标签

    Author 作者参数

    • author (int) – 作者id
    • author_name (string) – 使用user_nicename
    • author__in (array) – 作者id (从3.7版开始提供).
    • author__not_in (array) – 作者id (从3.7版开始提供).

    示例

    // 使用作者 id 查询该作者的文章:
    $query = new WP_Query( array( 'author' => 123 ) );
    
    // 使用作者 ‘user_nicename‘ 查询该作者的文章:
    $query = new WP_Query( array( 'author_name' => 'rami' ) );
    
    // 查询多个作者的文章:
    $query = new WP_Query( array( 'author' => '2,6,17,38' ) );
    
    // 通过在id前面加“-”(减号)查询除作者(单个)以外的所有帖子:
    $query = new WP_Query( array( 'author' => -12 ) );
    
    // 查询多个作者的文章:
    $query = new WP_Query( array( 'author__in' => array( 2, 6 ) ) );
    
    // 排除多个作者的文章:
    $query = new WP_Query( array( 'author__not_in' => array( 2, 6 ) ) );
    

    Category 类别参数

    • cat (int) – 分类id
    • category_name (string) – 分类slug
    • category__and (array) – 分类id
    • category__in (array) – 分类id
    • category__not_in (array) – 分类id

    示例

    // 查询某个分类的文章(包括所有子类),使用分类 id:
    $query = new WP_Query( array( 'cat' => 4 ) );
    
    // 查询某个分类的文章(包括所有子类),使用分类 slug:
    $query = new WP_Query( array( 'category_name' => 'staff' ) );
    
    // 查询某个分类的文章(不包括子类),使用分类 id:
    $query = new WP_Query( array( 'category__in' => 4 ) );
    
    // 查询多个分类的文章,使用分类 id:
    $query = new WP_Query( array( 'cat' => '2,6,17,38' ) );
    
    // 查询包含任一个这些分类的文章,使用分类 slug(OR):
    $query = new WP_Query( array( 'category_name' => 'staff,news' ) );
    
    // 查询包含“所有”这些类别的文章(AND):
    $query = new WP_Query( array( 'category_name' => 'staff+news' ) );
    
    // 通过在类别id前面加“-”(减号)来查询除这些类别之外的所有文章:
    $query = new WP_Query( array( 'cat' => '-12,-34,-56' ) );
    
    // 查询分类2和6的文章:
    $query = new WP_Query( array( 'category__and' => array( 2, 6 ) ) );
    
    // 使用 category__in 查询分类2或6的文章 (注意,这不会显示这些类别的任何子类别的文章):
    $query = new WP_Query( array( 'category__in' => array( 2, 6 ) ) );
    
    // 排除多个分类也可以这样:
    $query = new WP_Query( array( 'category__not_in' => array( 2, 6 ) ) );
    

    Tag 标签参数

    • tag (string) – 标签slug
    • tag_id (int) – 标签id
    • tag__and (array) – 标签id
    • tag__in (array) – 标签id
    • tag__not_in (array) – 标签id
    • tag_slug__and (array) – 标签slug
    • tag_slug__in (array) – 标签slug

    示例

    // 查询某个标签的文章,使用标签 slug:
    $query = new WP_Query( array( 'tag' => 'cooking' ) );
    
    // 查询某个标签的文章,使用标签 id:
    $query = new WP_Query( array( 'tag_id' => 13 ) );
    
    // 查询具有这些标签中的“任一”个的文章(OR):
    $query = new WP_Query( array( 'tag' => 'bread,baking' ) );
    
    // 查询具有全部这些标签的文章(AND):
    $query = new WP_Query( array( 'tag' => 'bread+baking+recipe' ) );
    
    // 查询同时具有37和47标签的文章(AND):
    $query = new WP_Query( array( 'tag__and' => array( 37, 47 ) ) );
    
    // 查询具有37或47标签的文章(OR):
    $query = new WP_Query( array( 'tag__in' => array( 37, 47 ) ) );
    
    // 查询文章不包含37和47这两个标签:
    $query = new WP_Query( array( 'tag__not_in' => array( 37, 47 ) ) );
    

    tag_slug__intag_slug__and除了使用slug外,其他行为和上面相同


    Taxonomy 分类法参数

    查询自定义分类的文章用此参数。
    前面章节“分类参数”、“标签参数”所说的分类(category)、标签(tag)都是WordPress内置的分类法(Taxonomy),而此参数则可以查询任意分类法,包括这些内置分类法,当然通常是用于查询我们自定义的分类法。

    • {tax} (string) – 使用 taxonomyslug. (自3.1版以来已弃用,请使用tax_query).
    • tax_query (array) – taxonomy 参数(3.1版开始支持).
      • relation (string) – 当存在多个内部taxonomy数组时,每个数组之间的逻辑关系。可能的值为ANDOR。只有一个taxonomy数组时不要使用
        • taxonomy (string) – 分类法
        • field (string) – terms参数的查询依据,可能的值为term_idnameslugterm_taxonomy_id,默认值为term_id
        • terms (int/string/array) – 分类法项目(terms)
        • include_children (boolean) – 对有分级的taxonomies是否包含其子级,默认为true
        • operator (string) – 操作测试,可能的值为INNOT INANDEXISTSNOT EXISTS,默认值为IN

    示例
    查询自定义分类people下的bob(slug)分类

    $args = array(
        'post_type' => 'post',
        'tax_query' => array(
            array(
                'taxonomy' => 'people',
                'field'    => 'slug',
                'terms'    => 'bob',
            ),
        ),
    );
    $query = new WP_Query( $args );
    

    查询多个自定义分类
    查询movie_genre和actor自定义分类,它们的逻辑关系是AND
    movie_genre的分类是用slug查询,actor则是按term_id查询

    $args = array(
        'post_type' => 'post',
        'tax_query' => array(
            'relation' => 'AND',
            array(
                'taxonomy' => 'movie_genre',
                'field'    => 'slug',
                'terms'    => array( 'action', 'comedy' ),
            ),
            array(
                'taxonomy' => 'actor',
                'field'    => 'term_id',
                'terms'    => array( 103, 115, 206 ),
                'operator' => 'NOT IN',
            ),
        ),
    );
    $query = new WP_Query( $args );
    

    查询分类法的逻辑关系为OR,即查询具有指定categorypost_format的文章

    $args = array(
        'post_type' => 'post',
        'tax_query' => array(
            'relation' => 'OR',
            array(
                'taxonomy' => 'category',
                'field'    => 'slug',
                'terms'    => array( 'quotes' ),
            ),
            array(
                'taxonomy' => 'post_format',
                'field'    => 'slug',
                'terms'    => array( 'post-format-quote' ),
            ),
        ),
    );
    $query = new WP_Query( $args );
    

    tax_query子句可以嵌套,以创建更复杂的查询

    $args = array(
        'post_type' => 'post',
        'tax_query' => array(
            'relation' => 'OR',
            array(
                'taxonomy' => 'category',
                'field'    => 'slug',
                'terms'    => array( 'quotes' ),
            ),
            array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'post_format',
                    'field'    => 'slug',
                    'terms'    => array( 'post-format-quote' ),
                ),
                array(
                    'taxonomy' => 'category',
                    'field'    => 'slug',
                    'terms'    => array( 'wisdom' ),
                ),
            ),
        ),
    );
    $query = new WP_Query( $args );
    

    Search 搜索参数

    按关键词搜索查询文章

    • s (string) – 搜索的关键词

    示例

    $query = new WP_Query( array( 's' => 'keyword' ) );
    

    加上连接符可以用于排除,例如pillow -sofa会返回包含pillow的文章但不包含sofa(4.4版开始支持).


    Post & Page 文章与页面参数

    默认的post_type设置仅查询posts,而不是pages

    • p (int) – 文章id
    • name (string) – 文章slug
    • page_id (int) – 页面id
    • pagename (string) – 页面slug
    • post_parent (int) – 指定父页面id,返回子页面,设置为0仅返回顶级条目
    • post_parent__in (array) – 指定父页面id数组,返回子页面(3.6版起支持)
    • post_parent__not_in (array) – 排除父页面id数组,返回子页面(3.6版起支持)
    • post__in (array) – 获取指定id数组的文章。注意:如果你使用了置顶文章,它将被包含在你的查询结果中!要排除置顶文章,请使用 ignore_sticky_posts
    • post__not_in (array) – 指定要在查询结果中排除的文章,用id数组
    • post_name__in (array) – 获取指定slug数组的文章(4.4版起支持)

    将空数组传递给post__in那么has_posts()将返回true(并且返回所有文章)。所以传递前应该先进行判断,后决定是否WP_Query查询。

    示例

    // 用文章ID查询
    $query = new WP_Query( array( 'p' => 7 ) );
    
    // 用页面ID查询
    $query = new WP_Query( array( 'page_id' => 7 ) );
    
    // 用文章/页面slug查询
    $query = new WP_Query( array( 'name' => 'about-my-life' ) );
    
    // 用页面slug查询
    $query = new WP_Query( array( 'pagename' => 'contact' ) );
    
    // 查询子页面,(格式‘父页面slug/子页面slug’)
    $query = new WP_Query( array( 'pagename' => 'contact_us/canada' ) );
    
    // 查询子页面,指定父页面id
    $query = new WP_Query( array( 'post_parent' => 93 ) );
    
    // 仅查询顶级页面,排除所有子级页面
    $query = new WP_Query( array( 'post_parent' => 0 ) );
    
    // 查询子post,指定父级的id数组
    $query = new WP_Query( array( 'post_parent__in' => array( 2, 5, 12, 14, 20 ) ) );
    
    // 只查询特定的posts
    $query = new WP_Query( array( 'post_type' => 'page', 'post__in' => array( 2, 5, 12, 14, 20 ) ) );
    
    // 查询所有posts,但排除指定id的post
    $query = new WP_Query( array( 'post_type' => 'post', 'post__not_in' => array( 2, 5, 12, 14, 20 ) ) );
    

    注意:在同个查询中post__inpost__not_in不能一起使用。同时注意,使用包含逗号分隔列表的字符串在这里不起作用。如果要传递变量,请确保它是一个正确的整数值数组:

    // 这是错误的
    $exclude_ids = '1,2,3';
    $query = new WP_Query( array( 'post__not_in' => array( $exclude_ids ) ) );
     
    // 这样才对
    $exclude_ids = array( 1, 2, 3 );
    $query = new WP_Query( array( 'post__not_in' => $exclude_ids ) );
    

    Password 密码参数

    默认的post_type设置仅查询posts,而不是pages

    • has_password (bool) – true/false是否查询有密码的文章,null则查询所有文章(3.9版开始支持)
    • post_password (string) – 指定文章密码(3.9版开始支持)

    示例

    // 仅查询有密码保护的文章
    $query = new WP_Query( array( 'has_password' => true ) );
    
    // 仅查询没有密码保护的文章
    $query = new WP_Query( array( 'has_password' => false ) );
    
    // 查询有密码和无密码的所有文章
    $query = new WP_Query( array( 'has_password' => null ) );
    
    // 查询指定密码的文章
    $query = new WP_Query( array( 'post_password' => 'zxcvbn' ) );
    

    Post Type 文章类型参数

    查询自定义文章类型的文章用此参数。

    • post_type (string / array) – 类型,默认值为post。如果进行tax_query查询,默认值变成any;
      • post – post类型,通常所说的文章
      • page – page类型,即页面
      • revision – 修订版
      • attachment – 附件,WP_Query的 post_status 参数值默认为publish,而附件的默认发布状态是inherit,也就是说在查询的时候,如果没有显式地设置 post_status 参数值为inheritany,则不会返回任何附件,参见下文章节“状态参数”。
      • nav_menu_item – 导航菜单项
      • any – 查询任意类型,排除exclude_from_search设置为true的以及修订版。(当我们自定义文章类型时,可以设置exclude_from_search

    示例

    // 只查询页面
    $query = new WP_Query( array( 'post_type' => 'page' ) );
    
    // 查询任意类型(排除修订版和‘exclude_from_search’设置为true的)
    $query = new WP_Query( array( 'post_type' => 'any' ) );
    
    // 查询多个类型,包括自定义类型
    $args = array(
        'post_type' => array( 'post', 'page', 'movie', 'book' )
    );
    $query = new WP_Query( $args );
    

    Status 状态参数

    • post_status (string / array) – 文章的状态,默认值为publish,但如果用户已登录,则会加上private。默认情况下还包括自定义状态。如果查询是在管理环境(管理区域或AJAX调用)中运行的,那么也会添加受保护的状态。默认情况下,受保护的状态为futuredraftpending
      • publish – 发布状态
      • pending – 待审核
      • draft – 草稿
      • auto-draft – 自动创建的没有内容的草稿
      • future – 计划发布
      • private – 私密,对未登录的用户不可见
      • inherit – 修订
      • trash – 在回收站中 (2.9版开始支持).
      • any – 除了inherittrashauto-draft以外的任何状态,自定义文章状态的exclude_from_search设置为true也同样排除。

    示例

    // 只查询草稿(draft)
    $query = new WP_Query( array( 'post_status' => 'draft' ) );
    
    // 查询多种状态
    $args = array(
        'post_status' => array( 'pending', 'draft', 'future' )
    );
    $query = new WP_Query( $args );
    
    // 查询所有附件
    $args = array(
        'post_status' => 'any',
        'post_type'   => 'attachment'
    );
    $query = new WP_Query( $args );
    

    Comment 评论参数

    自4.9版开始引入$comment_count参数,它可以是整数或数组。

    • comment_count (int) – 整数,您的CPT必须拥有的评论数量(搜索运算符将执行=操作)
    • comment_count (Array) – 如果comment_count是一个数组,应该有两个参数:
      • value – 评论数量(要进行compare操作比较的数量)
      • compare – 搜索操作,值可以是=!=>>=<<=,默认值=

    示例

    // 查询有20条评论的文章(评论‘=’20)
    $args = array(
        'post_type' => 'post',
        'comment_count' => 20,
    );
    $query = new WP_Query( $args );
    
    // 查询评论数量大于等于25的文章
    $args = array(
        'post_type' => 'post',
        'comment_count' => array(
            'value' => 25,
            'compare' => '>=',
        )
    );
    $query = new WP_Query( $args );
    

    Pagination 分页参数

    • nopaging (boolean) – 要显示所有文章还是使用分页,默认值false,使用分页
    • posts_per_page (int) – 每页要显示的文章数 (自2.1版开始取代showposts参数). 使用 'posts_per_page'=>-1 显示所有文章(-1值将忽略offset参数)。使用此参数后如果分页出现偏离请设置paged参数。注意:如果查询是在feed中,wordpress将使用posts_per_rss选项的值替代此参数的值,要重新恢复,尝试使用post_limits钩子或pre_option_posts_per_rss钩子,并返回-1
    • posts_per_archive_page (int) – 在归档页上每页要显示的文章数。在is_archive()is_search()为true的页面上,优先于posts_per_page的值
    • offset (int) – 要除去或忽略的文章数。警告:设置offset参数会覆盖、忽略paged参数且破坏分页,当使用'posts_per_page'=>-1 (显示所有文章)时,忽略 offset 参数。
    • paged (int) – 页数,显示第x页的文章
    • page (int) – 静态首页要显示第x页的文章
    • ignore_sticky_posts (boolean) – 是否忽略置顶文章 (3.1版开始, 取代 caller_get_posts 参数)。false(默认):置顶文章将被移入到查询结果的开头;true:不包含置顶文章

    示例

    // 每页显示3篇文章
    $query = new WP_Query( array( 'posts_per_page' => 3 ) );
    
    // 显示全部文章
    $query = new WP_Query( array( 'posts_per_page' => -1 ) );
    
    // 通过禁用分页以显示全部文章
    $query = new WP_Query( array( 'nopaging' => true ) );
    
    // 从第4篇文章开始显示
    $query = new WP_Query( array( 'offset' => 3 ) );
    
    // 从最近3篇文章之后开始显示,每页显示5篇
    $query = new WP_Query( array( 'posts_per_page' => 5, 'offset' => 3 ) );
    
    // 显示第x页的文章
    $query = new WP_Query( array( 'paged' => 6 ) );
    
    // 显示当前页的文章
    $query = new WP_Query( array( 'paged' => get_query_var( 'paged' ) ) );
    
    // 显示当前页的文章,当query变量没有设置(首页)时,设置‘paged’参数为1
    $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
    $query = new WP_Query( array( 'paged' => $paged ) );
    

    分页提示:使用get_query_var('page'),如果你想要query在页面模板中起作用你需要设置静态首页,query变量page同时也保存那些在内容中包含有<!--nextpage-->标签的单页面分页页码

    // 在静态首页显示当前页文章
    $paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
    $query = new WP_Query( array( 'paged' => $paged ) );
    
    // 显示第一篇置顶文章
    $sticky = get_option( 'sticky_posts' );
    $query = new WP_Query( array( 'p' => $sticky[0] ) );
    
    // 显示第一篇置顶文章,如果没有,返回最近发布的一篇文章
    $args = array(
        'posts_per_page'      => 1,
        'post__in'            => get_option( 'sticky_posts' ),
        'ignore_sticky_posts' => 1,
    );
    $query = new WP_Query( $args );
    
    // 显示第一篇置顶文章,如果没有,什么也不返回
    $sticky = get_option( 'sticky_posts' );
    $args = array(
        'posts_per_page'      => 1,
        'post__in'            => $sticky,
        'ignore_sticky_posts' => 1,
    );
    $query = new WP_Query( $args );
    if ( $sticky[0] ) {
        // insert here your stuff...
    }
    
    // 排除所有置顶文章
    $query = new WP_Query( array( 'post__not_in' => get_option( 'sticky_posts' ) ) );
    
    // 排除分类的置顶文章
    // 返回分类的所有文章除了置顶文章,其他地方的置顶文章仍然显示
    $query = new WP_Query( array( 'ignore_sticky_posts' => 1, 'posts_per_page' => 3, 'cat' => 6 );
    
    // 返回分类的所有文章除了置顶文章,并遵循分页规则
    $paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
    $sticky = get_option( 'sticky_posts' );
    $args = array(
        'cat'                 => 3,
        'ignore_sticky_posts' => 1,
        'post__not_in'        => $sticky,
        'paged'               => $paged,
    );
    $query = new WP_Query( $args );
    

    Order & Orderby 排序参数

    • order (string | array) – 指定数据是升序还是降序,默认DESC。可以用数组设置多种排序方式
      • ASC – 升序,值从最低到最高 (1, 2, 3; a, b, c).
      • DESC – 降序,值从最高到最低 (3, 2, 1; c, b, a).
    • orderby (string | array) – 排序依据,默认date (post_date),可以传递一个或多个选项
      • none – 没有排序 (2.8版开始)
      • ID – 按ID排序,注意是大写字母
      • author – 按作者排序
      • title – 按标题排序
      • name – 按文章slug排序
      • type – 按文章类型排序 (4.0版开始)
      • date – 按日期排序
      • modified – 按修改日期排序
      • parent – 按父页面/文章的id排序
      • rand – 随机排序
      • comment_count – 按评论数排序(2.9版开始)
      • relevance – 按以下顺序按搜索词排序:第一,整个句子是否匹配。第二,如果所有搜索词都在标题中。第三,如果任意搜索词出现在标题中。第四,如果内容中出现完整的句子。
      • menu_order – 按页面顺序排序。最常用于页面(编辑页面属性框中的排序字段)和附件(插入/上载媒体库对话框中的整数字段),但可用于具有不同menu_order值的任何文章类型(它们都默认为0)。
      • meta_value – 注意查询中必须同时提供meta_key=keyname参数,还要注意,排序将按字母顺序进行,这对于字符串(即单词)是很好的,但对于数字可能会出乎意料(例如,1、3、34、4、56、6等,而不是您自然期望的1、3、4、6、34、56),可使用meta_value_num参数用于数字值的排序。如果要将meta值强制转换为特定类型,还可以指定meta_type,它的值可以是NUMERICBINARYCHARDATEDATETIMEDECIMALSIGNEDTIMEUNSIGNED,和$meta_query里的相同。当使用meta_type你同时需要相应的使用meta_value_*。举个例子,当meta_type使用DATETIME,你可以使用meta_value_datetime作为排序依据(以meta值作为日期类型来排序)
      • meta_value_num – meta值以数值类型来排序(2.8版开始支持). 注意查询中必须同时提供meta_key=keyname参数,让meta_value以数字(1、3、4、6、34、56)排序
      • post__in – 按post__in数组提供的id排序(3.5版开始支持)。注意 – order参数不会影响此参数的最终排序结果
      • post_name__in – 按post_name__in数组提供的slug排序(4.6版开始支持)。注意 – order参数不会影响此参数的最终排序结果
      • post_parent__in - 按post_parent__in数组提供的id排序(4.6版开始支持). 注意 – order参数不会影响此参数的最终排序结果

    示例

    // 以标题的降序排序
    $args = array(
        'orderby' => 'title',
        'order'   => 'DESC',
    );
    $query = new WP_Query( $args );
    
    // 以‘menu_order’和‘title’降序排序
    $args = array(
        'orderby' => 'menu_order title',
        'order'   => 'DESC',
    );
    $query = new WP_Query( $args );
    
    // 随机排序
    $args = array(
        'orderby'        => 'rand',
        'posts_per_page' => '1',
     
    );
    $query = new WP_Query( $args );
    
    // 按评论统计排序(人气)
    $args = array(
        'orderby' => 'comment_count'
    );
    $query = new WP_Query( $args );
    
    // 显示‘Product’类型的文章,按自定义字段‘Price’排序(注意使用meta_value_num)
    $args = array(
        'post_type' => 'product',
        'orderby'   => 'meta_value_num',
        'meta_key'  => 'price',
    );
    $query = new WP_Query( $args );
    
    // 按‘title’和‘menu_order’排序(title为主)
    $args = array(
        'post_type' => 'page',
        'orderby'   => 'title menu_order',
        'order'     => 'ASC',
    );
    $query = new WP_Query( $args );
    
    // 按‘title’降序‘menu_order’升序(4.0版开始)
    $args = array(
        'orderby' => array( 'title' => 'DESC', 'menu_order' => 'ASC' )
    );
    $query = new WP_Query( $args );
    
    // 多种排序
    $args = array(
        'orderby'  => array( 'meta_value_num' => 'DESC', 'title' => 'ASC' ),
        'meta_key' => 'age'
    );
    $query = new WP_Query( $args );
    
    // 显示自定义文章类型‘my_custom_post_type’,按‘age’排序,用‘meta_query’查询ages为3和4的记录
    $args = array(
        'post_type'  => 'my_custom_post_type',
        'meta_key'   => 'age',
        'orderby'    => 'meta_value_num',
        'order'      => 'ASC',
        'meta_query' => array(
            array(
                'key'     => 'age',
                'value'   => array( 3, 4 ),
                'compare' => 'IN',
            ),
        ),
    );
    $query = new WP_Query( $args );
    

    如果要排序两种不同的postmeta(如城市和省份),需要使用meta query联合查询,见下例

    $q = new WP_Query( array(
        'meta_query' => array(
            'relation' => 'AND',
            'state_clause' => array(
                'key' => 'state',
                'value' => 'Wisconsin',
            ),
            'city_clause' => array(
                'key' => 'city',
                'compare' => 'EXISTS',
            ), 
        ),
        'orderby' => array( 
            'city_clause' => 'ASC',
            'state_clause' => 'DESC',
        ),
    ) );
    

    Date 日期参数

    • year (int) – 四位数年份 (如2011).
    • monthnum (int) – 月数 (从 1 到 12).
    • w (int) – 1年中的某周 (从 0 到 53),取决于start_of_week选项
    • day (int) – 1个月中某天 (从 1 到 31).
    • hour (int) – 小时 (从 0 到 23).
    • minute (int) – 分钟 (从 0 到 60).
    • second (int) – 秒 (0 到 59).
    • m (int) – 年月 (如201307).
    • date_query (array) – 日期参数 (3.7版开始).
      • year (int) – 四位数年份 (如2011).
      • month (int) – 月数 (从 1 到 12).
      • week (int) – 1年中的某周 (从 0 到 53).
      • day (int) – 1个月中某天 (从 1 到 31).
      • hour (int) – 小时 (从 0 到 23).
      • minute (int) – 分钟 (从 0 到 60).
      • second (int) – 秒 (0 到 59).
      • after (string/array) – 检索此日期之后的文章,接受可用于strtotime()的字符串,或yearmonthday值的数组:
        • year (string) 接受任何四位数的年份,默认为空
        • month (string) 月份,接受1-12,默认:12.
        • day (string) 日,接受1-31,默认:月份最后1天
      • before (string/array) – 检索此日期之前的文章,接受可用于strtotime()的字符串,或yearmonthday值的数组:
        • year (string) 接受任何四位数的年份,默认为空
        • month (string) 月份,接受1-12,默认:1.
        • day (string) 日,接受1-31,默认:1.
      • inclusive (boolean) – 对于after/before是否应匹配精确值(精确到时间)
      • compare (string) – 参见WP_Date_Query::get_compare()
      • column (string) – 要查询的列,默认:post_date.
      • relation (string) – ORAND,如何比较子阵列,默认:AND.

    示例

    // 返回 2012-12-12 的文章
    $query = new WP_Query( 'year=2012&monthnum=12&day=12' );
    // 或
    $args = array(
        'date_query' => array(
            array(
                'year'  => 2012,
                'month' => 12,
                'day'   => 12,
            ),
        ),
    );
    $query = new WP_Query( $args );
    
    // 返回今天的文章
    $today = getdate();
    $query = new WP_Query( 'year=' . $today['year'] . '&monthnum=' . $today['mon'] . '&day=' . $today['mday'] );
    // 或
    $today = getdate();
    $args = array(
        'date_query' => array(
            array(
                'year'  => $today['year'],
                'month' => $today['mon'],
                'day'   => $today['mday'],
            ),
        ),
    );
    $query = new WP_Query( $args );
    
    // 返回本周的文章
    $week = date( 'W' );
    $year = date( 'Y' );
    $query = new WP_Query( 'year=' . $year . '&w=' . $week );
    // 或
    $args = array(
        'date_query' => array(
            array(
                'year' => date( 'Y' ),
                'week' => date( 'W' ),
            ),
        ),
    );
    $query = new WP_Query( $args );
    
    // 返回在工作日上午9点至下午5点之间的文章
    $args = array(
        'date_query' => array(
            array(
                'hour'      => 9,
                'compare'   => '>=',
            ),
            array(
                'hour'      => 17,
                'compare'   => '<=',
            ),
            array(
                'dayofweek' => array( 2, 6 ),
                'compare'   => 'BETWEEN',
            ),
        ),
        'posts_per_page' => -1,
    );
    $query = new WP_Query( $args );
    
    // 返回1月1日至2月28日的文章
    $args = array(
        'date_query' => array(
            array(
                'after'     => 'January 1st, 2013',
                'before'    => array(
                    'year'  => 2013,
                    'month' => 2,
                    'day'   => 28,
                ),
                'inclusive' => true,
            ),
        ),
        'posts_per_page' => -1,
    );
    $query = new WP_Query( $args );
    

    请注意,如果在before参数中传递了一个strotime()可用的字符串,并且该字符串仅包含一个日期(不包含时间),则该字符串时间将转换为00:00:00。在这种情况下,即使inclusive设置为true,该日期也不会包含在查询中,如果需要包含,请同时包含时间,例如'before'=>2013-02-28 23:59:59,或者使用数组格式,如果设置了inclusive,则会自动调整数组格式。

    // 返回1年前的文章,但在过去一个月有修改
    $args = array(
        'date_query' => array(
            array(
                'column' => 'post_date_gmt',
                'before' => '1 year ago',
            ),
            array(
                'column' => 'post_modified_gmt',
                'after'  => '1 month ago',
            ),
        ),
        'posts_per_page' => -1,
    );
    $query = new WP_Query( $args );
    

    date_query查询子句同样可以嵌套使用,构建复制的查询,参考前面章节的“分类法参数”


    Post meta 自定义字段参数

    这部分的查询参数是由WP_Meta_Query类解析的,因此,如果此参数列表不是最新的,请查看该类的文档。

    • meta_key (string) – 自定义字段键(key).
    • meta_value (string) – 自定义字段值.
    • meta_value_num (number) – 自定义字段值.
    • meta_compare (string) – 检测meta_value的操作符,值可以是=!=>>=<<=LIKENOT LIKEINNOT INBETWEENNOT BETWEENNOT EXISTSREGEXPNOT REGEXPRLIKE,默认值=.
    • meta_query (array) – 自定义字段参数 (3.1版开始).
      • relation (string) – 当存在多个内部meta_query查询数组时,它们之间的逻辑关系,值可以是ANDOR,只有单个meta_query查询数组时不要使用。

    meta_query还包含一个或多个具有以下键的数组:

    • key (string) – 自定义字段键(key).
    • value (string|array) – 自定义字段值,只有当compareINNOT INBETWEENNOT BETWEEN时,它可以是一个数组,在WordPress 3.9及更高版本中使用EXISTSNOT EXISTS比较时,不必指定值。
    • compare (string) – 检测value的操作符,值可以是=!=>>=<<=LIKENOT LIKEINNOT INBETWEENNOT BETWEENNOT EXISTSREGEXPNOT REGEXPRLIKE,默认值=
    • type (string) – 自定义字段类型,值可以是NUMERICBINARYCHARDATEDATETIMEDECIMALSIGNEDTIMEUNSIGNED,默认值CHAR.

    只有日期以YYYY-MM-DD格式存储的情况下,type值为DATE同时compare值为BETWEEN的测试才能有效,且以该格式进行测试。

    重要提示meta_query查询是由1个或多个内部meta_query查询数组所组成的数组 - 您可以在下面的示例中看到这一点。
    这样的结构允许你同时查询多个自定义字段数据,通过relation参数来描述它们之间的逻辑关系,值可以是ANDOR,默认值为AND

    // 显示自定义字段键名为‘color’的文章,不管字段值是什么
    $query = new WP_Query( array( 'meta_key' => 'color' ) );
    
    // 显示自定义字段值为‘blue’的文章,不管字段键名是什么
    $query = new WP_Query( array( 'meta_value' => 'blue' ) );
    
    // 同上
    $args = array(
        'meta_value' => 'blue',
        'post_type'  => 'page'
    );
    $query = new WP_Query( $args );
    
    // 显示自定义字段键名为‘color’,且自定义字段值为‘blue’的文章
    $args = array(
        'meta_key'   => 'color',
        'meta_value' => 'blue'
    );
    $query = new WP_Query( $args );
    
    // 显示自定义字段键名为‘color’,且自定义字段值不是‘blue’的文章
    $args = array(
        'meta_key'     => 'color',
        'meta_value'   => 'blue',
        'meta_compare' => '!='
    );
    $query = new WP_Query( $args );
    
    // 显示自定义字段键为一个设置日期且自定义字段值为“现在”的文章。仅显示日期未超过的文章。
    $args = array(
        'post_type'    => 'event',
        'meta_key'     => 'event_date',
        'meta_value'   => date( "Ymd" ), // change to how "event date" is stored
        'meta_compare' => '>',
    );
    $query = new WP_Query( $args );
    
    // 显示自定义字段键为‘price’且自定义字段值小于或等于22的‘product'(s)的文章
    // 通过使用“meta_value”参数,值99将被视为大于100,因为数据存储为“字符串”,而不是“数字”。对于数字比较,请使用“meta_value_num”。
    $args = array(
        'meta_key'     => 'price',
        'meta_value'   => '22',
        'meta_compare' => '<=',
        'post_type'    => 'product'
    );
    $query = new WP_Query( $args );
    
    // 显示自定义字段值为(0)的文章,不管字段键名是什么
    $args = array(
        'meta_value' => '_wp_zero_value'
    );
    $query = new WP_Query( $args );
    
    
    // 使用meta_query只查询1个自定义字段
    // 注意:meta_query查询必须是数组,即使只查询1个字段
    $args = array(
        'post_type'  => 'product',
        'meta_query' => array(
            array(
                'key'     => 'color',
                'value'   => 'blue',
                'compare' => 'NOT LIKE',
            ),
        ),
    );
    $query = new WP_Query( $args );
    
    
    // 查询多个自定义字段
    $args = array(
        'post_type'  => 'product',
        'meta_query' => array(
            array(
                'key'     => 'color',
                'value'   => 'blue',
                'compare' => 'NOT LIKE',
            ),
            array(
                'key' => 'price',
                'value'   => array( 20, 100 ),
                'type'    => 'numeric',
                'compare' => 'BETWEEN',
            ),
        ),
    );
    $query = new WP_Query( $args );
    
    
    // 查询多个自定义字段,字段之间的逻辑关系为'OR'
    // 显示键名为‘color’,值NOT LIKE ‘blue’,或键名为‘price’,值在20到100之间的文章
    $args = array(
        'post_type'  => 'product',
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key'     => 'color',
                'value'   => 'blue',
                'compare' => 'NOT LIKE',
            ),
            array(
                'key'     => 'price',
                'value'   => array( 20, 100 ),
                'type'    => 'numeric',
                'compare' => 'BETWEEN',
            ),
        ),
    );
    $query = new WP_Query( $args );
    
    
    // 可以嵌套‘meta_query’子句以构造复杂的查询
    $args = array(
        'post_type'  => 'product',
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key'     => 'color',
                'value'   => 'orange',
                'compare' => '=',
            ),
                    array(
                            'relation' => 'AND',
                            array(
                                    'key' => 'color',
                                    'value' => 'red',
                                    'compare' => '=',
                            ),
                            array(
                                    'key' => 'size',
                                    'value' => 'small',
                                    'compare' => '=',
                            ),
            ),
        ),
    );
    $query = new WP_Query( $args );
    

    Permission 权限参数

    根据用户具备的能力(权限)查询文章

    • perm (string) – 用户权限

    示例

    // 如果用户拥有“readable”的能力,显示“发布”和“私密”状态的文章
    $args = array(
        'post_status' => array( 'publish', 'private' ),
        'perm'        => 'readable',
    );
    $query = new WP_Query( $args );
    

    Mime 类型参数

    与附件post类型一起使用

    • post_mime_type (string/array) – 允许的mime类型

    示例
    获取gif图像,请记住,默认情况下,附件的post_statusinherit

    $args = array(
        'post_type'  => 'attachment',
        'post_status'    => 'inherit',
        'post_mime_type' => 'image/gif',
    );
    $query = new WP_Query( $args );
    

    要排除某些mime类型,首先需要使用get_allowed_mime_types()获取所有mime类型,并使用array_diff()在所需的数组和允许的mime类型之间取得差异。

    $unsupported_mimes  = array( 'image/jpeg', 'image/gif', 'image/png', 'image/bmp', 'image/tiff', 'image/x-icon' );
    $all_mimes          = get_allowed_mime_types();
    $accepted_mimes     = array_diff( $all_mimes, $unsupported_mimes );
    $args           = array(
        'post_type'         => 'attachment',
        'post_status'       => 'inherit',
        'post_mime_type'    => $accepted_mimes,
    );
    $query          = new WP_Query( $query_args );
    

    缓存参数

    停止将检索到的数据添加到缓存

    • cache_results (boolean) – 文章缓存.
    • update_post_meta_cache (boolean) – 文章meta缓存.
    • update_post_term_cache (boolean) – 文章term缓存.

    示例

    // 查询文章,文章的数据不缓存
    $args = array(
        'posts_per_page' => 50,
        'cache_results'  => false
    );
    $query = new WP_Query( $args );
    
    // 文章的meta数据不缓存(文章的自定义字段)
    $args = array(
        'posts_per_page'         => 50,
        'update_post_meta_cache' => false
    );
    $query = new WP_Query( $args );
    
    // 文章的term数据不缓存(文章的分类、标签、自定义分类等)
    $args = array(
        'posts_per_page'         => 50,
        'update_post_term_cache' => false
    );
    $query = new WP_Query( $args );
    

    在一般情况下,您不需要使用这些,添加到缓存是正确的做法,但是它们在特定情况下可能有用。这种情况的一个例子可能是,使用WP_Query检索要显示的文章标题和url列表,但不使用关于文章的其他信息,也不需要分类数据(term)和元数据(meta)。通过不加载此信息,可以节省额外的不必要SQL查询的时间。

    注意:如果使用持久对象缓存后端(如memcached),则默认情况下,这些标志设置为false,因为当存在持久缓存时,无需在每次页面加载时更新缓存。


    返回字段参数

    • fields (string) – 返回哪些字段,有三种选择:
      • all – 返回所有字段 (默认).
      • ids – 返回post id的一个数组.
      • id=>parent – 返回具有ID和post_parent属性的stdClass对象数组

    传递任何其他内容都将返回所有字段(默认值)—— 一个post对象数组。


    源码

    查看源码 官方文档