描述
WP_Query是wordpress提供的一个类,它支持的参数非常完善灵活,博主通过WP_Query类可以创建自己所需要的wordpress循环输出,比如调用最新文章、热门文章、自定义文章类型文章循环输出等,和query_posts()函数具有相同的查询功能,但优于query_posts()函数。
使用方法
<?php $args = array( // 用于查询的参数或者参数集合 ); // 自定义查询 $the_query = new WP_Query( $args ); // 判断查询的结果,检查是否有文章 if ( $the_query->have_posts() ) : // 通过查询的结果,开始主循环 while ( $the_query->have_posts() ) : $the_query->the_post(); //获取到特定的文章 // 要输出的内容,如标题、日期等 endwhile; endif; // 重置请求数据 wp_reset_postdata(); ?>
代码中$args是定义的参数变量,而变量$the_query是WP_Query类的一个实例,然后通过WP_Query的方法开始查询。
条件参数
<?php $args = array( //作者参数 - 显示与某些作者相关的文章. 'author' => '1,2,3,', //(int) - 使用作者ID [使用minus( - )通过ID EX排除作者. 'author' => '-1,-2,-3,'] 'author_name' => 'luetkemj', //(string) - 使用 'user_nicename' (NOT name) 'author__in' => array(2, 6), //(array) - 使用作者ID. (可使用版本 3.7). 'author__not_in' => array(2, 6), //(array)' - 使用作者ID. (可使用版本 3.7). //类别参数 - 显示与某些分类相关的文章. 'cat' => 5, //(int) - 使用分类ID. 'category_name' => 'staff, news', //(string) - 使用分类SLUG显示具有这些分类的文章. 'category_name' => 'staff+news', //(string) - 使用分类SLUG显示具有"全部"的文章. 'category__and' => array(2, 6), //(array) - 使用分类ID. 'category__in' => array(2, 6), //(array) - 使用分类ID. 'category__not_in' => array(2, 6), //(array) - 使用分类ID. //标签参数 - 显示与某些标签相关的文章. 'tag' => 'cooking', //(string) - 使用标签别名. 'tag_id' => 5, //(int) - 使用标签ID. 'tag__and' => array(2, 6), //(array) - 使用标签ID. 'tag__in' => array(2, 6), //(array) - 使用标签ID. 'tag__not_in' => array(2, 6), //(array) - 使用标签ID. 'tag_slug__and' => array('red', 'blue'), //(array) - 使用标签别名. 'tag_slug__in' => array('red', 'blue'), //(array) - 使用标签别名. //分类参数(自定义分类法) - 显示与某些分类有关的文章. //重要说明:tax_query需要一系列税收查询参数阵列(它需要数组) //此构造允许您使用第一个(外部)阵列中的关系参数来查询多个分类学,以描述分类查询之间的布尔关系. 'tax_query' => array( //(array) - 使用分类法参数 (可使用版本 3.1). 'relation' => 'AND', //(string) -可能的值是 'AND' 或 'OR' 并且相当于为每个分类系统运行加入 array( 'taxonomy' => 'color', //(string) - 分类法. 'field' => 'slug', //(string) - 选择分类法条款 ('id' 或 'slug') 'terms' => array('red', 'blue'), //(int/string/array) - 分类法条款. 'include_children' => true, //(bool) - 是否包括儿童分类分类.默认为 true. 'operator' => 'IN' //(string) - 操作员进行测试.可能的值是 'IN', 'NOT IN', 'AND'. ), array( 'taxonomy' => 'actor', 'field' => 'id', 'terms' => array(103, 115, 206), 'include_children' => false, 'operator' => 'NOT IN' ) ), //文章和页面参数 - 基于文章和页面参数显示内容. 'p' => 1, //(int) - 使用文章ID.. 'name' => 'hello-world', //(string) - 使用文章ID. 'page_id' => 1, //(int) - 使用页面ID. 'pagename' => 'sample-page', //(string) - 使用页面别名. 'pagename' => 'contact_us/canada', //(string) - 使用父页和子页面的SLUP显示子页面,分隔的BA斜杠 'post_parent' => 1, //(int) - 使用页面ID.返回子页面. (仅适用于分层文章类型.) 'post_parent__in' => array(1, 2, 3), //(array) - 使用文章ID.指定父级位于数组中的文章.注意:在3.6中介绍 'post_parent__not_in' => array(1, 2, 3), //(array) - 使用文章ID.指定父级不在数组中的文章. 'post__in' => array(1, 2, 3), //(array) - 使用文章ID.指定文章以检索. 注意如果您使用粘贴文章,他们将被包含(前置!)在您检索您是否想要它的文章中. 抑制这种行为使用 ignore_sticky_posts 'post__not_in' => array(1, 2, 3), //(array) - 使用文章ID.指定文章不检索. 注意:您无法组合 'post__in' and 'post__not_in' 在同一查询中 //////密码参数 - 基于文章和页面参数显示内容.请记住,默认Post_type仅设置为显示文章但不是页面. 'has_password' => true, //(bool) - 可使用版本 3.9 //true 对于密码的文章; //false 对于没有密码的文章; //null 对于包含和没有密码的所有文章 'post_password' => 'multi-pass', //(string) - 显示具有特定密码的文章 (可使用版本 3.9) //////类型状态参数 - 显示与某些类型或状态相关的文章. 'post_type' => array( //(string/array) - 使用文章类型.通过文章类型检索文章,默认值是 'post'; 'post', // - 文章. 'page', // - 页面. 'revision', // - 修订. 'attachment', // - 附件. 默认值 WP_Query 'post_status'=>'published', 但Atchments默认到 'post_status'=>'inherit' 所以你需要将状态设置为 'inherit' 或 'any'. 'my-post-type', // - 自定义文章类型 (e.g. 电影) ), //注意: 用'any'most_type和post_status查询中可用的关键字不能在数组中使用. 'post_type' => 'any', // - 除了修订和类型之外的任何类型的检索 'exclude_from_search' 设置为true. //////类型和状态参数 - 显示与某些类型或状态相关的文章. 'post_status' => array(//(string / array) - 使用文章状态.通过文章状态检索文章,默认值i'publish'. 'publish', // - 已发布文章或页面. 'pending', // - 待审核文章或页面. 'draft', // - 草稿文章或页面. 'auto-draft', // - 系统草稿文章或页面. 'future', // - 将来发布的文章. 'private', // - 对于未登录的用户不可见. 'inherit', // - 修订版本. 'trash' // - 待删除的文章或页面 (可使用版本 2.9). ), //注意: 在 'any' Most_type和Post_Status查询中可用的关键字不能在数组中使用. 'post_status' => 'any', // - 除了从文章类型中检索的任何状态 'exclude_from_search' 设为ture. //////分页参数 'posts_per_page' => 10, //(int) - 每页显示文章数量 (可使用版本 2.1). 使用 'posts_per_page' => -1 显示所有文章.注意: 如果查询处于Feed中,WordPress将使用存储的存储覆盖此参数 'posts_per_rss' option. 遍历限制,尝试使用 'post_limits' 筛选, 或过滤 'pre_option_posts_per_rss' 并返回 -1 'posts_per_archive_page' => 10, //(int) - 每个页面显示的文章数 - 仅在存档页面上.在页面上的页面上乘车显示anposts_per_page is_archive() or is_search() 将会 true 'nopaging' => false, //(bool) - 显示所有文章或使用分页.默认值为 'false', 使用分页. 'paged' => get_query_var('paged'), //(int) - 页数.当USInthe"旧条目"链接时,显示通常在第X页上显示的文章. 注意: 使用 get_query_var('page'); 如果您希望查询在您设置为静态页面的页面模板中工作.查询变量'页面'保存PageNumber以获取单个分页文章或页面,包括<!--nextpage-->QuickTag在文章内容中. 'nopaging' => false, //(boolean) - 显示所有文章或使用分页.默认值为 'false', 使用分页. 'posts_per_archive_page' => 10, //(int) - 每个页面显示的文章数 - 仅在存档页面上. 在页面上过度乘车文章和showposts is_archive() 或 is_search() 是真的. 'offset' => 3, //(int) - 替换或转移的文章数量. // 警告:设置偏移参数覆盖/忽略分页参数并断开分页. // 该 'offset' 参数忽略时 'posts_per_page'=>-1 (显示所有文章)使用. 'paged' => get_query_var('paged'), //(int) - 页数.当USInthe"旧条目"链接时,显示通常在第X页上显示的文章. 注意:整个寻呼的事情变得棘手.有些链接可以帮助你出去: 'page' => get_query_var('page'), //(int) - 静态前页的页数.显示通常在静态页面X上显示的文章. 注意:查询变量页面持有PageNumber以获取包含的单个分页文章或页面 <!--nextpage--> 仓库内容中的QuickTag. 'ignore_sticky_posts' => false, //(boolean) - 忽略置顶文章 (可使用版本 3.1, 替换Caller_Get_Posts参数). 默认值为0 - 不要忽略粘贴文章.注意:忽略/排除文章返回的文章开始时包含的粘滞文章,但粘滞邮件仍将以返回的文章列表列表的自然顺序返回. //////排序参数 - 排序检索到的文章. 'order' => 'DESC', //(string) - 指定升序或下降顺序 'orderby' 参数. 默认: 'DESC'. //可能的值: //'ASC' - 从最低到最高值的升序顺序 (1, 2, 3; a, b, c). //'DESC' - 从最高到最低值的降序下降 (3, 2, 1; c, b, a). 'orderby' => 'date', //(string) - 按参数排序检索的文章.默认为"data".可以通过一个或多个选项. EX: 'orderby' => 'menu_order title' //可能的值: //'none' - 没有订单 (可使用版本 2.8). //'ID' - 按文章ID排序.注意大写. //'author' - 由作者排序. //'title' - 按标题排序. //'name' - 按文章名称(文章slug)排序. //'date' - 按修改日期排序. //'modified' - 排序最后修改日期. //'parent' - 按POST/PAGE父ID排序. //'rand' - 随机排序. //'comment_count' - 按评论数量排序 (可使用版本 2.9). //'menu_order' - 按页面顺序排序.最常用于页面(Edipage属性框中的订单字段)和附件(Insert/上传Medigallery对话框中的整数字段),但可以用于具有不同'menu_order'值的任何文章类型(THEALL默认为0) . //'meta_value' - 注意 'meta_key=keyname' 还必须存在于查询中.注意alsthat排序将是字母表的,这对于字符串(即单词)很好,但可以为数字绑定 (e.g. 1, 3, 34, 4, 56, 6, 等等, 而不是 1, 3, 4, 6, 34, 56 因为yomight自然期待). //'meta_value_num' - 按数字元值排序 (可使用版本 2.8). Also notthat a 'meta_key=keyname' 还必须存在于查询中.如上所述,该值允许NumericAsorting 'meta_value'. //'title menu_order' - 按menu_order..和title同时排序. //'post__in' - 保留文章ID排序 post__in array (可使用版本 3.5). //////日期参数 - 显示与某个时间和日期期间相关的文章. 'year' => 2014, //(int) - 年 (e.g. 2011). 'monthnum' => 4, //(int) - 月 (from 1 to 12). 'w' => 25, //(int) - 周 (from 0 to 53). 使用MySQL Week命令.该模式依赖于"Start_of_week"选项. 'day' => 17, //(int) - 天 (from 1 to 31). 'hour' => 13, //(int) - 时 (from 0 to 23). 'minute' => 19, //(int) - 分 (from 0 to 60). 'second' => 30, //(int) - 秒 (0 to 60). 'm' => 201404, //(int) - 年月 (例如: 201307). 'date_query' => array( //(array) - 日期参数 (可使用版本 3.7). //这些都是超级强大的.查看Codex以获取更多综合的代码示例 array( 'year' => 2014, //(int) - 年 (e.g. 2011). 'month' => 4, //(int) - 月 (from 1 to 12). 'week' => 31, //(int) - 周 (from 0 to 53). 'day' => 5, //(int) - 天 (from 1 to 31). 'hour' => 2, //(int) - 时 (from 0 to 23). 'minute' => 3, //(int) - 分 (from 0 to 59). 'second' => 36, //(int) - 秒 (0 to 59). 'after' => 'January 1st, 2013', //(string/array) - 检索文章的日期.接受strtotime() - 兼容字符串或数组 'year', 'month', 'day' 'before' => array( //(string/array) - 检索文章的日期.接受strtotime() - 兼容字符串或数组 'year', 'month', 'day' 'year' => 2013, //(string) 接受任何四位数年份.默认为空. 'month' => 2, //(string) 本年的月.接受数字 1-12. 默认: 12. 'day' => 28, //(string) 本月的日.接受数字 1-31. 默认: 最后一天. ), 'inclusive' => true, //(boolean) - 之后/之前,是否应匹配确切值'. 'compare' => '=', //(string) - Possible values are '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' (only in WP >= 3.5), and 'NOT EXISTS' (also only in WP >= 3.5). Default value is '=' 'column' => 'post_date', //(string) - 列查询.默认: 'post_date'. 'relation' => 'AND', //(string) - 或者,或者,如何比较子阵列.默认: AND. ), ), //////自定义字段参数 - 显示与某个自定义字段关联的文章. 'meta_key' => 'key', //(string) - 自定义字段键. 'meta_value' => 'value', //(string) - 自定义字段值. 'meta_value_num' => 10, //(number) - 自定义字段值. 'meta_compare' => '=', //(string) - 操作员测试 'meta_value'. 可能的值是 '!=', '>', '>=', '<', 或 ='. 默认值为 '='. 'meta_query' => array( //(array) - 自定义字段参数 (可使用版本 3.1). 'relation' => 'AND', //(string) - 可能的值是'AND','OR'.当有多个时,每个内部Meta_Query数组之间的逻辑关系.请勿与单个内部Meta_Query数组一起使用. array( 'key' => 'color', //(string) - 自定义字段键. 'value' => 'blue', //(string/array) - 自定义字段值(注意:阵列支持仅限于比较值 'IN', 'NOT IN', 'BETWEEN', 或 'NOT BETWEEN') 使用 WP < 3.9? 有关详细信息,请查看此页面 'type' => 'CHAR', //(string) - 自定义字段类型.可能的值是 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'. 默认值为 'CHAR'. 该 'type' 日期与之合作 'compare' 值 BETWEEN 只有当日期以格式存储 YYYYMMDD 并用这种格式测试.注意: 该 'type' 日期适用于 'compare' 值 BETWEEN 只有当日期以格式保存 YYYYMMDD 并用这种格式测试. 'compare' => '=' //(string) - 操作员进行测试.可能的值是'=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' (只有在WP. >= 3.5), 和 'NOT EXISTS' (也只有在 WP >= 3.5). 默认值为 '='. ), array( 'key' => 'price', 'value' => array(1, 200), 'compare' => 'NOT LIKE', ) ), //////权限参数 - 如果用户具有适当的能力,则显示已发布的文章以及私有文章: 'perm' => 'readable', //(string) 可能的值是 'readable', 'editable' //////缓存参数 //注意缓存是一件好事.通常不建议将这些设置为false. 'cache_results' => true, //(bool) 默认为真实 - 文章信息缓存. 'update_post_term_cache' => true, //(bool) 默认为真实 - 文章Meta信息缓存. 'update_post_meta_cache' => true, //(bool) 默认为TRUE - 文章条款信息缓存. 'no_found_rows' => false, //(bool) 默认为false. WordPress在大多数查询中使用SQL_CALC_FOUND_ROWS以实现分页.即使你根本不需要分页.通过将此参数设置为true,您将告诉WordPress不计算总行并减少DB上的负载.当此参数设置为true时,分页将无法正常工作. //////搜索参数 's' => $s, //(string) - 从搜索中沿查询字符串变量传递. 'exact' => true, //(bool) - flag 要使它只匹配整个标题/文章 - 默认值为false. 'sentence' => true, //(bool) - LOGO使其执行短语搜索 - 默认值为false. //////文章字段参数 'fields' => 'ids', //(string) - 哪个字段返回.默认情况下返回所有字段. //可能的值: //'ids' - 返回一系列文章ID. //'id=>parent' - 返回关联数组 [parent => ID, …]. //传递其他任何东西都将返回所有字段(默认值) - 文章对象数组. ); ?>