我试图在WordPress插件上覆盖一个插件类。下面是最初的插件类:
class WCV_Vendor_Dashboard
{
       /**
        * __construct()
        */
        function __construct()
        {
            add_shortcode( 'wcv_shop_settings', array( $this, 'display_vendor_settings' ) );
            add_shortcode( 'wcv_vendor_dashboard', array( $this, 'display_vendor_products' ) );
            add_action( 'template_redirect', array( $this, 'check_access' ) );
            add_action( 'init', array( $this, 'save_vendor_settings' ) );
        }
        public function save_vendor_settings(){
               //some codes here
        }
 }下面是我正在尝试的(在functions.php中),但是它不起作用:
$wcv_vendor_dashboard = new WCV_Vendor_Dashboard();
global $wcv_vendor_dashboard;
remove_action( 'init', array( $wcv_vendor_dashboard , 'save_vendor_settings' ) );如何正确删除它,如何创建替换?
附加信息:在WooCommerce内核上做了类似的事情。当我想重写一个类/函数时,我使用这个(例如):
remove_action( 'template_redirect', array( 'WC_Form_Handler', 'save_account_details' ) );
function new_save_account_details() {
  //custom code here
}
add_action( 'template_redirect', 'new_save_account_details' );它在WooCommerce核心上正常工作。我在WCV_Vendor_Dashboard上尝试过类似的东西,但它不起作用。
发布于 2017-05-02 17:46:51
为什么它与woocommerce合作,但在这种情况下却不起作用?
当将函数附加到特定的操作时,WoredPress为该回调创建唯一的id,并将其存储在全局$wp_filter数组中(实际上,它以前是一个数组,但现在它是一个对象)。对于对象方法回调(如array( $this, 'save_vendor_settings' ) ),id是使用spl_object_hash php函数生成的。对于上面的例子,
spl_object_hash( $this ) . 'save_vendor_settings',看起来像000000001c0af63f000000006d7fe83asave_vendor_settings。
要“合法地”使用remove_action()删除object方法,您首先需要访问用于附加函数的原始对象。如果对象存在于全局命名空间中:
global $wcv;
remove_action( 'init', array( $wcv, 'save_vendor_settings' ) );创建另一个类实例将无法工作,因为生成的id对于每个对象都是唯一的,即使它们是同一个类的实例。
在WooCommerce的例子中,我猜是关于静态类方法的。使用不同的逻辑为静态类方法生成is,函数和静态方法回调只是作为字符串返回。就你的例子而言,应该是:
'WC_Form_Handler' . '::' . 'save_account_details'你知道为什么它对一种情况有效,但对另一种情况无效。
通过在全局$wp_filter对象中直接替换它们来替换附加的函数是有问题的,但它并不是100%可靠的。因为我们没有对原始对象的访问权限,所以我们只能根据函数的名称过滤$wp_filter,如果同一个动作有相同的名称,它将替换错误的处理程序。
global $wp_filter;
foreach ( $wp_filter['init']->callbacks as $priority => &$callbacks ) {
    foreach ( $callbacks as $id => &$callback ) {
        if ( substr( $id, -strlen( 'save_vendor_settings' ) ) === 'save_vendor_settings' ) {
            // replace the callback with new function
            $callback['function'] = 'new_save_vendor_settings';
        }
    }
}我希望它能起作用,问候。
发布于 2017-05-02 14:55:15
子类示例
class WCV_Vendor_Dashboard_Child extends WCV_Vendor_Dashboard
{
   /**
    * __construct()
    */
    function __construct()
    {
        parent::__construct();
    }
    public function new_save_vendor_settings(){
           //some codes here
    }
}https://stackoverflow.com/questions/43740789
复制相似问题