Query_posts语句是wordpress最实用的语句之一。 正是在query_posts的作用下,wordpress的Loop循环才能够调用并显示所有文章内容。 Query_posts的魅力在于,它可以根据你的要求,通过各种各样的方式灵活地检索并过滤日志或页面。
你可以用query_posts进行简单的文章抓取,可以只抓取一篇,也可以抓取上百篇。 而说到复杂点的用法,你甚至可以利用query_posts来查询某一分类目录下某个作者发表的、带有某个标签的特定数量文章….
wordpress中文手册上有对query_posts函数的介绍,不过下面要介绍的是一些更详细更有趣的用法。
1.注意事项
首先要注意的是,使用query_posts的最好方法….就是不要用它。 Query_posts中说到: query_posts函数仅用于修改主页循环(Loop),而不是一种在页面上生成次级循环的手段。如果你希望在主循环外另外生成循环,应该新建独立的WP_Query对象,用这些对象生成循环。在主循环外的循环上使用query_posts会导致主循环运行偏差,并可能在页面上显示出你不希望看到的内容。
<?PHP
$query = 'posts_per_page=10';
$queryObject = new WP_Query($query);
// The Loop...
if ($queryObject->have_posts())
{ while ($queryObject->have_posts())
{ $queryObject->the_post(); the_title(); the_content();
} } ?>
2. 不同调用方法
传统的文章调用方法是以查询字符串形式传递query_posts参数(如variable1=value1&variable2=value2&...),不过后来有了新方法——用数组来设置查询参数。
<?PHP
// GOOD
// select 10 posts from category 1
$query = 'posts_per_page=10&cat=1';
$queryObject = new WP_Query($query);
// The Loop...
// BETTER
$query = array ( 'posts_per_page' => 10,'cat' => 1 );
$queryObject = new WP_Query($query);
// The Loop...
?>当然,使用哪种方法完全由个人习惯决定,不过我认为用数组更为方便,原因如下:
便于阅读
可以利用if语句更轻松地给数组添加条件,以动态生成查询
一些查询参数(某些使用频率较低的参数,如分类参数和标签参数)需要被传递数组
你可以将函数调用以参数的形式传递
3. 关于日志顺序
默认情况下wordpress日志是按日期顺序排列的,这也是大多数人的需求,不过如果能更改默认的排列顺序那就更好了。 例如你可以随意调用几篇日志,让它们显示在侧边栏。 wordpress 2.9引入了以评论的数量多寡给文章排序的功能,这样就可以更方便地向访客显示最受欢迎的文章….不过这里为了使用query_posts,我们假设一下不使用wordpress的这个功能。
<?PHP
// select posts ordered by comment_count
$query = 'orderby=comment_count';
$queryObject = new WP_Query($query);
// The Loop...
?>
4. Meta值
Post Meta函数的实用性也很强, 我们可以利用下面的代码来显示最受欢迎的文章:
<?PHP
// grab posts by post count ordered in descending order
(most votes first)
$query = 'Meta_key=vote_count&orderby=Meta_value&order=DESC';
$queryObject = new WP_Query($query);
// The Loop...
?>
5. 日志? 页面? 附件?
你可以按文章类型调用自己想要的日志、页面或附件。 对附件的调用可能是最有趣但同时被使用频率也是最低的一个。 利用下面的代码(与上文中提到的顺序参数),你就可以根据自己的喜好在网站上显示各种媒体文件了:
<?PHP
// grab 1 random attachment
$query = 'post_type=attachment&orderby=rand&posts_per_page=1';
$queryObject = new WP_Query($query);
// The Loop...
?>