WordPress:Template Tags/query posts
描述[ ]
Query_posts可以用来控制在The Loop上显示哪篇文章,接受你的URL上使用的同样格式的不同的参数。(例如p=4值显示ID为4的文章)
为什么要经过这麽多的麻烦,更改为给定的URL而创建的查询?你可以自定义博客文章的外观,将文章与网页logic联合起来(像条件式标签—没有更改任何的URLs。
一般的使用情况可能是:
- 只显示一篇文章或者你的主页网页。
- 显示一个特殊时间段的所有文章。
- 在首页上(只)显示最近的文章。
- 更改文章的排列次序。
- 只显示来自一个类别中的文章。
用法[ ]
在The Loop开始之前,在你的一个模板文件上的query_posts()上放置一个call。wp_query object会产生一个新的使用你的参数的SQL查询。当你执行这一步的时候,WordPress忽视了通过URL接收到的其它的参数(例如网页号或者类别)。如果你想保存这些参数,你可以在访问query_posts()时,使用变数$query_string。
例如,设置文章显示的顺序,但是不干扰其余的查询字符串,你可以将下面的内容放在The Loop之前:
query_posts($query_string . "&order=ASC")
以这种方式使用query_posts的时候,参数的引用部分必须以一个&号开始。
例子[ ]
从你的主页上删除类别[ ]
将这个代码放到你的index.php文件上会导致你的主页显示所有类别的文章但是类别ID3的文章除外。
<?php if (is_home()) { query_posts("cat=-3"); } ?>
你可以在已经删除的类别的列表上再添加几个类别(在WP2.1.2上测试了):
<?php if (is_home()) { query_posts("cat=-1,-2,-3"); } ?>
重新得到一篇特别的文章[ ]
想要重新得到一篇特别的文章,你可以使用以下:
<?php // 重新得到ID为5的文章 query_posts('p=5'); ?>
如果你想对这个查询使用阅读更多的功能,你需要将全局$更多的变量设置为0。
<?php // retrieve one post with an ID of 5 query_posts('p=5'); global $more; // set $more to 0 in order to only get the first part of the post $more = 0; // the Loop while (have_posts()) : the_post(); // the content of the post the_content('Read the full post »'); endwhile; ?>
返回一个特别的网页[ ]
你可以使用以下的内容,返回一个特别的网页:
<?php query_posts('page_id=7'); //只返回网页7 ?>
or
<?php query_posts('pagename=about'); //只返回关于网页 ?>
对于子网页,需要母网页和子网页的slug,用一个斜线分开。例如:
<?php query_posts('pagename=parent/child'); // 返回母网页的子网页 ?>
将变数传给query_posts[ ]
根据你的需要,你可以使用两种方法将一个变数传给查询。如其它的例子那样,将这些放置到你的Loop的上面:
例 1[ ]
在这个例子中,我们连接查询之后,再运行查询。首先分配了变量,然后再连接,然后再运行。在这个例子中,我们从其它地方进入了一个类别变量。
<?php $categoryvariable=$cat; // 指派变数作为当前的类别 $query= 'cat=' . $categoryvariable. '&orderby=date&order=ASC'; // concatenate the query query_posts($query); // 运行查询 ?>
例 2[ ]
在下面的这个例子中,双" 引号 "指示PHP将enclosed看做一个表述。在这个例子中,我们得到当前的年份和月份,而且通知query文章给我们提供当前年/月的文章,而且在这种情况下,将这些文章按升序排列,这样我们可以在网页的顶上方,得到最早所写的文章。
<?php $current_month = date('m'); ?> <?php $current_year = date('Y'); ?> <?php query_posts("cat=22&year=$current_year&monthnum=$current_month&order=ASC"); ?> <!-- put your loop here -->
例 3[ ]
这个例子演示了怎样创建所有的文章的列表,并且标记页数。我们可以使用默认的$query_string,这个字符串通知查询文章给我们提供全部文章的列表。我们也可以将posts_per_page查询参数从-1改为我们希望在每个网页上显示的文章的数目;在最后一种情况中,你可能想要使用posts_nav_link()导航到创建的归档中。
.
<?php query_posts($query_string.'posts_per_page=-1'); while(have_posts()) { the_post(); <!-- put your loop here --> } ?>
参数[ ]
这还不是一个详尽的列表,意思是设置你自己的queries,可以显示一些更常见的内容。
类别 参数[ ]
显示属于某个类别的文章。
- cat
- category_name
根据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');
删除属于类别3的所有文章。有一个限制性条款:会删除只属于类别3的所有文章。如果一个类别也同时属于其它的类别,这个类别仍然不会被删除。
标签参数[ ]
显示与某个标签相关的文章。
- 标签
为某个标签提取文章 query_posts('标签=cooking');
提取拥有任何这样的标签的文章
query_posts('tag=bread,baking');
提取拥有这三个标签的文章:
query_posts('tag=bread+baking+recipe');
也看看Ryan's discussion of Tag intersections and unions
作者参数[ ]
你也可以根据作者限制文章数目。
- author_name=Harriet
- author=3
author_name operates on the user_nicename field, whilst author operates on the author id.
文章 & 网页参数[ ]
返回一篇单独的文章或者一个单独的网页。
- p=1 - 使用文章 ID来显示第一篇文章
- name=first-post - 使用 文章 Slug 显示第一篇文章
- page_id=7
- pagename=about
- showposts=1 (你可以使用 显示文章=3,或者其它的任何数字显示一定数目的文章
由于 模板层级方面的原因, home.php先执行了。这意味这你可以编写一个home.php,home.php调用query_posts()重新得到一个特别的网页并且将那个网页设置为你的首页。没有任何插件或者hacks,你需要运行一个机制,并且显示和维护一个非博客的首页。
更有用的方法,可能是利用WP的网页功能并且为你的首页使用这个功能。你可以将"关于网页"设置为entry point或者设置为站点的末页。你可能执行一些更动态的步骤,设置一个自定义网页,显示最近的评论,文章,类别,存档。请看看下面的例子。
时间参数[ ]
得到某个特别的时间段内发表的文章。
- hour=
- minute=
- second=
- day= - 一个月中的每一天; 显示,例如,十五号发表的所有文章。
- monthnum=
- year=
网页参数[ ]
- paged=2 -显示使用"以前发表的文章"链接时,通常在网页2上显示的文章。
- posts_per_page=10 - 每个网页显示的文章数目;-1这个值,会显示所有的文章。
- order=ASC - 按时间顺序显示文章,以相反的顺序显示DESC(默认)
Offset 参数[ ]
你不能转移或者忽视一个或者更多的原始文章,这些文章一般是你的query同时使用offset参数收集到的。
下面的函数会显示(1)最近的5篇文章:
query_posts('showposts=5&offset=1');
根据参数排序[ ]
根据这个区给得到的文章排序。
- orderby=author
- orderby=date
- orderby=category
- orderby=title
- orderby=modified
- orderby=modified
- orderby=menu_order
- orderby=parent
- orderby=ID
- orderby=rand
同时考虑"ASC"或者的"DESC"的排序参数
联合参数[ ]
你可能从上面的例子中注意到,你使用一个&(&符号)将参数组合在一起,像:
query_posts('cat=3&year=2004');
类别13,关于当前月份显示在主页上的文章:
if (is_home()) { query_posts($query_string . '&cat=13&monthnum=' . date('n',current_time('timestamp'))); }
在2.3版本中,这个参数组合会返回属于类别1同时属于类别3的文章,只显示两篇(2)文章,根据标题,按降序排列:
query_posts(array('category__and'=>array(1,3),'showposts'=>2,'orderby'=>title,'order'=>DESC));
在2.3和2.5版本中,你可能期待下面的内容,返回属于类别1并且标签为"苹果"的所有文章
query_posts('cat=1&tag=apples');
一个bug阻止这个运行。请看看Ticket #5433,一个工作区要搜索几个使用+的标签
query_posts('cat=1&tag=apples+apples');
对于先前的查询,这个会产生期待的结果。注意使用'cat=1&tag=apples+oranges'能够产生期待的结果。
资源[ ]
- If..Else - Query Post Redux
- If..Else –使得 WordPress 在首页上只显示一篇文章
- If..Else - Query 文章
- Query posts article by Marlon Leite at Gepsojur
- nietoperzka的主页上文章的自定义顺序
<!—我们需要关于这篇文章的其它资源-->
相关的[ ]
This page is [[WordPress::Category:Stubs|marked]] as incomplete. You can help Codex by expanding it.