wordpress移除已注册的类成员函数钩子

书接上文,找到钩子的目的是为了干掉它。
add_filter和add_action函数的第二个参数,可以是散兵游勇的单个函数,也可以是某个类的成员函数。

add_filter('the_content','func');

这种形式注册的钩子,可以直接用

remove_filter('the_content','func');

删掉。

add_action('init', array($this, 'func2'), 9);

这种形式注册的钩子,在类以外就无法删除了。因为你根本无法获得$this这玩意儿。
所幸我找到了解决方案,封装了一个函数。只要给函数多传一个类名,就可以删除了。
函数实现如下:

function remove_anonymous_object_hook( $tag, $class, $method )
{
    $filters = $GLOBALS['wp_filter'][ $tag ];

    if ( empty ( $filters ) )
    {
        return;
    }
    foreach ( $filters as $priority => $filter )
    {
        foreach ( $filter as $identifier => $function )
        {
            if ( is_array( $function)
                and is_a( $function['function'][0], $class )
                and $method === $function['function'][1]
            )
            {
                //action也可以用remove_filter删除。
                remove_filter(
                    $tag,
                    array ( $function['function'][0], $method ),
                    $priority
                );
            }
        }
    }
}

对于wprdpress底层来说,filter和action其实是同一个东西,所以这个函数可以对付filter和action。
如果函数是static函数,用这个函数是无法删掉的,而应该用

remove_filter('the_content','class::func3');

进行删除。

代码来源

已有14条评论

  1. 大舅子新年好!

    按照你假日基本不更新的尿性,这文……不会又是定时发布的吧?

      1. 很明显,你搞错了!

    1. 我从不定时发。wp-cron都被我删了。
      不过你差不多猜对了,不让我的草稿陪我过年。

  2. 新年快乐,拜个晚年-_-

    1. 那蹂躏谁

  3. 这个主题不错啊,还有书卷味啊

  4. 新年快乐。

  5. 用typecho吧,简单简洁,哈哈~~

    1. 这不可能。
      如果非要用,我一定会把WP的功能都改过去的。
      再说十多年的数据会把我累死的。我指的是各种WP官方表以外的内容。

    1. 配图跟正文不符也不是一天两天了。

你好,新朋友。留言前请先填写昵称邮箱