从插件类中删除操作

时间:2018-05-30 作者:Alex

<?php

namespace wp_gdpr_wc\\controller;

use wp_gdpr\\lib\\Gdpr_Container;
use wp_gdpr_wc\\lib\\Gdpr_Wc_Translation;
use wp_gdpr_wc\\model\\Wc_Model;

class Controller_Wc {
    const REQUEST_TYPE = 3;

    /**
     * Controller_Form_Submit constructor.
     */
    public function __construct() {
        add_action( \'woocommerce_after_order_notes\', array( $this, \'checkout_consent_checkbox\' ) );
    }
通常我可以这样移除它remove_action( \'woocommerce_after_order_notes\', \'Controller_Wc::checkout_consent_checkbox\'); 但这里似乎不起作用。

2 个回复
最合适的回答,由SO网友:Alex 整理而成

我是用这个函数做的remove_filters_with_method_name( \'woocommerce_after_order_notes\', \'checkout_consent_checkbox\', 10 );

function remove_filters_with_method_name( $hook_name = \'\', $method_name = \'\', $priority = 0 ) {
    global $wp_filter;
    // Take only filters on right hook name and priority
    if ( ! isset( $wp_filter[ $hook_name ][ $priority ] ) || ! is_array( $wp_filter[ $hook_name ][ $priority ] ) ) {
        return false;
    }
    // Loop on filters registered
    foreach ( (array) $wp_filter[ $hook_name ][ $priority ] as $unique_id => $filter_array ) {
        // Test if filter is an array ! (always for class/method)
        if ( isset( $filter_array[\'function\'] ) && is_array( $filter_array[\'function\'] ) ) {
            // Test if object is a class and method is equal to param !
            if ( is_object( $filter_array[\'function\'][0] ) && get_class( $filter_array[\'function\'][0] ) && $filter_array[\'function\'][1] == $method_name ) {
                // Test for WordPress >= 4.7 WP_Hook class (https://make.wordpress.org/core/2016/09/08/wp_hook-next-generation-actions-and-filters/)
                if ( is_a( $wp_filter[ $hook_name ], \'WP_Hook\' ) ) {
                    unset( $wp_filter[ $hook_name ]->callbacks[ $priority ][ $unique_id ] );
                } else {
                    unset( $wp_filter[ $hook_name ][ $priority ][ $unique_id ] );
                }
            }
        }
    }
    return false;
}

SO网友:Jacob Peattie

要删除某个操作,首先需要传递用于添加该操作的相同调用。与普通函数或静态方法相比,钩子的区别在于,您已经在类的特定实例上传递了一个方法。注意使用$this:

add_action( \'woocommerce_after_order_notes\', array( $this, \'checkout_consent_checkbox\' ) );
因此,在删除操作时,需要以相同的方式传递相同的实例:

add_action( \'woocommerce_after_order_notes\', array( $that, \'checkout_consent_checkbox\' ) );
在哪里$that 是包含类的相同实例的变量。

为此,您需要找到该变量。这取决于插件最初是如何构建的如果类被实例化为如下全局变量:

global $wp_gdpr_wc_controller;
$wp_gdpr_wc_controller = new Controller_Wc;
然后,您将按如下方式删除它:

global $wp_gdpr_wc_controller;
remove_action( \'woocommerce_after_order_notes\', array( $wp_gdpr_wc_controller, \'checkout_consent_checkbox\' ) );

结束