WooCommerce用户元数据的‘PROFILE_UPDATE’挂钩替代

时间:2020-10-02 作者:Kristián Filo

我试图在调用的函数中获取所有用户详细信息(包括WooCommerce元数据)user_registerprofile_update 挂钩。这是简化代码:

function get_all_user_data($user_id) {

    $user_data = get_userdata($user_id);

    $login = $user_data->user_login;

    $b_firstname = get_user_meta($user_id, \'billing_first_name\', true);

}
add_action(\'user_register\',\'get_all_user_data\');
add_action(\'profile_update\',\'get_all_user_data\');

The behavior:

  1. 用户已注册,我可以立即访问其用户数据(例如登录名)
  2. WooCommerce计费地址已更新并保存,但我仍然只能访问$login变量,“billing\\u first\\u name”meta此时显然仍然为空
  3. WooCommerce发货地址已更新并保存,之后我可以访问上一步中保存的计费信息,但不是当前步骤中保存的配送数据
同样适用于用户在WooCommerce结账期间注册的情况,此时还无法访问WC数据。

PS:我也试过woocommerce_after_save_address_validation 钩子,但这似乎与profile_update 就我而言。

Edit: edit_user_profile_update 效果不太好。将操作优先级设置为较高的数字(稍后执行)也没有帮助。insert_user_meta 过滤器工作,但只返回本机WP的用户元,而不返回WooCommerce客户的元。

2 个回复
最合适的回答,由SO网友:Kristián Filo 整理而成

我成功了。关键是woocommerce_update_customer 行动最终,我的功能仅由以下两个操作触发:

add_action(\'user_register\',\'get_all_user_data\', 99);
add_action(\'woocommerce_update_customer\',\'get_all_user_data\', 99);
我不需要profile_update 因为我不需要跟踪默认WP用户数据中的更改。但是,它可以与woocommerce\\u update \\u customer一起使用,但请记住,您的功能将被触发两次。

SO网友:Lonk

我的解决方案是:

function get_all_user_data($user_id) {

    $user_data = get_userdata($user_id);

    $login = $user_data->user_login;

    $customer_array = new WC_Customer( $user_id );
    $customer = $customer_array->get_data();
    $billing_first_name = $customer[billing][first_name];
    $shipping_first_name = $customer[shipping][first_name];
}
add_action(\'user_register\',\'get_all_user_data\');
add_action(\'profile_update\',\'get_all_user_data\');

客户阵列[计费]和[发货]的阵列设置如下(如果愿意,您可以更改我的值并获取不同的数据或添加更多变量):

    [billing] => Array
        (
            [first_name] => John
            [last_name] => Doe
            [company] => 
            [address_1] => 1338 Easy St
            [address_2] => 
            [city] => Oakland
            [postcode] => 48094
            [country] => US
            [state] => CA
            [email] => [email protected]
            [phone] => 6167783456
        )

    [shipping] => Array
        (
            [first_name] => John
            [last_name] => Doe
            [company] => 
            [address_1] => 1338 Easy St
            [address_2] => 
            [city] => Oakland
            [postcode] => 48094
            [country] => US
            [state] => CA
        )

相关推荐

OOP development and hooks

我目前正在为Wordpress编写我的第一个OOP插件。为了帮助我找到一点结构,a boiler plate 这为我奠定了基础。在里面Main.php 有一种方法可以为管理员加载JS和CSS资产:/** * Register all of the hooks related to the admin area functionality * of the plugin. * * @since 0.1.0 * @access private