想做一个在右侧显示的文章目录, 使用文章目录的插件 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; });
原文链接: https://hujingnb.com/archives/679