typecho自定义筛选首页文章分类,含主题和插件方法
在制作主题的时候发现,typecho用Widget_Archive
归档的文章数据,都是归档到catelogry页面,因为定制了不同目录的模版,导致多分类重叠的文章在首页模版冲突。在github找到了一个CateFilter首页过滤指定分类插件,因不太喜欢用插件,参考该插件整合到了主题的function中,隔离了Widget_Archive
和首页归档的模版冲突。
另外也重新写了插件,增加了包含分类和排除分类选项,以防切主题备用 Typecho筛选首页分类文章插件
// reset index postlist select
function indexFilter($select, $mid){
if('/feed' == strtolower(Typecho_Router::getPathInfo()) || '/feed/' == strtolower(Typecho_Router::getPathInfo())) return $select;
$categoryMid = Typecho_Widget::widget('Widget_Options')->$mid;
if(!$categoryMid) return $select;
$select = $select->select('table.contents.cid', 'table.contents.title', 'table.contents.slug', 'table.contents.created', 'table.contents.authorId','table.contents.modified', 'table.contents.type', 'table.contents.status', 'table.contents.text', 'table.contents.commentsNum', 'table.contents.order','table.contents.template', 'table.contents.password', 'table.contents.allowComment', 'table.contents.allowPing', 'table.contents.allowFeed','table.contents.parent')->join('table.relationships','table.relationships.cid = table.contents.cid','right')->join('table.metas','table.relationships.mid = table.metas.mid','right')->where('table.metas.type=?','category');
$select = $select->where('table.relationships.mid in ('. $categoryMid. ')');
return $select;
}
// 判断首页
if(Typecho_Widget::widget('Widget_Archive')->is("index")){
$currentUrl = $_SERVER['REQUEST_URI'];
if(preg_match("/page\/[0-9][^\s]*\//", $currentUrl) || $currentUrl== "/"){indexFilter($select,"postMid");}
}
因为typecho没有打包not in方法,如果不想包含某分类,可用以下方法:
$categoryMid = explode(',', $categoryMid);
$categoryMid = array_unique($categoryMid); //去除重复值
foreach ($categoryMid as $k => $v) {
$select = $select->where('table.relationships.mid != '.intval($v));//确保每个值都是数字
}