如何在类中删除_action

时间:2018-08-17 作者:ttn_

我有这样的课

if ( ! class_exists( \'My_class\' ) ) {
    class My_class {
        public function __construct() {
            add_action( \'woocommerce_shop_loop_item_title\', array( $this, \'change_title\' ), 10 );
        }

        public function change_title() {
            echo \'The title\';
        }
    }
}

return new My_class();
我正在尝试删除\\u操作change_title 通过使用

remove_action( \'woocommerce_before_shop_loop_item_title\', array( \'My_class\', \'change_title\' ), 10 );
// or
remove_action( \'woocommerce_before_shop_loop_item_title\', 10 );
但它不起作用,因为我不太懂PHP OOP。我该怎么做,可能吗?

我可以通过插件删除它吗?

谢谢

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

无法使用删除它remove_action() 你写它的方式。

当你把它挂在这里时:

add_action( \'woocommerce_shop_loop_item_title\', array( $this, \'change_title\' ), 10 );
The$this 表示挂接的函数位于My_class. 使用时remove_action() 您需要传递类的相同实例:

remove_action( \'woocommerce_before_shop_loop_item_title\', array( $instance, \'change_title\' ), 10 );
(其中$instance 是类的实例)。

问题是该类的实例在其他任何地方都不可用,因为您没有实例化任何内容:

return new My_class();
要删除该操作,需要将类实例放入变量中,然后使用该变量在以后删除它:

$my_class = new My_class();
然后在其他代码中:

global $my_class;

remove_action( \'woocommerce_before_shop_loop_item_title\', array( $my_class, \'change_title\' ), 10 );
另一种选择是,如果change_titlestatic 然后,您不需要特定的类实例来添加它,也不需要从挂钩中删除它。

因此,将函数设置为静态:

public static function change_title() {
    echo \'The title\';
}
然后要挂接静态方法,请执行以下操作:

add_action( \'woocommerce_shop_loop_item_title\', array( \'My_class\', \'change_title\' ), 10 );
这意味着您可以像这样删除它:

remove_action( \'woocommerce_before_shop_loop_item_title\', array( \'My_class\', \'change_title\' ), 10 );
但您的类/函数是否可以或应该是静态的是一个更大的体系结构问题,这将完全取决于您正在做什么。

结束