做网站运营久了,大家都会发现一个定律:内容相关性越高,用户停留时间越长。之前咱们聊过如何把侧边栏热榜限制在顶级分类下,但最近有站长反馈,觉得这样颗粒度还不够细。比如用户正在看“WordPress插件”这个子分类下的教程,侧边栏却推给他“Linux服务器”的热门文章,虽然它们都属于“技术教程”这个大类,但关联度显然差了一截。因为目前WordPress子比主题的侧边栏小工具没有专门针对当前分类显示相应的文章功能,之前主题铺也问过官方,不知道是懒得加上去还是什么原因,于是主题铺自己动手。
以Zibll热榜文章小工具为例,要想实现“看代码推代码,看美食推美食”的精准效果,我们得动点小手术。说白了,就是用户在看哪个具体的圈子,就推哪个圈子的热榜。今天主题铺就教大家分两步走,打通这个功能的任督二脉。
第一步:让核心函数“听懂”分类指令
这一步非常关键,不做的话后面改什么都没用。因为子比主题原生的 zib_hot_posts 函数天生“眼瞎”,看不见分类参数。
打开主题目录下的 inc/functions/zib-posts-list.php 文件,搜索 zib_hot_posts,大概在585行。我们需要给它加两个补丁,让它能接收并处理分类ID。
function zib_hot_posts($args = array(), $echo = false)
{
$defaults = array(
'orderby' => 'views',
'limit_day' => 0,
'target_blank' => '',
'taxonomy' => '',
'orderby' => 'date',
'count' => 6,
'cat' => '', // 【新增1】在这里添加默认值,防止报错
);
$args = wp_parse_args((array) $args, $defaults);
$target_blank = !empty($args['target_blank']) ? ' target="_blank"' : '';
//准备文章
$posts_args = array(
'showposts' => $args['count'],
'ignore_sticky_posts' => 1,
'post_type' => 'post',
'post_status' => 'publish',
'order' => 'DESC',
'no_found_rows' => true,
);
// 【新增2】如果传递了 cat 参数,把它塞进查询条件里
if (!empty($args['cat'])) {
$posts_args['cat'] = $args['cat'];
}
// 下面的代码保持不变...第二步:植入“精准识别”逻辑
这一步是本次升级的重点。我们要修改小工具的逻辑,让它能根据当前页面自动判断该抓取哪个分类ID。
打开 inc/widgets/widget-posts.php 文件,找到 zib_widget_ui_hot_posts 函数(约537行)。
这次我们不需要递归去查什么父级分类了,逻辑反而变得更简单直接:如果是文章页,就取当前文章的直接分类;如果是分类页,就取当前分类ID。
用下面的代码完整替换原有的 zib_widget_ui_hot_posts 函数:
// 优先显示当前具体分类(子分类),不强制查找顶级
function zib_widget_ui_hot_posts($args, $instance)
{
$show_class = Zib_CFSwidget::show_class($instance);
if (!$show_class) {
return;
}
// --- 新增逻辑开始:获取当前分类ID ---
// 只有开启了“仅显示当前分类”开关时才执行
if (!empty($instance['current_cat'])) {
$target_cat_id = 0;
// 情况1:当前是分类归档页
if (is_category()) {
// 直接获取当前页面的分类ID
// 如果当前是子分类页,拿到的就是子分类ID
// 如果当前是顶级分类页,拿到的就是顶级分类ID
$target_cat_id = get_queried_object_id();
}
// 情况2:当前是文章详情页
elseif (is_singular('post')) {
global $post;
// 获取当前文章的所有分类
$categories = get_the_category($post->ID);
if ($categories) {
// 直接获取文章所属的第一个分类
// 不再递归查找父级,直接使用当前这个具体的分类ID
// 这样如果文章属于子分类,这里就是子分类ID
$target_cat_id = $categories[0]->term_id;
}
}
// 如果找到了分类ID,注入到参数中
if ($target_cat_id) {
$instance['cat'] = $target_cat_id;
}
}
// --- 新增逻辑结束 ---
$html = zib_hot_posts($instance);
$args['size'] = 'mini';
Zib_CFSwidget::echo_before($instance, '', $args);
echo $html;
Zib_CFSwidget::echo_after($instance, $args);
}最后一步,还得在后台给这个功能加个控制开关,不然想切回全局热榜时不方便。还是在同一个文件里,找到配置数组的地方(搜索 limit_day 大概在495行),在它后面加上这一段:
array(
'id' => 'limit_day',
// 原有的代码...
),
// 【新增】添加功能开关
array(
'title' => '仅显示当前分类',
'desc' => '开启后,将只显示当前页面所属分类(子分类)下的文章,支持文章页和分类归档页',
'id' => 'current_cat',
'type' => 'switcher',
'default' => false,
),
array(
'id' => 'count',
// 原有的代码...
),最终效果如下
![图片[1]-WordPress子比主题Zibll热榜文章小工具增加仅显示当前分类功能图文教程-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2026/01/20260127154126768.png/ztp)
做完这些修改后,去后台外观-小工具里,找到多功能热榜模块,勾选仅显示当前分类。这时候你去前台看看,点击一个子分类下的文章,侧边栏推荐的肯定全是同类目的内容。据主题铺观察,这种精准到子分类的推荐策略,能有效提升用户的沉浸感,因为推荐的内容正是他们当下最感兴趣的领域,点击率自然就上去了。

















暂无评论内容