WordPress文章查询方法——WP_Query类

Wordpress主题 2015年09月21日 , ,

概述

WP_Query类是WordPress用于处理复杂请求时查询文章的类。全局对象$wp_query根据当前的请求,决定如何进行查询,并返回请求的文章。

大多数情况下,要获得一些信息时,不需要直接地处理WP_Query类的局部和全局变量,而是通过调用全局函数来获得这些信息。

一般只在如下两种情况下使用WP_Query类,第一种情况是要获得当前请求类型时。属性$is_*用来保存请求信息。当前一般使用条件标签(Conditional Tags)进行代替。这对插件开发者来说是最常见的,对主题开发者也是十分常见的。

第二种情况是在循环中。WP_Query类为循环中的常用任务提供了大量的函数。例如,have_posts()用于查询当前是否在显示的文章,就调用$wp_query->have_posts()。如果有,就开始while循环,使用have_posts()作为循环条件,只要有文章要显示就一直迭代。在每一次迭代中,函数the_post()用于改变$wp_query的内部状态和全局的$post对象,也调用$wp_query->the_post()。还有很多其他的函数在有循环的主题文件中。参考The Loop和The Loop in Action。

如果在非主查询中使用了the_post()函数,并且在其后需要使用主查询,则需要调用wp_reset_postdata()函数。

用法

标准循环

<?php 
// 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
}
// Restore original Post Data
wp_reset_postdata();
?>

标准循环(可选)

<?php 
// The Query 
$the_query = new WP_Query($args); ?>

<?php if ($the_query->have_posts()) : ?>

    <!-- Pagination here -->

    <!-- The Loop -->
    <?php while ($the_query->have_posts()) : $the_query->the_post(); ?>


<h2><?php the_title(); ?></h2>


    <?php endwhile; ?>
    <!-- End of The Loop -->

    <!-- Pagination here -->
    <?php wp_reset_postdata(); ?>

<?php else : ?>
    <?php _e('Sorry, no posts matched your criteria.'); ?>
<?php endif; ?>

多个循环

如果有多个查询,则应该有多个循环。如:

// 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:由于新建了WP_query对象,并没有对原来全局对象$wp_query进行更改,
 * 所以不需要使用wp_reset_query()重置查询,只需使用wp_reset_postdata()
 * 将post data重置。
 */
wp_reset_postdata();

// The 2nd query
$query2 = new WP_Query($args2);

// The 2nd query
while ($query2->have_posts()) {
    $query2->the_post();
    echo '<li>'.get_the_title($query->post->ID).'</li>';
}

// Restore original Post Data
wp_reset_postdata();
?>

方法和属性

不应该直接对WP_Query的属性进行修改,应该使用方法进行操作。

属性

  • $query
    保存通过WP类传递的查询字符串。
  • $query_vars
    包含对$query解剖的关联数组,包含查询变量及值。
  • $queried_object
    适用于请求是Category, Author, Permalink, or Page的情况。保存相应请求信息。
  • $queried_object_id
    如果请求是Category, Author, Permalink, or Post/Page,保存关联的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_time, $is_404, $is_comments_popup, $is_admin, $is_attachment, $is_singular, $is_robots, $is_posts_page, $is_paged
    请求类型。

方法

  • init()
    初始化对象,将所有属性初始化为null, zero, or false。
  • parse_query($query)
    根据查询字符串定义请求,解析它并填充除$posts, $post_count, $post, $current_post外的所有属性。
  • parse_query_vars()
    重新解析旧的查询字符串。
  • get($query_var)
    获得指定的查询变量值。
  • set($query_var, $value)
    将指定的查询变量设置为指定值。
  • &get_posts()
    从数据库中获得并返回请求的文章。设置$posts和$post_count变量。
  • next_post()
    在循环中使用,在$posts中前进到下一个文章。更新$current_post,并将$post设置为新的文章对象(并不是更新全局的$post对象),返回当前文章对象。
  • the_post()
    在循环中使用,前进到下一个文章,并设置全局的$post对象。
  • have_posts()
    在循环中使用,或者在循环之前。检查是否还有文章要显示。如果没有文章则调用rewind_posts()并返回false。
  • rewind_posts()
    重置$current_post和$post。
  • &query($query)
    调用parse_query()get_posts(),并返回get_posts()的结果。
  • get_queried_object()
    如果没有设置$queried_object对象,则设置它。返回$queried_object。
  • get_queried_object_id()
    如果没有设置$queried_object_id对象,则设置它。返回$queried_object_id。
  • WP_Query($query = '')
    构造函数,如果提供了参数则调用query()

参数

Author参数

显示指定用户/作者的文章。

  • author (int)
    作者ID(Author id)。
  • author_name (string)
    作者昵称(user_nickname)。
  • author__in (array)
    作者ID(Author id)。
  • author__not_in (array)
    作者ID(Author id)。

显示一个作者的文章

使用作者ID来指定显示该作者的文章:

$query = new WP_Query('author=123');

使用作者昵称来指定显示该作者的文章:

$query = new WP_Query('author_name=furzoom');

显示多个作者的文章

使用多个作者ID来指定要显示的文章:

$query = new WP_Query('author=1,2,6');

排除属于指定作者的文章

显示除某个(一个)指定作者以外的所能文章,在ID前使用-

$query = new WP_Query('author=-123');

多作者文章

显示多个作者的文章:

$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 id)。
  • category_name (string)
    分类slug(Category slug)。
  • category__and (array)
    分类ID(Category id)。
  • category__in (array)
    分类ID(Category id)。
  • category__not_in (array)
    分类ID(Category id)。

显示一个分类的文章

显示指定分类及其子分类的文章,使用分类ID:

$query = new WP_Query('cat=4');

显示指定分类及其子分类的文章,使用分类slug:

$query = new WP_Query('category_name=staff');

显示指定分类的文章,不包括其子分类,使用分类ID:

$query = new WP_Query('category__in=4');

显示多个分类的文章

显示有这些分类的文章,使用分类ID:

$query = new WP_Query('cat=2,6,17');

显示有这些分类的文章,使用分类slug:

$query = new WP_Query('category_name=staff,news');

显示同时有这些分类的文章:

$query = new WP_Query('category_name=staff+news');

排除某些分类的文章

显示除某些分类外的所有文章,在其分类ID前使用-

$query = new WP_Query('cat=-2,-6,-17');

多分类控制

显示属于多个分类的文章,如显示同时属于分类ID为2和6的文章:

$query = new WP_Query(array('category__and'=>array(2, 6)));

显示属于分类ID为2或者6的文章,可以使用上面提到的cat方式,也可以使用category__in,这并不包含其子分类的文章:

$query = new WP_Query(array('category__in'=>array(2, 6)));

显示除指定几个分类的文章:

$query = new WP_Query(array('category__not_in'=>array(2, 6)));

Tag参数

显示指定Tags下的文章。

  • tag (string)
    标签Slug(tag slug)。
  • tag_id (int)
    标签ID(tag id)。
  • tag__and (array)
    标签ID(tag ids)。
  • tag__in (array)
    标签ID(tag ids)。
  • tag__not_in (array)
    标签ID(tag ids)。
  • tag_slug__and (array)
    标签Slug(tag slugs)。
  • tag_slug__in (array)
    标签Slug(tag slugs)。

显示一个标签的文章

显示指定标签下的文章,使用标签Slug:

$query = new WP_Query('tag=cooking');

显示指定标签下的文章,使用标签ID:

$query = new WP_Query('tag_id=2');

显示多个标签下的文章

显示多个(either)标签下的文章:

$query = new WP_Query('tag=bread,baking');

显示多个(all)标签下的文章:

$query = new WP_Query('tag=bread+baking');

多个标签控制

显示同时在多个标签下的文章,如同时有标签ID为47和37的文章:

$query = new WP_Query(array('tag__and' => array(37, 47)));

显示多个标签下的文章,如在标签ID为37或者47下的文章:

$query = new WP_Query(array('tag__in' => array(37, 47)));

排除多个标签下的文章,如既不在标签ID为37也不在标签ID为47下的文章:

$query = new WP_Query(array('tag__not_in' => array(37, 47)));

参数tag_slug__intag_slug__and的行为与上面介绍的相似,除了其匹配标签Slug以外。

Taxonomy参数

显示指定taxonomy下的文章。

  • {tax} (string)
    使用taxonomy slug。已弃用。
  • tax_query (array)
    • relation (string)
      当使用多于一个taxonomy数组时,它们之间的关系,可选值为AND, OR。如果只有一个taxonomy数组,则不要使用该参数。

      • taxonomy (string)
        Taxonomy。
      • field (string)
        查询taxonomy下term的依据为。可选值为term_id, name, slug。默认值为term_id
      • terms (int/string/array)
        Taxonomy terms。
      • include_children (boolean)
        是否包括taxonomy下term的子term。默认为true。
      • operator (string)
        测试的方法。可选值为IN, NOT IN, AND, EXISTS, NOT EXISTS。默认值为IN

NB:tax_query采用tax query参数数组的数组。这样可以在第一个数组外通过relation指定一个布尔关系,来查询多个taxonomy。

简单taxonomy查询

显示people分类方法下具有bob标签的文章:

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

多个taxonomy查询

显示多个taxonomy下的文章

$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);

显示quotes分类下或者具有quote类型的文章:

$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);

嵌套taxonomy查询

tax_query可以嵌套使用,来创建更加复杂的查询。例如:显示qoutes分类下或者同时拥有quote类型文章且在wisdom分类下的文章:

$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);

搜索参数

显示基于指定搜索词的文章。

  • s (string)
    搜索词。

显示基于指定搜索词的文章

显示符合搜索词keyword的文章:

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

文章(post)与页面(page)参数

显示基于文章和页面的参数的内容。切记默认的post_type只显示文章(post),而不是页面(page)。

  • p (int)
    文章(post)id。
  • name (string)
    文章(post)slug。
  • page_id (int)
    页面(page)id。
  • pagename (string)
    页面(page)slug。
  • post_parent (int)
    页面(page)id。返回其子页面,设置为0,则返回所有顶级页面。
  • post_parent__in (array)
    文章(post)ids。返回其父级为指定id的文章。(V3.6+)
  • post_parent__not_in (array)
    文章(post)ids。返回其父级不是指定id的文章。(V3.6+)
  • post__in (array)
    文章(post)ids。返回指定ids的文章。如果有置顶(sticky)文章,无论是否指定,都会返回。
  • post__not_in (array)
    文章(post)ids。指定不返回的文章。
  • post_name__in (array)
    文章(post)slug。指定返回的文章。(V4.4+)

使用ID指定文章或页面

查询指定ID的文章:

$query = new WP_Query('p=7');

查询指定ID的页面:

$query = new WP_Query('page_id=7');

使用slug指定文章或页面

查询指定slug文章:

$query = new WP_Query('name=about_us');

查询指定slug页面:

$query = new WP_Query('pagename=contact');

显示子级文章或页面

显示指定子页面,指定父页面和子页面,并用斜线分隔:

$query = new WP_Query('pagename=contact_us/canada');

通过指定父页面ID,显示子页面:

$query = new WP_Query('post_parent=93');

只显示顶级页面,而不显示子页面:

$query = new WP_Query('post_parent=0');

显示指定父类文章的子文章:

$query = new WP_Query(array('post_parent__in' => array(2, 5)));

多参数的选择

显示指定文章:

$query = new WP_Query(array('post_type' => 'page', 'post_in' => array(2, 5)));

显示除指定以外的文章:

$query = new WP_Query(array('post_type' => 'post', 'post__not_in' => array(2, 5)));

注意:1. 不能在同一个查询中同时使用参数post__inpost__not_in
2.此处也不能使用字符串形式的参数中带有逗号分隔的列表的参数。

// NOT work
$exclude_ids = '1,2,3';
$query = new WP_Query(array('post__not_in' => array($exclude_ids)));

// WILL work
$exclude_ids = array(1,2,3);
$query = new WP_Query(array('post__not_in' => $exclude_ids));

密码参数

  • has_password (bool)
    true表示文章带有密码,false表示文章没有密码,null表示所有文章。(V3.9+)
  • post_password (string)
    显示指定密码的文章。(V3.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));

显示指定密码的文章

显示密码为furzoom的文章:

$query = new WP_Query(array('post_password' => 'furzoom'));

类型参数

显示类型相关的文章:

  • post_type (string/array)
    文章类型(post types)。返回指定类型的posts。默认值为post。如果设置查询为tax_query,则默认值为any

    • 'post'
      一篇文章(a post)
    • 'page'
      一个页面(a page)
    • 'revision'
      一个修订版本(a revision)
    • 'attachment'
      一个附件(an attachment)。默认的WP_Querypost_statuspublish,附件的默认post_statusinherit
    • 'nav_menu_item'
      一个导航菜单项(a navigation menu item)
    • 'any'
      返回除修订版本(revision)和将exclude_from_search设置为true的类型外所有文章。
    • 自定义类型

通过类型指定显示文章

仅显示页面(pages):

$query = new WP_Query('post_type=page');

显示除修订版本和将exclude_from_search设置为true外的所有文章:

$query = new WP_Query('post_type=any');

显示多个类型的文章,包括自定义类型的文章:

$args = array('post_type' => array('post', 'page', 'movie', 'book'));
$query = new WP_Query($args);

状态参数

显示特定状态的文章。

  • post_status (string/array)
    文章状态。返回指定状态的文章。默认为'publish'。如果用户已登录,则添加'private'。如果用户为管理员,且显示管理的内容(管理面板或者AJAX调用)时,添加保护状态。默认的保护状态为'future''draft''pending'

    • 'publish'
      已发布的文章或页面
    • 'pending'
      预览的文章
    • 'draft'
      草稿状态的文章
    • 'auto-draft'
      新创建还没有内容的文章
    • 'future'
      定时在将来发布的文章
    • 'private'
      非登录的用户不可见的文章
    • 'inherit'
      修订版本
    • 'trash'
      在垃圾箱中的文章
    • 'any'
      除将exclude_from_search设置为true外的文章,如trash和auto-draft的文章。

通过状态显示文章

只显示草稿:

$query = new WP_Query('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);

分页参数

  • nopaging (boolean)
    显示全部文章还是分布,默认值为false,使用分页
  • posts_per_page (int)
    每页显示文章的数量。参数'posts_per_page'=>-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()为真时,覆盖posts_per_page和showposts参数
  • offset (int)
    已经显示或者错过的文章数量。设置该参数将覆盖或者忽略分页参数,并打断分页。当设置'posts_per_page'=>-1时,该参数将被忽略
  • paged (int)
    页数。显示在页码X上的文章
  • page (int)
    静态主页的页数。静态主页上显示在页码X上的文章
  • ignore_sticky_posts (boolean)
    忽略置顶文章(V3.1+)。默认值为false。false表示将置顶文章移动在最上面,true表示不移动置顶文章的位置。

每页显示x篇文章

每页显示3篇文章:

$query = new WP_Query('posts_per_page=3');

显示所有文章

显示所有文章在同一页上

$query = new WP_Query('posts_per_page=-1');

不允许分页,显示所有文章:

$query = new WP_Query('nopaging=true');

跳过文章

从第四篇文章开始显示:

$query = new WP_Query('offset=3');

每页显示5篇文章,跳过最新的3篇文章:

$query = new WP_Query(array('posts_per_page' => 5, 'offset' => 3));

从第x页开始显示文章

从第6页开始显示文章:

$query = new WP_Query('paged=6');

从当前页开始显示文章

从当前页开始显示文章:

$query = new WP_Query(array('paged' => get_query_var('paged')));

从当前页开始显示文章,如果查询变量没有设置(第一页),将'paged'设置为1:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$query = new WP_Query(array('paged' => $paged));

分页注意:当设置了静态首页是,如果需要查询对页面模板(page template)有效,则使用get_query_var('page');。查询变量'page'对于单个文章和页面还保存了页数,即包含了<!--nextpage-->Quicktag。

在静态首页中,从当前页开始显示文章:

$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('p=' . $sticky[0]);

显示第一篇置顶文章,如果没有置顶文章,则显示最新发表的文章:

$args = array(
        'posts_per_page'          => 1,
        'post__in'                => get_option('sticky_posts'),
        'ignore_sticky_posts'     => 1,
);

$query = new WP_Query($args);

显示第一篇置顶由于,如果没有,则返回null:

$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]) {
    // to do 
}

不显示置顶文章

在查询中排除所有置顶文章:

$query = new WP_Query(array('post__not_in' => get_option('sticky_posts')));

从一个分类中排除置顶文章。返回一个分类下的所有文章,但是置顶文章不显示在最上面,而是其应该的位置:

$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)
    根据orderby参数升序还是降序排序。默认为'DESC'。对于多重的参数可以使用数组。

    • 'ASC'
      从小到大的升序排列(1, 2, 3; a, b, c)。
    • 'DESC'
      从大到小的降序排列(3, 2, 1; c, b, a)。
  • orderby (string/array)
    排序的依据。默认为'date(post_date)'。可以传递一个或者更多的参数。

    • 'none'
      不排序(V2.8+)
    • 'ID'
      根据文章ID排序,注意大写。
    • 'author'
      根据作者排序。
    • 'title'
      根据标题排序
    • 'name'
      根据文章标题排序
    • 'type'
      根据文章类型(post type)排序(V4.0)
    • 'date'
      根据日期排序
    • 'modified'
      根据最后的日期排序
    • 'parent'
      根据文章(post)/页面(page)的父级ID排序
    • 'rand'
      随机排序
    • 'comment_count'
      根据评论的数量(V2.9+)
    • 'menu_order'
      根据页面的顺序。常用于页面(pages)(在页面编辑的页面中指定排序)和附件(插入和上传多媒体对话框的数字域),但是可以用所有的文章类型,默认为0。
    • 'meta_value'
      需要在查询字符串包含'meta_key=keyname'。切记:排序方法是按照字母顺序的,这对字符串来讲是没有问题的,但是对于数字来讲是不对的(1, 3, 34, 4, 56, 6。而不是1, 3, 4, 6, 34, 56)。使用meta_value_num来代替数字值。如果需要指定meta_value的类型,可以使用meta_type参数。可选的参数为'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'
    • 'meta_value_num'
      依据meta_value的数字值排序。在查询字符串要使用'meta_key=keyname'参数。该值允许按照meta_value的数字值进行排序。(V2.8+)
    • 'post__in'
      post__in数组中给出保留的文章ID顺序。(V3.5+)

按标题降序显示文章

按照文章标题的降序来显示文章:

$args = array(
    'orderby' => 'title',
    'order'   => 'DESC',
);
$query = new WP_Query($args);

menu_order降序显示文章,如果该参数相同,则按照文章标题降序显示文章:

$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排序:

$args = array(
    'post_type' => 'product',
    'orderby'   => 'meta_value_num',
    'meta_key'  => 'price',
);
$query = new WP_Query($args);

多个排序依据值

按照标题和menu_order顺序显示页面:

$args = array(
    'post_type' => 'page',
    'orderby'   => 'title menu_order',
    'order'     => 'ASC',
);
$query = new WP_Query($args);

使用数组表多个排序依据值

按照标题和menu_order不同的顺序显示页面(V4.0+):

$args = array(
    'post_type' => 'page',
    '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);

按照meta_value排序显示自定义文章类型

按照'age'排序显示'my_custom_post_type'类型的文章,且只显示年龄在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);

日期参数

显示与日期和时间关联的文章。

  • year (int)
    4位数字的年份,如2015。
  • monthnum (int)
    月份,1~12。
  • w (int)
    一年中的第几周,0~53,与一周的开始是周几相关。
  • day (int)
    一个月中的第几天,1~31。
  • hour (int)
    小时,0~23。
  • minute (int)
    分钟,0~60。
  • second (int)
    秒,0~60。
  • m (int)
    年月,如201509。
  • date_query (array)
    日期参数(V3.7+)
    • year (int)
      4位数字的年份,如2015。
    • month (int)
      月份,1~12。
    • week (int)
      一年中的第几周,0~53。
    • day (int)
      一个月中的第几天,1~31。
    • hour (int)
      小时,0~59。
    • minute (int)
      分钟,0~59。
    • second (int)
      秒,0~59。
    • after (string/array)
      某个时间之后的文章。接受适用地strtotime()字符串参数,或者'year','mouth','day'的参数数组。

      • year (string)
        4个数字的年份表示。默认为空。
      • month (string)
        月份。参数为1~12,默认为12。
      • day (string)
        月份中的天数。参数为1~31,默认为指定月份的最后一天。
    • before (string/array)
      某个时间之前的文章。接受适用地strtotime()字符串参数,或者'year','mouth','day'的参数数组。

      • year (string)
        4个数字的年份表示。默认为空。
      • month (string)
        月份。参数为1~12,默认为12。
      • day (string)
        月份中的天数。参数为1~31,默认为指定月份的最后一天。
    • inclusive (boolean)
      针对参数before和after,表示指定的日期是否包含在内。
    • compare (string)
      同WP_Date_Query::get_compare()。包括=!=>>=<<=INNOT INBETWEENNOT BETWEEN
    • column (string)
      wp_posts表中要查询的列,默认为post_date
    • relation (string)
      OR或者AND,子数组的对比方式,默认为AND。

返回2015年12月22号的文章

$query = new WP_Query('year=2015&monthnum=12&day=22');

或者:

$args = array(
    'date_query' => array(
        array(
            'year'  => 2015,
            'month' => 12,
            'day'   => 22,
        ),
    ),
);
$query = new WP_Query($args);

返回当前的文章

$today = getdate();
$query = new WP_Query('year=' . $toady['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);

注意:使用适合于strtotime()的字符串参数时,如果没有指定时间,将会把时间初始化为00:00:00。这样如果在before参数这样使用,即使将inclusive参数设置为true,也不是包含当前的文章。但是使用数组形式的参数,将会有自适应inclusive参数。

返回1年前创建但在过去1个月内修改过的文章

$args = array(
    'date_query' => array(
        array(
            'column'  => 'post_date_gmt',
            'before'  => '1 year age',
        ),
        array(
            'column'  => 'post_modified_gmt',
            'after'   => '1 month age',
        ),
    ),
    'posts_per_page' => -1,
);
$query = new WP_Query($args);

date_query参数可以嵌套使用,以实现复杂的查询。

自定义字段参数

显示与自定义字段相关的文章。

这部分的参数是通过类WP_Meta_Query来解析的。

  • meta_key (string)
    自定义字段的key。
  • meta_value (string/array)
    自定义字段的value。
  • meta_type (number)
    自定义字段类型。参数如下面的type所示。
  • meta_compare (string)
    测试meta_value参数操作的方式。参数如下面compare所示。
  • meta_query (array)
    包含一个或多个下面参数的数组:

    • key (string)
      自定义字段的key。
    • value (string/array)
      自定义字段的value。当compare参数的值为'IN'、'NOT IN'、'BETWEEN'、'NOT BETWEEN'时,本参数可以为数组。当compare参数的值为'EXISTS'和'NOT EXISTS'时,可以不指定本参数(V3.9+)。
    • compare (string)
      测试的方法。可选值为=!=>>=<<=LIKENOT LIKEINNOT INBETWEENNOT BETWEENEXISTS(V3.5+)、NOT EXISTS(V3.5+)、REGEXP(V3.7+)、NOT REGEXP(V3.7+)、RLIKE(V3.7+)。默认值为=
    • type (string)
      自定义字段类型。可选值为NUMERICBINARYCHARDATEDATETIMEDECIMALSIGNEDTIMEUNSIGNED。默认值为CHAR

当compare的值为BETWEEN时,类型DATE仅仅被存储为YYYY-MM-DD时才可以使用。

简单的自定义字段查询

显示自定义字段的key为color的文章,不考虑其value:

$query = new WP_Query('meta_key=color');

显示自定义字段的value为blue的文章,不考虑其key:

$query = new WP_Query('meta_value=blue');

显示自定义字段的value为blue的页面,不考虑其key:

$query = new WP_Query('meta_value=blue&post_type=page');

显示自定义字段的key为color且value为blue的文章:

$args = array(
    'meta_key'    => 'color',
    'meta_value'  => 'blue',
);
$query = new WP_Query($args);

显示自定义字段的key为color且value不为blue的文章:

$args = array(
    'meta_key'     => 'color',
    'meta_value'   => 'blue',
    ’meta_compare' => '!=',
);
$query = new WP_Query($args);

显示自定义字段的key为price且value小于等于22的类型为product的文章:

$args = array(
    'meta_key'     => 'price',
    'meta_value'   => '22',
    'meta_type'    => 'NUMERIC',
    'meta_compare' => '<=',
);
$query = new WP_Query($args);

显示自定义字段的value为0的文章:

$args = array(
    'meta_value'  => '_wp_zero_value',
);
$query = new WP_Query($args);

单一自定义字段的控制

显示单一自定义字段关联的文章:

$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);

meta_query内多个数组之间的关系默认为AND的关系,还可以指定为OR:

$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);

还可以使用嵌套的查询以实现更复杂的查询,如:

$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);

权限参数

  • perm (string)
    用户权限。

当用户有权限时才显示文章

如果用户有权限,则显示已发布且私有的文章:

$args = array(
    'post_status' => array('publish', 'private'),
    'perm'        => 'readable',
);
$query = new WP_Query($args);

缓存参数

查询返回的信息不添加到缓存。

  • cache_results (boolean)
    文章信息缓存。
  • update_post_meta_cache (boolean)
    文章meta信息缓存。
  • update_post_term_cache (boolean)
    文章term信息缓存。

显示文章,不将其加入缓存

显示50篇文章,并不将其添加到缓存:

$args = array(
    'posts_per_page' => 50,
    'cache_results'  => false,
);
$query = new WP_Query($args);

显示文章,不将其meta信息加入缓存

显示50篇文章,并不将其meta信息添加到缓存:

$args = array(
    'posts_per_page'          => 50,
    'update_post_meta_cache'  => false,
);
$query = new WP_Query($args);

显示文章,不将其term信息加入缓存

显示50篇文章,并不将其term信息添加到缓存:

$args = array(
    'posts_per_page'          => 50,
    'update_post_term_cache'  => false,
);
$query = new WP_Query($args);

返回字段参数

设置返回值。

  • fields (string)
    返回的字段,默认为返回所有的字段。

    • 'ids'
      返回文章ID数组。
    • 'id=>parent'
      返回ID和post_parent属性对数组。
    • 其他参数,将返回所有字段。

(完)

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
日志标题:《WordPress文章查询方法——WP_Query类》
日志链接:http://furzoom.com/wordpress-wp_query-class/
博客名称:枫竹梦

1 篇回应 (访客:1 篇, 博主:0 篇)

  1. 老杨 2015-28-10

    介绍得好详细,昨晚还找了好久才用上了 taxonomy 查询呢。

    #-49楼

插入图片

NOTICE1:请申请gravatar头像,没有头像的评论可能不会被回复!

回到顶部