罗孚传说

RoverTang.com

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

最近接到一个需求:首页显示文章内容,分类目录页要求以列表形式显示文章标题。这个需求实际上很简单,只需要将分类目录模板文件archive.php中的the_content()或者the_excerpt()部分去掉就可以显示文章标题列表了。但这个需求的BT之处在于:首页日志只显示一篇,即后台的文章数量设置也就是1了,但分类目录也的标题列表总不能是1吧,于是乎,这就变得复杂了。变成了:首页的日志数量为1,但分类目录页列表的日志数量不为1,为10或者20这样的数字。这样看起来是比较协调的。

于是准备找插件,但搜索了一通基本上没有可用的插件,于是乎决定自己改模板代码,只需要将首页的日志数量或文章列表页的日志数量设置为自己想要的数字,和后台的文章数配合起来就可以实现这个功能。搜索了一通以后,发现:使用query_posts()函数可以改变$posts中的数量。挺兴奋的,原则上只需要在query_posts()函数中指定showposts的数量就可以了,比如query_posts("showposts=3"),将这个代码加在have_posts()的前面就可以实现指定文章数量功能。

不过,这个时候衍生的问题发生了:WP-pagenavi插件无法获得正确的分页结果,常常被告知400错误,没有找到文件。可以肯定:query_posts函数和WP-pagenavi插件产生冲突了。如何解决?我想仍然从文章目录列表开始,指定了showposts,我再指定一下cat是否可以?或者像网上说的那样,确定好当前的page?$paged = (get_query_var('page')) ? get_query_var('page') : 1;

以上测试后均失败。很是火大,于是乎,再次求救Google,不过国内几乎无人遇到此问题,没有办法只好用英文搜索,结果发现有个老外解决了这个问题。具体的function code如下:

function curPageURL() {
$pageURL = 'http';
//check what if its secure or not
if ($_SERVER["HTTPS"] == "on") {
$pageURL .= "s";
}
//add the protocol
$pageURL .= "://";
//check what port we are on
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
//cut off everything on the URL except the last 3 characters
$urlEnd = substr($pageURL, -3);
//strip off the two forward shashes
$page = str_replace("/", "", $urlEnd);
//return just the number
return $page;

但似乎这个code也并不万能,在分类目录下分页依然有问题。似乎有点绝望了。好吧,我换一个思路吧:原来是去修改分类目录模板,以获得正确数量的文章列表,现在我反过来,去修改首页模板,设置文章数量为1,同时分类目录的文章列表数量仍然由后台自行控制,灵活性更大,并且文章列表页面原则上不会同WP-pagenavi插件发生冲突(毕竟没有使用到query_posts函数嘛)。经过测试,竟然成功了,很是兴奋,并且发现,首页下随便怎么测试都ok,指定任一数量都可以,不过依然不解其中的缘由,好吧,我就不再细究了。

最后遇到一个小小的问题是:页面page部分无法正确显示。解决方法自然是在这些query_posts前加一个限制条件了,用is_home()函数去判断是否首页就可以了。那么全部的code就如下了:

if ( is_home() ) {
function curPageURL() {
$pageURL = 'http';
//check what if its secure or not
if ($_SERVER["HTTPS"] == "on") {
$pageURL .= "s";
}
//add the protocol
$pageURL .= "://";
//check what port we are on
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
//cut off everything on the URL except the last 3 characters
$urlEnd = substr($pageURL, -3);
//strip off the two forward shashes
$page = str_replace("/", "", $urlEnd);
//return just the number
return $page;
}

$paged = (get_query_var('page')) ? get_query_var('page') : 1;
$args = array(
    // 这里以下面的方式添加query_posts参数,具体参数可以参加官方文档
    'showposts'   => 10,
    'paged' => curPageURL()
);
query_posts($args);
}

以上内容,放在你的if (have_posts())之前就可以了。喜欢的朋友就拿去用吧,不知道你是否也会遇到如此BT的需求呢?若有不妨沟通交流一下解决的经验。呵呵

posted on 2011-05-13 20:13  Rover.Tang  阅读(1287)  评论(0编辑  收藏  举报