乌徒帮技术范儿WordPressWordPress内核 › query_posts()函数 (wordpress日志调用)

query_posts()函数 (wordpress日志调用)

分类:WordPress内核

我们在修改和自己创新wordpress模板的时候,经常会遇到while(has_post()):the_post()的循环,例如首页,我们几乎不能忘记这循环的重要意义,即这是出现文章及其各个属性的唯一充要条件。不过,我们使用这种文章的循环的时候,应该想到,主页里显示了最新文章,分类页显示了该分类的最新文章,内容页只显示该文章。那么我想在这些页面不按规则出牌,调用其他文章怎么办?query_post()帮我们完成这一想法。网上关于它的用法的文章有很多,但都只针对一方面,本文稍详细的讲解其用法。

query_post顾名思义即查询调用对应条件的文章,其参数即我们需要的条件,这些条件可以是分类、文章ID或title、排序方式等等。具体用法如下:

query_posts('showposts=5&caller_get_posts=1');
while (have_posts()) : the_post();
echo '<li style="width:220px;overflow:hidden;height:20px;margin:0px;padding:0;list-style-type:square;list-style-position:inside;"><a href="';the_permalink();echo '" title="';the_title();echo '" alt="';the_title();echo '">';the_title();echo '</a></li>';
endwhile;
wp_reset_query();

上面这段代码即为本站调用5篇最新文章的代码。第一行的意思是执行查询最新的五篇文章,并且不管置顶文章,只管按发表时间的新老输出。第二行开始是我们熟悉的文章的循环,和我们熟悉的输出没有任何区别,最后一行是重置上面的查询,主要为了防止在按随即调用输出时造成这段代码后面的文章输出,最好是每次都用上。


接下来详细讲一下query_post()的参数:

wp_query会忽视通过URL接收到的其它的参数,如果想不忽略,可以在调用中使用$query_string。

$query_string=$_GET['p'];//或你其他想要的形式,一般是分类或标签
query_posts($query_string . "&order=ASC")

设置文章显示的顺序,但是不干扰其余的查询字符串,参数前须有“&”符号

主页不显示某一分类下的日志

if (is_home()) {
query_posts("cat=-3");
}

获得特定的日志

query_posts('p=5');

获得特定的页面

<?php
query_posts('page_id=7');????? //只返回单独页面7
?>

<?php
query_posts('pagename=about'); //只返回《关于》网页
?>

<?php
query_posts('pagename=parent/child'); // 返回母网页的子网页
?>

创建所有文章列表,并且提供分页功能

<?php
query_posts($query_string.'posts_per_page=-1');
while(have_posts()) { the_post();
put your loop here ;
}
?>
类别参数

显示属于某个类别的文章

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的所有文章。如果一个类别也同时属于其它的类别,这个类别仍然不会被删除。

标签参数

显示与某个标签相关的文章

tag

为某个标签提取文章

query_posts('tag=cooking');

获得拥有任何这样的标签的文章

query_posts('tag=bread,baking');

获取拥有这三个标签的文章

query_posts('tag=bread+baking+recipe');

作者参数

你也可以根据作者限制文章数目

author_name=Harriet
author=3

author_name在 user_nicename区操作, 同时作者 在作者id上操作。

文章 &独立页面参数

返回一篇单独的文章或者一个单独的网页

p=1 – 使用文章 ID来显示第一篇文章
name=first-post – 使用 post Slug 显示第一篇文章
page_id=7
pagename=about
showposts=1 (你可以使用 showposts=3,或者其它的任何数字显示一定数目的文章)

由于 模板层级方面的原因, home.php先执行了。这意味这你可以编写一个home.php,home.phh调用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’能够产生期待的结果。


通过上面的学习,我们就可以用query_post()来实现很多调用了,只需要用文章最开头给出的那段代码和后面的参数,你可以完美的调用自己想要的文章列表,例如属于某几个分类的含有某标签的最新5篇文章并按发表时间降序排列、随机调用10篇文章(如本站每篇文章都有随机推荐文章)等等文章调用。当然你还可以发挥自己的想象,充分利用php的结构化程序特点,在不同的页面调用不同的文章,如用is_paged()判断是否为分页面,然后如果分页的话调用几篇同类目下的文章等等。

好了,关于query_post()的介绍就到这里,希望对你有用。<完>

已有5条评论 快速评论
  1. 否子戈 #2450楼 回复给@2448楼 2012/11/21 20:29:51 回复

    这个我也很难分辨清楚 分页建议使用 paginate_links 函数,将它放在LOOP循环中,wp_reset_query()之前,使用global $wp_query;$wp_query->max_num_pages获取总的页数,$wp_query->query_vars[‘paged’]获取当前页。区域性的代码有的时候确实不好处理,你可以删除一些不必要的代码,一点一点的测试

  2. 子非我 #2449楼 回复给@2407楼 2012/11/21 20:05:52 回复

    悲剧的是貌似找到这段代码的原文了,问之未果……

  3. 子非我 #2448楼 回复给@2407楼 2012/11/21 20:04:29 回复

    不知道丫,这个就是完整的功能代码了

  4. 否子戈 #2407楼 回复给@2405楼 2012/11/16 23:55:26 回复

    $my_query = new WP_Query($query_string .”&posts_per_page=-1″);
    $total_posts = $my_query->post_count;

    这两句你是怎么处理的,$query_string传递过来的值是什么?

  5. 子非我 #2405楼 2012/11/16 21:27:06 回复

    用query_posts(‘cat=-ID’);屏蔽一些分类的文章后,下面这个分页页码的功能代码,在统计文章页数的时候会按照所有文章来统计,若有空的话帮我看看,谢了

    <?php
    function pagination($query_string){
    global $posts_per_page, $paged;
    $my_query = new WP_Query($query_string .”&posts_per_page=-1″);
    $total_posts = $my_query->post_count;
    if(empty($paged))$paged = 1;
    $prev = $paged – 1;
    $next = $paged + 1;
    $range = 4; // 修改数字,可以显示更多的分页链接
    $showitems = ($range * 2)+1;
    $pages = ceil($total_posts/$posts_per_page);
    if(1 != $pages){
    echo “<div class=’pagenav’>”;
    echo ($paged > 2 && $paged+$range+1 > $pages && $showitems < $pages)? “<a href='”.get_pagenum_link(1).”‘>第一页</a>”:””;
    echo ($paged > 1 && $showitems < $pages)? “<a href='”.get_pagenum_link($prev).”‘>上一页</a>”:””;
    for ($i=1; $i <= $pages; $i++){
    if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems )){
    echo ($paged == $i)? “<span class=’current’>”.$i.”</span>”:”<a href='”.get_pagenum_link($i).”‘ class=’inactive’ >”.$i.”</a>”;
    }
    }
    echo ($paged < $pages && $showitems < $pages) ? “<a id=’next’ href='”.get_pagenum_link($next).”‘>下一页</a>” :””;
    echo ($paged < $pages-1 && $paged+$range-1 < $pages && $showitems < $pages) ? “<a href='”.get_pagenum_link($pages).”‘>最后一页</a>”:””;
    echo “</div>\n”;
    }
    }

填写个人信息,赶快回复吧!