问题
想做一个在右侧显示的文章目录, 使用文章目录的插件 Easy Table of Contents
, 将其添加到右侧的侧边栏中, 很轻松做到了这点.
但是, 一个新的问题出现了. 这个目录的工具, 需要在文章页面显示, 而在其他页面不显示.
那么问题来了, 如何让不同的页面显示不同的侧边栏工具呢?
在网上找了一些教程, 基本上都是推荐安装插件的, 通过这种方式确实可以解决, 但是安装插件会拖慢网站的加载速度, 能不能自己实现呢?
解决
转念一想, WordPress
提供了那么多的钩子, 有没有合适的钩子能够对页面工具进行过滤呢?
在官网上 https://developer.wordpress.org/reference/hooks/ 通过关键字 widget
搜索相关的钩子, 结果发现人家确实提供了. 官方提供了很多钩子, 需要的时候可以先看一下有没有需要的.
就是: sidebars_widgets
, 可以针对小工具进行过滤.
回调函数收到的参数长这样:
{
"wp_inactive_widgets": [
"block-2",
"block-3",
"block-4",
"block-6",
"block-8",
"block-10",
"block-11",
"block-12",
"block-15",
"block-16",
"block-18",
"block-19"
],
"sidebar-1": [
"block-20",
"custom_html-2",
"categories-2",
"ezw_tco-2"
],
"header-widget": [],
"footer-widget-1": [],
"footer-widget-2": [],
"advanced-footer-widget-1": [],
"advanced-footer-widget-2": [],
"advanced-footer-widget-3": [],
"advanced-footer-widget-4": []
}
其中sidebar-1
就是侧边栏工具列表啦. 那么思路就很清晰了, 只要在不同的页面对不同的工具进行过滤, 就可以达到效果啦.
下面给出我添加的过滤方法, 我的需求是在文章页面仅显示目录工具, 其他页面去掉目录工具. 仅供参考(将代码添加到 functions.php
文件中).
这里注意, 管理后台不能过滤, 否则你在后台的小工具页面也看不到了.
/**
* 侧边栏小部件过滤
* @author hujing
*/
add_filter( 'sidebars_widgets', function ($widgets){
// 后台界面, 都不过滤
if(is_admin()) return $widgets;
// 判断是否是目录部件
$isEzwTco = fn($i) => strpos($i, 'ezw_tco-') === 0;
// 对侧边栏内容进行过滤
$filterSidebar = function ($isKeep) use (&$widgets){
foreach ($widgets as $type=>&$tmpList){
// 找到侧边栏, 进行过滤
if(strpos($type, 'sidebar-') === 0){
$tmpList = array_filter($tmpList, $isKeep);
}
}
};
// 文章页面, 侧边栏值留下目录
if(is_single()){
$filterSidebar(fn($i) => $isEzwTco($i));
}else{ // 非文章页面, 将侧边栏的目录过滤
$filterSidebar(fn($i) => !$isEzwTco($i));
}
return $widgets;
});