是否有可能从woocommerce中删除这些操作

时间:2015-05-12 21:39:49

标签: woocommerce

我尝试使用remove_action从woocommerce中删除操作,但无法弄清楚如何操作。

首先我试试这个:

global $wc_admin_profile;

    remove_action( 'show_user_profile', array( $wc_admin_profile, 'add_customer_meta_fields' ) );
    remove_action( 'edit_user_profile', array( $wc_admin_profile, 'add_customer_meta_fields' ) );

我也试试这个:

add_action( 'admin_init', 'wpdev_170663_remove_parent_theme_stuff', 0 );
function wpdev_170663_remove_parent_theme_stuff() {
    global $wc_admin_profile;

    remove_action( 'show_user_profile', array( $wc_admin_profile, 'add_customer_meta_fields' ) );
    remove_action( 'edit_user_profile', array( $wc_admin_profile, 'add_customer_meta_fields' ) );
}

但它们不起作用。

/**
 * WC_Admin_Profile Class
 */
class WC_Admin_Profile {
    /**
     * Hook in tabs.
     */
    public function __construct() {
        add_action( 'show_user_profile', array( $this, 'add_customer_meta_fields' ) );
        add_action( 'edit_user_profile', array( $this, 'add_customer_meta_fields' ) );
        add_action( 'personal_options_update', array( $this, 'save_customer_meta_fields' ) );
        add_action( 'edit_user_profile_update', array( $this, 'save_customer_meta_fields' ) );
        add_action( 'show_user_profile', array( $this, 'add_api_key_field' ) );
        add_action( 'edit_user_profile', array( $this, 'add_api_key_field' ) );
        add_action( 'personal_options_update', array( $this, 'generate_api_key' ) );
        add_action( 'edit_user_profile_update', array( $this, 'generate_api_key' ) );
    }

2 个答案:

答案 0 :(得分:2)

很抱歉对此进行了一些巫术,但是我发现一个更好的解决方案是使用过滤器woocommerce_customer_meta_fields

像这样应用它:

add_filter('woocommerce_customer_meta_fields', function($fields) {
   return [];
});

通过在此过滤器内返回空数组,这将导致WC_Admin_Profile::add_customer_meta_fields中的foreach循环终止,从而阻止任何输出。

您可以通过检查woocommerce中WC_Admin_Profile的{​​{1}}类中如何应用和处理过滤器来验证这一点。

答案 1 :(得分:0)

您可以通过覆盖WC_Admin_Profile Woocommerce核心类来删除这些操作。 你可以通过创建一个新插件(创建新的php文件)并将其放在mu-plugins中来实现。 该插件将包含WC_Admin_Profile

的定义
class WC_Admin_Profile {

}
return new WC_Admin_Profile();

现在,您可以在新创建的类中自由定义自己的代码。

我们知道mu-plugins目录中的插件在任何其他插件之前执行。因此,不要尝试通过将函数放在您的活动主题目录中的functions.php中来解决它。 检查此方案Code execution order scheme 我遇到了同样的问题,我可以通过这样做来解决它。此解决方案100%有效,因为class-wc-admin-profile.php放置在/wp-content/plugins/woocommerce/includes/admin中,您可以检查哪个类已经定义了验证。

if ( ! class_exists( 'WC_Admin_Profile' ) ) :

因为您已经定义了自己的类,所以它永远不会从Woocommerce核心运行该类。

我希望它有所帮助:)