今天说说WordPress的主查询函数-query_posts(),因为我正在制作的主题里面多次用到了这个函数。如:优搜网
query_posts()查询函数决定了哪些文章出现在WordPress主循环(loop)中,正因为如此,query_posts函数仅用于修改主页循环(Loop),而不是在页面上生成次级循环。如果你希望在主循环外另外生成循环,应该新建独立的WP_Query对象,用这些对象生成循环。在主循环外的循环上使用query_posts会导致主循环运行偏差,并可能在页面上显示出你不希望看到的内容。
query_posts()查询函数函数接收大量参数,格式与URL中的参数格式相同(如p=4表示ID为4的文章)。下面就举例说说query_posts函数的一些常用的语法格式。
将以下代码添加到index.php文件中,使主页显示的文章可以来自除分类3以外的任何分类。
用以下语句检索某篇指定文章:
用以下语句检索某篇指定页面:
query_posts(array(
'cat' => 22,
'year' => $current_year,
'monthnum' => $current_month,
'order' => 'ASC',
));
相比字符串方式,数组形式更加形象直观,不容易出错。
下面整理一些经常要用到的参数,有些是我用过的,有些则没有,算作归纳吧。
只显示特定分类下的文章。
根据ID显示单个分类
只显示来自某一个分类目录ID(以及该分类目录下的子分类目录)的文章:
query_posts('cat=4');
根据分类名称显示单个分类
只显示来自某一个分类名称下的文章:
query_posts('category_name=Staff Home');
根据ID显示多个分类
显示来自若干指定分类目录ID下的文章:
query_posts('cat=2,6,17,38');
排除某一分类中的文章
显示除某一分类文章外的所有文章,被排除的分类ID以减号(’-')作为前缀。
query_posts('cat=-3');
以上代码删除ID为3的分类中的文章。
处理多个分类
显示隶属于多个分类的文章。下面的代码可展示同时属于分类2和分类6的文章:
query_posts(array('category__and' => array(2,6)));
query_posts(array('category__in' => array(2,6)));
query_posts(array('category__not_in' => array(2,6)));
显示特定标签下的文章。
获取某一标签中的文章
query_posts('tag=cooking');
query_posts('tag=bread+baking+recipe');
多个标签
显示同时属于ID为37和47的标签下的文章:
query_posts(array('tag__and' => array(37,47));
query_posts(array('tag__in' => array(37,47));
query_posts(array('tag__not_in' => array(37,47));
tag_slug_in与tag_slug_and工作方式几乎一致,不同之处在于相匹配的别名不同。
你也可以根据作者来选择文章。
注意:author_name运行在user_nicename字段上,同时author运行在author id字段上。
显示ID为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参数排除。
返回第一篇置顶文章
$sticky=get_option('sticky_posts') ;
query_posts('p=' . $sticky[0]);
$args = array(
'posts_per_page' => 1,
'post__in' => get_option('sticky_posts'),
'caller_get_posts' => 1
);
query_posts($args);
注意:第二种方法只能返回最新发表的置顶文章;若当前无置顶文章,返回最新发表文章。
返回第一篇置顶文章;若无,则不返回任何内容
$sticky = get_option('sticky_posts');
$args = array(
'posts_per_page' => 1,
'post__in' => $sticky,
'caller_get_posts' => 1
);
query_posts($args);
if($sticky[0]) {
// insert here your stuff...
}
query_posts(array("post__not_in" =>get_option("sticky_posts")));
query_posts('caller_get_posts=1&posts_per_page=3&cat=6');
3,
'caller_get_posts'=>1,
'post__not_in' => $sticky,
'paged'=>$paged,
);
query_posts($args);
?>
检索特定时间段内发表的文章。
返回最近发表的文章
$today = getdate();
query_posts('year=' .$today["year"] .'&monthnum=' .$today["mon"] .'&day=' .$today["mday"] );
query_posts(monthnum=12&day=20' );
= '2009-03-01' AND post_date < '2009-03-16'";
return $where;
}
add_filter('posts_where', 'filter_where');
query_posts($query_string);
?>
'" . date('Y-m-d', strtotime('-30 days')) . "'";
return $where;
}
add_filter('posts_where', 'filter_where');
query_posts($query_string);
?>
= '" . date('Y-m-d', strtotime('-60 days')) . "'" . " AND post_date <= '" . date('Y-m-d', strtotime('-30 days')) . "'";
return $where;
}
add_filter('posts_where', 'filter_where');
query_posts($query_string);
?>
通过offset参数,你可以移除或忽略正常情况下被查询集中的一篇或多篇初始文章。
以下显示最近一篇文章之后的5篇文章:
query_posts('posts_per_page=5&offset=1');
决定以升序或降序排列排序参数
根据自定义关键字或值检索文章(或页面)。
返回关键字为 ‘color’ 且值为’blue’的文章:
query_posts('meta_key=color&metavalue=blue');
query_posts('meta_key=color');
query_posts('metavalue=color');
query_posts('post_type=page&metavalue=green');
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');
你可能已经从上面有些例子中看出来了,可以用&符号连接不同参数,如:
uery_posts('cat=3&year=2004');
if (is_home()) {
query_posts($query_string . '&cat=13&monthnum=' . date('n',current_time('timestamp')));
}
query_posts(array('category__and'=>array(1,3),'posts_per_page'=>2,'orderby'=>title,'order'=>DESC));
query_posts('cat=1&tag=apples');
query_posts('cat=1&tag=apples+apples');
这就显示出我们希望显示的结果了。
设置>阅读中的“博客页面最多显示”参数会影响你的查询结果,要覆盖设置>阅读中的设置,需要在标签中添加’posts_per_page’ 参数。例如:
query_posts('category_name=The Category Name&posts_per_page=-1'); //returns ALL from the category