月度归档: 2020 年 3 月

  • WordPress系列之钩子hook的作用及基本用法

    WordPress系列之钩子hook的作用及基本用法

    WordPress 的插件机制实际上只的就是这个 Hook 了,它中文被翻译成钩子,允许你参与 WordPress 核心的运行,是一个非常棒的东西,下面我们来详细了解一下它。

    钩子分类

    钩子分为两种,一种叫做动作(action),还有一种叫做过滤器(filter)。这两种钩子实现原理基本一样,后边会讲到,使用上的区别在于过滤器有返回值,而动作没有。

    动作的理念是让你在一种情况或者一个特别的位置执行一些函数,比如发送一封邮件等;过滤器则是让你修改 WordPress 核心需要用到的一个值,然后 WordPress 再用这些值做一些事情,比如函数的返回值等。

    动作钩子

    wp_head 是一个很常用的动作钩子,在开发主题过程中,开发者都会在 head 标签里加上 wp_head() 函数,事实上,正是这个函数调用了 wp_head 钩子。

    如果插件开发者想要在 head 标签里添加一句话,就可以使用 wp_head 钩子,下边是个简单的例子。

    //在 head 标签添加一些内容
    function Bing_add_head_tag(){
      echo '添加内容';
    }
    add_action( 'wp_head', 'Bing_add_head_tag' );

    添加代码后,查看前台的网页源代码,就能在 head 标签里看到我们添加的内容了。

    上边是一个简单的例子,只是打印了一句话。利用这个钩子,我们还可以做一个遇到 404 页面给管理员发送一封邮件的插件,下边简单的写了一个。

    //遇到 404 页面给管理员发送邮件
    function Bing_404_page_mail(){
      if( !is_404() ) return;//如果不是 404 页面就退出函数
      $to = get_option( 'admin_email' );//获取管理员地址
      $subject = '遇到 404 页面啦!';//邮件标题
      $message = '404 页面的地址:http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];//邮件内容
      wp_mail( $to, $subject, $message );//发送邮件
    }
    add_action( 'wp_head', 'Bing_404_page_mail' );

    过滤器钩子

    过滤器钩子可以让你改一些东西的值,过滤器回调函数会接受一个参数,这就是当前的值。还记得那个用来调用文章内容的 the_content() 函数吧,这个函数就提供了一个 the_content 过滤器。

    给 the_content 钩子添加一个函数,这个函数需要接收一个参数,这个参数就是当前的值。

    //文章内容全部链接新窗口打开
    function Bing_autoblank( $content ){//$content 变量就是文章内容,因为其它过滤器也要过滤,所以这个内容可能是经过其它函数过滤的
      $content = str_replace( '<a', '<a target="_blank"', $content );//添加 target="_blank"
      return $content;//必须要把过滤后的内容返回回去,否则值就丢了
    }
    add_filter( 'the_content', 'Bing_autoblank' );

    钩子原理

    事实上,在调用 add_action() 和 add_filter() 的时候,只是向 $wp_filter 全局变量添加了一个数组元素,还要说的就是动作和过滤器是公用的一个全局变量,也就是说,过滤器和动作是不能重名的。

    当调用 do_action() 的时候,会查找 $wp_filter 全局变量中都有哪些添加到此动作的函数,循环执行即可。

    apply_filters() 比 do_action() 多了一个步奏,就是每次调用函数时还要接收这个函数的返回值,最后把经过多次过滤的值返回出去,供使用。

    获取当前钩子列表
    WordPress 的动作和过滤器是插件机制的核心部分,允许你在特定的地方主动添加自己需要执行的动作,一般使用 add_action() 和 add_filter() 函数挂载函数。

    这些钩子被储存在 $wp_filter 全局变量里,所以,要获取钩子列表,可以直接获取 $wp_filter 全局变量。

    <?php var_dump( $GLOBALS['wp_filter'] ); ?>

    上边的代码会打印出钩子列表数组。

  • 如何定制 WordPress 后台仪表盘指定模块的显示

    如何定制 WordPress 后台仪表盘指定模块的显示

    WordPress 的后台仪表盘应该是每个站长们每天都要使用的吧!今天明月就分享一个定制显示 WordPress 后台仪表盘指定模块的代码,以方便大家定制自己需求的 WordPress 后台仪表盘来。

    只需要根据自己的需要选择下面的代码加入到主题 function.php 里即可,这里可以参考【如何方便的在更新主题时保留 functions.php 里的自定义』一文里的方法来防止主题更新后 function.php 被覆盖造成的失效问题。

    // 以下这一行代码将删除 "welcome" 模块
    remove_action('welcome_panel', 'wp_welcome_panel');
    //删除 WordPress 后台仪表盘
    function disable_dashboard_widgets() {
        global $wp_meta_boxes;
        unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_activity']);
        unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now']);
        unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments']);
        unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links']);
        unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']);
        unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']);
        unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']);
        unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press']);
        unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_recent_drafts']);
    }
    add_action('wp_dashboard_setup', 'disable_dashboard_widgets', 999);
    function custom_dashboard_help() {
        echo '这里填使用说明的内容,可填写HTML代码';
    }
    function example_add_dashboard_widgets() {
        wp_add_dashboard_widget('custom_help_widget', '这里替换成面板标题', 'custom_dashboard_help');
    }
    add_action('wp_dashboard_setup', 'example_add_dashboard_widgets' );

    具体大家可以参考上述代码里的中文注释来选择了,其实很简单的都是,只需要复制粘贴即可了。

  • 如何方便的在更新主题时保留 functions.php 里的自定义

    如何方便的在更新主题时保留 functions.php 里的自定义

    主题里面的 functions.php 文件是很多人折腾的最多的文件,可是每次更新主题时这个文件都会被主题默认的给覆盖,所以更新主题前都得提前备份自定义的代码有时候也是一个麻烦事儿,很容易丢失 functions.php 自定义代码造成网站出问题的尴尬(悲催的是我竟然没有备份过,当时),还好最后在管理员的帮助下给找回来了!因此,今天我们发现了一个很好的方法,感觉非常的方便实用,于是我就参考原文撰写了此文分享给大家。

    其实这个办法,非常简单,非常非常的简单的。我们知道一般来说,插件的代码放进 functions 文件里面也可以使用,反过来说,functions 文件里面的代码放进插件也一样使用,那么自己做个插件不就好了,其实自己做一个插件很简单的,来跟着明月看一下吧。

    <?php
    /* 
    Plugin Name: 模版函数扩展插件 
    Description: 给主题模版函数库里添加点小功能 
    Author: laoji
    */
    //文件里面加入代码就可以和 functions 文件一样了 
    

    把上面的代码自己另存为一个 php 文件,记住是 UTF-8 编码,然后放进 wp-content/plugins 文件夹,对,直接放进插件文件夹,然后去插件中心看看。

    一个插件就这么出来了,虽然里面没有什么实际代码,但是他就是一个插件,对网站开始起作用了,和在 functions 文件里面加代码一样,在这个小插件里面加代码就可以了,比如下面的小功能。 这里有个小功能,就是后台颜色随即切换的代码。

    function Bing_random_admin_color(){
        static $color;
        if( isset( $color ) ) return $color;
        $color = array_keys( $GLOBALS['_wp_admin_css_colors'] );
        $color = $color[array_rand( $color )];
        return $color;
    }
    add_filter( 'get_user_option_admin_color', 'Bing_random_admin_color' );

    将上面的代码加入那个小插件文件里面,就是下面这样的:

    <?php
    /* 
    Plugin Name: 模版函数扩展插件
    Description: 给主题模版函数库里添加点小功能 
    Author: laoji
    */
    //文件里面加入代码就可以和 functions 文件一样了  
    function Bing_random_admin_color(){
        static $color;
        if( isset( $color ) ) return $color;
        $color = array_keys( $GLOBALS['_wp_admin_css_colors'] );
        $color = $color[array_rand( $color )];
        return $color;
    }
    add_filter( 'get_user_option_admin_color', 'Bing_random_admin_color' );
    ?>

    去后台启用插件试试,刷新看看,生效,没问题!完美!

    这样一来以后还有需要放到 functions.php 里的自定义代码都可以放到这个“自制”的小插件了,主题更新可以随意更新不用担心丢失这些辛辛苦苦收集的自定义代码了。

  • 滴滴云 国内云服务器 DC2爆款 1M带宽/1核/2GB内存/40GB高效云盘 9.9元3个月 年付68元

    滴滴云 国内云服务器 DC2爆款 1M带宽/1核/2GB内存/40GB高效云盘 9.9元3个月 年付68元

      滴滴云基于滴滴出行的业务技术和经验积累,

      采用领先的云计算架构、高规格服务器集群搭建、高性能资源配置机制、精细化运营模式,

      致力于为开发者提供简单快捷、高效稳定、高性价比、安全可靠的IT基础设施云服务。

      滴滴云目前提供100倍的故障赔偿,免费备案服务,备案补偿,7×24小时服务支持。

    点击下方图片,可以领取2200元通用红包。

    滴滴云 国内云服务器 DC2爆款 1M带宽/1核/2GB内存/40GB高效云盘 9.9元/3个月 年付68元

  • PHP 获取二维数组里面键值,并变为list 新的数组array

    PHP 获取二维数组里面键值,并变为list 新的数组array

    在现实开发中,我们可能需要从一大堆的数组中获取一个指定键值并组成新的数组。下面我们记录一下,使用 array_column 函数实现

    $arr=array(0=>array('code'=>'UQ99WGCBEK'),1=>array('code'=>'LA68Y76ZYX'),2=>array('code'=>'LWNRYNQQ17'));
    //print_r($arr);die;
    $arr2=array_column($arr,'code');
    print_r($arr2);die;

    输出:

    Array
    (
        [0] => UQ99WGCBEK
        [1] => LA68Y76ZYX
        [2] => LWNRYNQQ17
    )

    array_column: 返回输入数组中某个单一列的值。

  • Python 跨文件 function函数 定义全局变量 代码实例

    Python 跨文件 function函数 定义全局变量 代码实例

    老季是Python新手,下面我们记录一下如何跨文件定义一个全局变量。

    • cnc.py 主程序文件
    • func.py 功能函数文件
    • cmcc.py

    我们需要在main.py、cmss.py里定义了一个变量,lockfile 当然这里文件里的各个值是不同的。我们如何在func.py的函数里使用这个lockfile的值呢?

    开始我们使用的是 global lockfile 方法,这种只能在单文件里赋值,比如:

    lockfile = 1
    def jrun():
        global lockfile   
        return lockfile+2

    这样的话可以正常运行,返回3 。但是如果我们把jrun()放入到另外一个文件里,就无法运行了。因为在这个py模块中并没有一个叫做lockfile的变量,于是就会报错未定义。 下面我们给出正确的方法。

    cnc.py

    import func
    lockfile = '/tmp/laoji.org.cnc'
    func.GlobalVar.lockFileName = lockfile #赋值到func里
    func.t = 123
    a()

    func.py

    class GlobalVar:
        lockFileName = None
    t = None
    def a():
        xxx = GlobalVar.lockFileName #这里就可以调用到设置的lockFileName值
        global t
        # 这里也同样可以调用到t的值
        dosomething...

    cmc.py

    import func
    lockfile = '/tmp/laoji.org.cmc'
    func.GlobalVar.lockFileName = lockfile  #这里就可以调用到设置的lockfile值了
    func.t = 333
    a()

    这里仅仅提供思路,大家还要根据实际情况举一反三。

WeChat
↑