我正在将 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
的用户元,其中 $user_id
不存在。
我的问题是,我如何挂钩结帐过程,大概是在创建用户之后,这样我就可以获得返回的
$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,然后添加元。
当客户未登录结帐页面时,客户想要创建新帐户的字段应该是可接受的。当客户订购新商品并更新用户元数据时,结帐页面中的以下示例代码会发生变化。
function user_extra_meta_fields(){
return array(
'job_title' => __( 'Job Title', 'yourtext_domain'),
'company' => __( 'Company Name', 'yourtext_domain'),
'telephone' => __( 'Telephone', 'yourtext_domain'),
'occupation' => __( 'Occupation', 'yourtext_domain'),
'refer' => __( 'How you heard about us?', 'yourtext_domain'),
);
}
function add_contact_methods( $contactmethods ) {
$contactmethods = array_merge( $contactmethods, user_extra_meta_fields());
return $contactmethods;
}
add_filter('user_contactmethods','add_contact_methods',10,1);
add_action('woocommerce_after_order_notes', 'my_custom_checkout_field');
function my_custom_checkout_field( $checkout ) {
foreach( user_extra_meta_fields() as $name => $label) {
$value = '';
if( is_user_logged_in() )
$value = get_user_meta( get_current_user_id(), $name, true );
woocommerce_form_field( $name, array(
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
'label' => $label,
), $value );
}
}
add_action( 'woocommerce_checkout_process', 'user_fields_woocommerce_checkout_process' );
function user_fields_woocommerce_checkout_process(){
if( is_user_logged_in() )
add_action('woocommerce_checkout_update_user_meta', 'my_custom_checkout_field_update_user_meta' );
else
add_action( 'woocommerce_created_customer', 'my_custom_checkout_field_update_user_meta' );
}
function my_custom_checkout_field_update_user_meta( $user_id ) {
foreach( array_keys( user_extra_meta_fields() ) as $meta_name ){
if( isset( $_POST[$meta_name] ) ){
$meta_value = $_POST[$meta_name] ? esc_attr($_POST[$meta_name]) : '';
update_user_meta( $user_id, $meta_name, $meta_value );
}
}
}
// if want to validate field
add_action( 'woocommerce_after_checkout_validation', 'user_fields_woocommerce_after_checkout_validation' );
function user_fields_woocommerce_after_checkout_validation( $posted ){
$validate = true;
if( ! is_user_logged_in() && empty( $posted['createaccount'] ) )
$validate = false;
if( $validate == false )
return;
$meta_data = user_extra_meta_fields();
foreach( array_keys( $meta_data ) as $meta_name ){
if( empty($_POST[$meta_name]) )
wc_add_notice( sprintf( __(' <strong>%s</strong> is required.', 'yourtext_domain'), $meta_data[$meta_name] ), 'error' );
}
}