wordpress - 在 woocommerce 结帐表单处理后更新用户元数据

标签 wordpress woocommerce meta

我将 woocommerce 与 Wordpress 结合使用,并在结帐时添加了一些自定义字段:

add_action('woocommerce_after_order_notes', 'my_custom_checkout_field');

function my_custom_checkout_field( $checkout ) {

      $extra_fields = array('job_title', 'company', 'telephone', 'occupation');

      foreach($extra_fields as $key => $value) {

      woocommerce_form_field($value, array(
            'type'          => 'text',
            'class'         => array('my-field-class form-row-wide'),
            'label'         => __($label),
            'value'         => '',
            ), $checkout->get_value( $value ));

      }
}

目前,这些在结帐时显示正常,不确定在这种情况下使用 woocommerce_after_order_notes 是否正确。我还在用户元数据中添加了一些自定义字段,这些字段对应于添加到结帐的字段 - 所有这些都显示在用户个人资料页面中:

function add_contact_methods( $contactmethods ) {
     $contactmethods['job_title'] = 'Job Title';
     $contactmethods['company'] = 'Company Name';
     $contactmethods['telephone'] = 'Telephone';
     $contactmethods['occupation'] = 'Occupation';
     $contactmethods['refer'] = 'How you heard about us?';
     return $contactmethods;
}
add_filter('user_contactmethods','add_contact_methods',10,1);

正如您所想象的,如果我在任何个人资料页面中更新这些字段中的任何一个,它都可以正常工作,但我似乎无法做的是在新用户进行购买时更新用户元数据,它不会更新用户元数据对于数据库中的这些字段。

我非常了解这是如何工作的,并且明白我必须连接到 Woocommerce 流程以将字段添加到流程中。所以我也将这段代码添加到我的函数中:

add_action('woocommerce_checkout_update_user_meta', 'my_custom_checkout_field_update_user_meta');

    function my_custom_checkout_field_update_user_meta( $user_id ) {
        global $extra_fields;
        foreach($extra_fields as $key => $value) {
        if ($_POST[$value]) update_user_meta( $user_id, $value, esc_attr($_POST[$value]));
        }
    }

现在的转折点是,如果已经作为成员(member)登录的用户重新购买并通过结帐,则此方法有效 - 此方法有效的原因是因为 $user_id 已经存在,但是当新用户结帐时,他们还不作为用户存在,因此该函数无法更新 NIL 的用户元数据,其中 $user_id 不存在。

我的问题是,我应该如何 Hook 到结账过程中,大概是在创建用户之后,这样我才能得到返回的 $user_id,并执行此函数来更新用户元。

最佳答案

class-wc-checkout.php 第 639 行创建新用户 $this->customer_id = wp_insert_user( apply_filters( 'woocommerce_new_customer_data', $new_customer_data ) ); 新客户数据是一个数组列在该行的正上方。

之后,您可以使用第 649 行的操作访问用户 ID do_action( 'woocommerce_created_customer', $this->customer_id );

这不太可能,在您的情况下,您需要使用过滤器,但只需添加操作“woocommerce_created_customer”,拉入 ID,然后添加元数据。

关于wordpress - 在 woocommerce 结帐表单处理后更新用户元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17813195/

相关文章:

根目录中的 Wordpress htaccess 覆盖子域中的 htaccess。子域应用程序现在不工作

php - 从 wordpress/woocommerce 搜索查询中获取不同的结果

wordpress - WooCommerce在处理订单电子邮件中添加产品链接

php - 如果产品重量超过1000克,如何以公斤为单位显示

seo - 如果谷歌将它们编入索引,如何删除重复的标题和元描述标签

post - 将博客文章标签用作元数据关键字

jquery - 如何将 jQuery 后备入队 - WordPress

javascript - 桌面 Chrome 和 Firefox 浏览器上的响应式/Javascript Bootstrap 冲突

html - 多语言网站的元标签和 RSS

html - 为什么我的背景图片有时会消失?