我尝试使用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' ) );
}
答案 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核心运行该类。
我希望它有所帮助:)