Wordpress不同页面显示不同小工具

问题

想做一个在右侧显示的文章目录, 使用文章目录的插件 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

上一篇:libco源码解析---协程运行与基本结构


下一篇:WordPress网站使用Gzip压缩提高网站加载速度教程