改过主题的人都知道在typecho中,Widget_Contents_Post_Recent可以很方便的调用侧边栏一定数量的博客最新文章列表,用pageSize控制列表的记录的数目,而且有三种书写方式。
<?php
$this->widget('Widget_Contents_Post_Recent','pageSize=10')->parse('<li><a href="{permalink}"><span>{year}/{month}/{day}</span>{title}</a></li>');
?>
<?php
$this->widget('Widget_Contents_Post_Recent','pageSize=10')->to($recent);
if($recent->have()): //判断是否有记录
while($recent->next()):
?>
<li><a href="<?php $recent->permalink();?>"><?php $recent->title();?></a></li>
<?php endwhile; endif;?>
<?php
$recent = $this->widget('Widget_Contents_Post_Recent','pageSize=10');
if($recent->have()):
while($recent->next()):
?>
<li><a href="<?php $recent->permalink();?>"><?php $recent->title();?></a></li>
<?php endwhile; endif;?>
以上这些,都是被转载烂了的调用了,但这个调用实际上并不是很实用,以前为了实现侧边栏的丰富多彩,我搜索过很多资料,也看过很多主题作者写的代码,发现他们都是千篇一律地自己写数据库查询。
其实最好的查询方式,typecho已经告诉我们了,根本不用自己去想,我们可以搜索typecho var文件夹里的代码,例如上面查询就是位于 var/Widget/Contents/Post/Recent.php
,通过查看代码:
class Widget_Contents_Post_Recent extends Widget_Abstract_Contents
{
/**
* 执行函数
*
* @access public
* @return void
*/
public function execute()
{
$this->parameter->setDefault(array('pageSize' => $this->options->postsListSize));
$this->db->fetchAll($this->select()
->where('table.contents.status = ?', 'publish')
->where('table.contents.created < ?', $this->options->time)
->where('table.contents.type = ?', 'post')
->order('table.contents.created', Typecho_Db::SORT_DESC)
->limit($this->parameter->pageSize), array($this, 'push'));
}
}
我们可以看到,这里他只定义了一个pagesSize的变量,而其它都是固定的查询,所以我们要改变他的查询方式只需要修改其它的固定查询即可,我们也不必动系统文件,只需要把这段代码复制粘贴到当前主题functions.php
并改个名字就好。
例如:
class Widget_Contents_Post_sort extends Widget_Abstract_Contents
{
public function execute()
{
$this->parameter->setDefault(array('pageSize' => $this->options->postsListSize, 'sort' => 'table.contents.created'));
$this->db->fetchAll($this->select()
->where('table.contents.status = ?', 'publish')
->where('table.contents.created < ?', $this->options->time)
->where('table.contents.type = ?', 'post')
->order($this->parameter->sort, Typecho_Db::SORT_DESC)
->limit($this->parameter->pageSize), array($this, 'push'));
}
}
这里我修改了他的排序,可以丰富的侧边栏
例如:
最近修改的文章排序:$this->widget('Widget_Contents_Post_sort','pageSize=10&sort=modified')
最多评论文章排序:$this->widget('Widget_Contents_Post_sort','pageSize=10&sort=commentsNum')
随机显示文章:$this->widget('Widget_Contents_Post_sort','pageSize=10&sort=RAND()')
使用方式就是开始我介绍的typecho默认的三种调用方法,只需要把$this->widget('Widget_Contents_Post_Recent','pageSize=10')
换成我这个即可。
p.s. 这只是小试牛刀,var下还有很多强大的查询。