在制作主题的时候发现,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));//确保每个值都是数字
}