• 技术文章 >php教程 >php手册

    wordpress 中强大的 query_posts()函数

    2016-06-13 09:43:08原创322
    今天说说WordPress 的主查询函数 -query_posts(),因为我正在制作的主题里面多次用到了这个函数 。

    query_posts()查询函数决定了哪些文章出现在WordPress 主 循环(loop)中,正因为如此,query_posts函数仅用于修改主页循环(Loop),而不是在页面上生成次级循环。如果你希望在主循环外另外生 成循环,应该新建独立的WP_Query对象,用这些对象生成循环。在主循环外的循环上使用query_posts会导致主循环运行偏差,并可能在页面上 显示出你不希望看到的内容。

    query_posts()查询函数函数接收大量参数,格式与URL中的参数格式相同(如p=4表示ID为4的文章)。下面就举例说说query_posts函数的一些常用的语法格式。

    1.从博客主页上排除某些分类目录

    将以下代码添加到index.php文件中,使主页显示的文章可以来自除分类3以外的任何分类。

    Php代码
    1. if (is_home()) {
    2. query_posts("cat=-3");
    3. }
    4. ?>

    你也可以多排除几个分类。

    Php代码
    1. if (is_home()) {
    2. query_posts("cat=-1,-2,-3");
    3. }
    4. ?>
    2.查询指定文章

    用以下语句检索某篇指定文章:

    Php代码
    1. //获取ID值为5的文章
    2. query_posts('p=5');
    3. ?>

    如果你希望在查询语句中使用Read More功能,请将全局变量$more设为0。

    Php代码
    1. //获取ID值为5的页面
    2. query_posts('p=5');
    3. global $more;
    4. //初始化$more
    5. $more = 0;
    6. //循环查询到的结果
    7. while (have_posts()) : the_post();
    8. the_content('Read the full post ?');
    9. endwhile;
    10. ?>
    3.检索指定页面

    用以下语句检索某篇指定页面:

    Php代码
    1. query_posts('page_id=7'); //获取页面ID为7的页面
    2. ?>

    或者

    Php代码
    1. query_posts('pagename=about');
    2. ?>

    检索子页面时,需要提供子页面及其父页面的别名,用斜线隔开两者。例如:

    Php代码
    1. query_posts('pagename=parent/child');
    2. ?>

    上面都是采取 query_posts($query_string) 的形式来调用该函数,下面介绍另一种方法,用数组传递参数变量。

    Php代码
    1. query_posts(array(
    2. 'cat' => 22,
    3. 'year' => $current_year,
    4. 'monthnum' => $current_month,
    5. 'order' => 'ASC',
    6. ));

    相比字符串方式,数组形式更加形象直观,不容易出错。

    下面整理一些经常要用到的参数,有些是我用过的,有些则没有,算作归纳吧。

    分类参数

    只显示特定分类下的文章。

    根据ID显示单个分类

    只显示来自某一个分类目录ID(以及该分类目录下的子分类目录)的文章:

    Php代码
    1. query_posts('cat=4');

    根据分类名称显示单个分类

    只显示来自某一个分类名称下的文章:

    Php代码
    1. query_posts('category_name=Staff Home');

    根据ID显示多个分类

    显示来自若干指定分类目录ID下的文章:

    Php代码
    1. query_posts('cat=2,6,17,38');

    排除某一分类中的文章

    显示除某一分类文章外的所有文章,被排除的分类ID以减号(’-')作为前缀。

    Php代码
    1. query_posts('cat=-3');

    以上代码删除ID为3的分类中的文章。

    处理多个分类

    显示隶属于多个分类的文章。下面的代码可展示同时属于分类2和分类6的文章:

    Php代码
    1. query_posts(array('category__and' => array(2,6)));

    如果希望显示分类2或分类6中的文章,可以使用上面介绍的cat,也可以使用category_in函数 (注意这里不会显示分类下子分类中的文章) :

    Php代码
    1. query_posts(array('category__in' => array(2,6)));

    可以用下面这种方式排除多个分类中的文章:

    Php代码
    1. query_posts(array('category__not_in' => array(2,6)));

    标签参数

    显示特定标签下的文章。

    获取某一标签中的文章

    Php代码
    1. query_posts('tag=cooking');

    获取若干标签中任一标签中的文章

    Php代码
    1. query_posts('tag=bread+baking+recipe');

    多个标签

    显示同时属于ID为37和47的标签下的文章:

    Php代码
    1. query_posts(array('tag__and' => array(37,47));

    若要显示ID为为37或47的标签下的文章,可以使用tag参数,也可以用tag_in:

    Php代码
    1. query_posts(array('tag__in' => array(37,47));

    显示的文章既不属于标签37,也不属于标签47:

    Php代码
    1. query_posts(array('tag__not_in' => array(37,47));

    tag_slug_in与tag_slug_and工作方式几乎一致,不同之处在于相匹配的别名不同。

    作者参数

    你也可以根据作者来选择文章。

    注意:author_name运行在user_nicename字段上,同时author运行在author id字段上。

    显示ID为1的作者所发表的所有页面,以标题顺序排列页面,页面列表上方无置顶文章:

    Php代码
    1. query_posts('caller_get_posts=1&author=1&post_type=page&post_status=publish&orderby=title&order=ASC');

    文章&页面参数

    检索单篇文章或页面。

    置顶文章参数

    置顶文章功能引入于WordPress 2.7。在查询中,被设为“置顶”的文章会显示在其它文章之前,除非该文章已经被caller_get_posts=1 参数排除。

    返回第一篇置顶文章

    Php代码
    1. $sticky=get_option('sticky_posts') ;
    2. query_posts('p=' . $sticky[0]);

    Php代码
    1. $args = array(
    2. 'posts_per_page' => 1,
    3. 'post__in' => get_option('sticky_posts'),
    4. 'caller_get_posts' => 1
    5. );
    6. query_posts($args);

    注意:第二种方法只能返回最新发表的置顶文章;若当前无置顶文章,返回最新发表文章。

    返回第一篇置顶文章;若无,则不返回任何内容

    Php代码
    1. $sticky = get_option('sticky_posts');
    2. $args = array(
    3. 'posts_per_page' => 1,
    4. 'post__in' => $sticky,
    5. 'caller_get_posts' => 1
    6. );
    7. query_posts($args);
    8. if($sticky[0]) {
    9. // insert here your stuff...
    10. }

    从查询中排除所有置顶文章

    Php代码
    1. query_posts(array("post__not_in" =>get_option("sticky_posts")));

    返回某一分类下所有文章,但不在文章列表上方显示置顶文章。所有设为“置顶”的文章以正常顺序(如日期顺序)显示

    Php代码
    1. query_posts('caller_get_posts=1&posts_per_page=3&cat=6');

    返回某一分类下所有文章,完全不显示置顶文章,保留分页

    Php代码
    1. $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    2. $sticky=get_option('sticky_posts');
    3. $args=array(
    4. 'cat'=>3,
    5. 'caller_get_posts'=>1,
    6. 'post__not_in' => $sticky,
    7. 'paged'=>$paged,
    8. );
    9. query_posts($args);
    10. ?>

    时间参数

    检索特定时间段内发表的文章。

    返回最近发表的文章

    Php代码
    1. $today = getdate();
    2. query_posts('year=' .$today["year"] .'&monthnum=' .$today["mon"] .'&day=' .$today["mday"] );

    返回12月20日发表的文章

    Php代码
    1. query_posts(monthnum=12&day=20' );

    返回2009年3月1日到3月15日之间发表的文章

    Php代码
    1. //based on Austin Matzko's code from wp-hackers email list
    2. function filter_where($where = '') {
    3. //posts for March 1 to March 15, 2009
    4. $where .= " AND post_date >= '2009-03-01' AND post_date < '2009-03-16'";
    5. return $where;
    6. }
    7. add_filter('posts_where', 'filter_where');
    8. query_posts($query_string);
    9. ?>

    返回最近30天内发表的文章

    Php代码
    1. //based on Austin Matzko's code from wp-hackers email list
    2. function filter_where($where = '') {
    3. //posts in the last 30 days
    4. $where .= " AND post_date > '" . date('Y-m-d', strtotime('-30 days')) . "'";
    5. return $where;
    6. }
    7. add_filter('posts_where', 'filter_where');
    8. query_posts($query_string);
    9. ?>

    返回过去30天到过去60天内发表的文章

    Php代码
    1. //based on Austin Matzko's code from wp-hackers email list
    2. function filter_where($where = '') {
    3. //posts 30 to 60 days old
    4. $where .= " AND post_date >= '" . date('Y-m-d', strtotime('-60 days')) . "'" . " AND post_date <= '" . date('Y-m-d', strtotime('-30 days')) . "'";
    5. return $where;
    6. }
    7. add_filter('posts_where', 'filter_where');
    8. query_posts($query_string);
    9. ?>

    分页参数

    offset(偏移)参数

    通过offset参数,你可以移除或忽略正常情况下被查询集中的一篇或多篇初始文章。

    以下显示最近一篇文章之后的5篇文章:

    Php代码
    1. query_posts('posts_per_page=5&offset=1');

    排序参数

    顺序参数

    决定以升序或降序排列排序参数

    自定义字段参数

    根据自定义关键字或值检索文章(或页面)。

    返回关键字为 ‘color’ 且值为’blue’的文章:

    Php代码
    1. query_posts('meta_key=color&metavalue=blue');

    返回自定义字段关键字为’color’的文章,无论自定义字段值为何:

    Php代码
    1. query_posts('meta_key=color');

    返回自定义字段值为’color’的文章,无论关键字为何:

    Php代码
    1. query_posts('metavalue=color');

    返回自定义字段值为’green’的页面,无论自定义字段关键字为何:

    Php代码
    1. query_posts('post_type=page&metavalue=green');

    返回自定义关键字为’color’、自定义字段值不为’blue’的文章和页面:

    Php代码
    1. query_posts('post_type=any&meta_key=color&meta_compare=!=&metavalue=blue');

    返回自定义字段关键字为’miles’、自定义字段值小于等于22的文章。注意,字段值99会被看做大于字段值100,因为数据是以字符串形式而不是数字形式存储的。

    query_posts('meta_key=miles&meta_compare=<=&metavalue=22');

    联合参数

    你可能已经从上面有些例子中看出来了,可以用&符号连接不同参数,如:

    Php代码
    1. uery_posts('cat=3&year=2004');

    显示主页上、当前月份发表的、隶属于分类13下的文章:

    Php代码
    1. if (is_home()) {
    2. query_posts($query_string . '&cat=13&monthnum=' . date('n',current_time('timestamp')));
    3. }

    在WP 2.3中,以下参数联合会返回同时属于分类1和分类3的两篇文章,以文章标题降序排列:

    Php代码
    1. query_posts(array('category__and'=>array(1,3),'posts_per_page'=>2,'orderby'=>title,'order'=>DESC));

    在WP 2.3和WP 2.5中,以下参数联合本应返回属于分类1且带有“apples”标签的文章:

    Php代码
    1. query_posts('cat=1&tag=apples');

    但由于一个bug,代码没能显示出正常结果。有一个解决办法:利用+号查找多个标签:

    Php代码
    1. query_posts('cat=1&tag=apples+apples');

    这就显示出我们希望显示的结果了。

    使用技巧

    设置>阅读中的“博客页面最多显示”参数会影响你的查询结果,要覆盖设置>阅读中的设置,需要在标签中添加’posts_per_page’ 参数。例如:

    Php代码
    1. query_posts('category_name=The Category Name&posts_per_page=-1'); //returns ALL from the category

    注意:query_posts函数会改写并取代页面的主查询。为谨慎起见,请不要将query_posts用作其它用途。

    来源: http://www.zuluo.net/2012/2012-01/wordpress-query_posts.html

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:PHPGrid 1.4.8 发布 PHP的CRUD框架 下一篇:Phing 2.5 发布,PHP 项目构建工具
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• Sajax融合服务器端的PHP和JS• 究竟是什么令微软为Windows改进PHP• php安全之狗尾续貂• 简化的实现方法(限制为同一会话页面)• yii2分页的使用及其扩展
    1/1

    PHP中文网