wordpress query_posts导致分类页无法分页的解决方法

一般提取分类目录下的文章,都会使用query_posts()函数,这就归功于query_posts()函数的强大,但成也萧何败也萧何,如果大家对query_posts()函数 不甚了解的话,就会造成另一个让人头痛的问题:因为使用query_posts()分页功能失效。

先看前面的代码:

<h1 class=”jiaodianbj”><?php echo single_cat_title( ”, false ) ?>&重症医学</h1>

<?php query_posts(array(‘category__and’=>array(get_cat_id(single_cat_title(”,false)),71)));?>

<?php while (have_posts()) : the_post(); ?>

<div class=”jdnews”>

<ul>

<li><span class=”grayz”>· </span><a href=”<?php the_permalink(); ?>” class=”black14″><?php echo cut_str($post->post_title,56); ?></a></li>

<li class=”jdnews_x”><a href=”<?php the_permalink(); ?>” class=”gray”><?php echo truncate_excerpt(70); ?></a></li>

</ul>

</div>

<?php endwhile;wp_reset_query(); ?>

<div class=”page_navi”>

<?php page_nav($query_string); ?>

</div>


如果我们使用了分页插件或自己编写的分页代码,上面的query_posts()函数写法将会导致首页分页功能失效,具体表现为不管大家点击哪一个分页,都只会显示第一页的内容,没有出现我们期待的页面跳转至目标页面的效果。

原因:query_posts()放在LOOP(循环)之前起到限定查询条件的作用,如果你向 query_posts()传递参数,那么wp_query会将你传递的参数生成一个sql查询语句,同时它会忽略来自url的参数,更不会以此为查询依 据了,这就造成了一个有趣的现象,但是每个分页内容都是一样的,这就佐证了wp_query生成的查询语句阻止了url参数查询,最终导致了首页分页功能失效。知道了原因,问题就容易解决了。

2个最简洁的解决方法:

1.直接将url的查询参数传入query_posts()函数里

这个查询参数是paged,代码实现如下:

“query_posts(“cat=-16,-41,-3&paged=$paged″); ”

或者

// 下面这一行代码是必须的,不然你的首页不能分页

$paged = (get_query_var(‘paged’)) ? get_query_var(‘paged’) : 1;

$args =array(

// 这里以下面的方式添加query_posts参数,具体参数可以参加官方文档

‘orderby’ => comment_count,

‘paged’ => $paged

);

query_posts($args);

2.向query_posts()函数传参时使用$query_string,继续接收来自url的参数。

代码实现如下:

“query_posts($query_string.”&cat=-3″);” #记住&符号千万不能省略

最后将以上代码作了如下修改:

<h1 class=”jiaodianbj”><?php echo single_cat_title( ”, false ) ?>&重症医学</h1>

<?php query_posts(array($query_string.’posts_per_page=-1′,’category__and’=>array(get_cat_id(single_cat_title(”,false)),71)));?>

<?php while (have_posts()) : the_post(); ?>

<div class=”jdnews”>

<ul>

<li><span class=”grayz”>· </span><a href=”<?php the_permalink(); ?>” class=”black14″><?php echo cut_str($post->post_title,56); ?></a></li>

<li class=”jdnews_x”><a href=”<?php the_permalink(); ?>” class=”gray”><?php echo truncate_excerpt(70); ?></a></li>

</ul>

</div>

<?php endwhile; wp_reset_query();?>

<div class=”page_navi”>

<?php page_nav($query_string); ?>

</div>

这样就解决了分页功能不起作用的问题了

注:风腾网 即采用的第一种方法,解决幻灯片置顶,主循环及首页分页相互冲突的问题。

知更鸟同样也给出过解决办法:现引用如下

query_posts()函数

将query_posts()放在LOOP之前限定你所需要的条件,wp_query会产生一个新的使用你的参数的SQL查询,而忽视通过URL接收到的其它的参数,如果想不忽略,可以在调用中使用$query_string。

query_posts($query_string . “&order=ASC”)

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

其他还有N多用途~~

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

<?php

if (is_home()) {

query_posts(“cat=-3″);

}

?>

获得特定的日志

<?php

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_posts()函数 | 知更鸟 

露兜博客也曾在文章中提到过分页问题,不仔细阅读可能会忽略,留下原文链接:WordPress函数query_posts用法汇总

以上内容即可成为 query_posts 的使用详解,留此贴备查。

feeling


将此文分享到:


转载请注明来自风腾网-wordpress企业主题,本文地址:http://fengten.com/130.html
除非注明,风腾网-wordpress企业主题文章均为原创,转载请注明出处和链接!
友荐云推荐

相关文章

10 条评论

  1. IPANT 发表:

    +-感觉你这个主题阅读感不好啊,很乱你的感觉,你的博客类型感觉用个简单的cms类型的主题也不错的啊

  2. 蓝。 发表:

    热情回访,很喜欢你的页面,果断加入我的友情链接,求贵站描述与说明,详见我站链接页面,如果有logo地址,也顺便告知一下,呵呵。

*

*

顶部 友荐云推荐