我正在将 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]));
}
}
现在的转折是,如果已经以会员身份登录的用户进行了回购并结帐,则此方法有效-之所以有效,是因为$user_id
已经存在,但是当新用户结帐时,他们还没有作为用户存在,因此该函数无法更新NIL
where$user_id
不存在的用户元。
我的问题是,我如何挂钩到结帐过程,大概是在创建用户之后,所以我可以得到$user_id
返回,并执行这个函数来更新用户元数据。