zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    2018.5.27 OraclePLSQL编程 if-else练习和循环结构练习
    桶排序
    从函数中返回引用
    函数返回值
    参数传递模式
    计数排序(不基于比较的排序算法)
    快排序
    堆用作优先队列
    堆排序
    合并算法
  • 原文地址:https://www.cnblogs.com/hujingnb/p/15484171.html
Copyright © 2011-2022 走看看