如何使用先前输入的值填充自定义结帐字段,例如默认的 WooCommerce 结帐字段?
How to fill custom checkout field with previously entered value, like default WooCommerce checkout fields?
我使用以下代码添加了自定义字段:
add_action( 'woocommerce_before_order_notes', 'bbloomer_add_custom_checkout_field' );
function bbloomer_add_custom_checkout_field( $checkout ) {
$current_user = wp_get_current_user();
$saved_gst_no = $current_user->gst_no;
woocommerce_form_field( 'gst_no', array(
'type' => 'text',
'class' => array( 'form-row-wide' ),
'label' => 'GST Number',
'placeholder' => 'GST Number',
'required' => true
//'default' => $saved_gst_no,
), $checkout->get_value( 'gst_no' ) );
}
在 GST 编号字段 (自定义结帐字段) 中输入任何值,然后通过单击“下订单”按钮进入付款屏幕并返回结帐页面而不完成交易,所有默认的 woocommerce 字段,如账单 phone、电子邮件等都是从会话中自动填充的。
但是,通过上述代码添加的自定义字段始终为空。如何让来宾用户在自定义字段中自动填充先前输入的值,类似于自动填充默认 woocommerce 字段的方式?
已更新 (在第一个函数中用 get()
替换了错误的 WC_Session
方法 set()
)
这也适用于来宾用户。将您的代码替换为:
// Display checkout custom field
add_action( 'woocommerce_before_order_notes', 'add_custom_checkout_field' );
function add_custom_checkout_field( $checkout ) {
$key_field = 'gst_no';
woocommerce_form_field( $key_field, array(
'type' => 'text',
'class' => array( 'form-row-wide' ),
'label' => __('GST Number'),
'placeholder' => __('GST Number'),
'required' => true
//'default' => $saved_gst_no,
), $checkout->get_value($key_field) ? $checkout->get_value($key_field) : WC()->session->get($key_field) );
}
// Save checkout custom field value in a WC_Session variable
add_action( 'woocommerce_checkout_create_order', 'action_checkout_create_order', 10, 2 );
function action_checkout_create_order( $order, $data ) {
$key_field = 'gst_no';
if( isset($_POST[$key_field]) ) {
WC()->session->set($key_field, sanitize_text_field($_POST[$key_field]));
}
}
// Save checkout custom field value as user meta data
add_action( 'woocommerce_checkout_update_customer', 'action_checkout_update_customer', 10, 2 );
function action_checkout_update_customer( $customer, $data ) {
$key_field = $key_field;
if( isset($_POST['gst_no']) ) {
$customer->update_meta_data($key_field, sanitize_text_field($_POST[$key_field]));
}
}
注意:使用WC_Session变量存储客人提交的值,允许在未完成交易返回时在结账时显示。
根据我的经验,当通过 update_order_review
路径更新字段时,WooCommerce 通过 AJAX 将表单数据保存在会话变量中。为了连接到它并存储我的自定义变量,我使用了以下内容:
add_action('woocommerce_checkout_update_order_review', 'custom_woocommerce_checkout_update_order_review');
function custom_woocommerce_checkout_update_order_review($post_data){
// Convert $post_data string to array and clean it
$post_arr = array();
parse_str($post_data, $post_arr);
wc_clean($post_arr);
if(isset($post_arr['gst_no'])) {
WC()->session->set('gst_no', $post_arr['gst_no']);
}
}
还有一种更深入的方式来添加自定义结帐字段,以便它在传递给 woocommerce_checkout_update_order_meta
的 $data 中可用:
add_filter('woocommerce_checkout_fields', 'custom_checkout_fields');
function custom_checkout_fields($fields){
$fields['gst_no'] = array(
'type' => 'text',
'default' => WC()->session->get('gst_no')
);
return $fields;
}
我使用以下代码添加了自定义字段:
add_action( 'woocommerce_before_order_notes', 'bbloomer_add_custom_checkout_field' );
function bbloomer_add_custom_checkout_field( $checkout ) {
$current_user = wp_get_current_user();
$saved_gst_no = $current_user->gst_no;
woocommerce_form_field( 'gst_no', array(
'type' => 'text',
'class' => array( 'form-row-wide' ),
'label' => 'GST Number',
'placeholder' => 'GST Number',
'required' => true
//'default' => $saved_gst_no,
), $checkout->get_value( 'gst_no' ) );
}
在 GST 编号字段 (自定义结帐字段) 中输入任何值,然后通过单击“下订单”按钮进入付款屏幕并返回结帐页面而不完成交易,所有默认的 woocommerce 字段,如账单 phone、电子邮件等都是从会话中自动填充的。
但是,通过上述代码添加的自定义字段始终为空。如何让来宾用户在自定义字段中自动填充先前输入的值,类似于自动填充默认 woocommerce 字段的方式?
已更新 (在第一个函数中用 get()
替换了错误的 WC_Session
方法 set()
)
这也适用于来宾用户。将您的代码替换为:
// Display checkout custom field
add_action( 'woocommerce_before_order_notes', 'add_custom_checkout_field' );
function add_custom_checkout_field( $checkout ) {
$key_field = 'gst_no';
woocommerce_form_field( $key_field, array(
'type' => 'text',
'class' => array( 'form-row-wide' ),
'label' => __('GST Number'),
'placeholder' => __('GST Number'),
'required' => true
//'default' => $saved_gst_no,
), $checkout->get_value($key_field) ? $checkout->get_value($key_field) : WC()->session->get($key_field) );
}
// Save checkout custom field value in a WC_Session variable
add_action( 'woocommerce_checkout_create_order', 'action_checkout_create_order', 10, 2 );
function action_checkout_create_order( $order, $data ) {
$key_field = 'gst_no';
if( isset($_POST[$key_field]) ) {
WC()->session->set($key_field, sanitize_text_field($_POST[$key_field]));
}
}
// Save checkout custom field value as user meta data
add_action( 'woocommerce_checkout_update_customer', 'action_checkout_update_customer', 10, 2 );
function action_checkout_update_customer( $customer, $data ) {
$key_field = $key_field;
if( isset($_POST['gst_no']) ) {
$customer->update_meta_data($key_field, sanitize_text_field($_POST[$key_field]));
}
}
注意:使用WC_Session变量存储客人提交的值,允许在未完成交易返回时在结账时显示。
根据我的经验,当通过 update_order_review
路径更新字段时,WooCommerce 通过 AJAX 将表单数据保存在会话变量中。为了连接到它并存储我的自定义变量,我使用了以下内容:
add_action('woocommerce_checkout_update_order_review', 'custom_woocommerce_checkout_update_order_review');
function custom_woocommerce_checkout_update_order_review($post_data){
// Convert $post_data string to array and clean it
$post_arr = array();
parse_str($post_data, $post_arr);
wc_clean($post_arr);
if(isset($post_arr['gst_no'])) {
WC()->session->set('gst_no', $post_arr['gst_no']);
}
}
还有一种更深入的方式来添加自定义结帐字段,以便它在传递给 woocommerce_checkout_update_order_meta
的 $data 中可用:
add_filter('woocommerce_checkout_fields', 'custom_checkout_fields');
function custom_checkout_fields($fields){
$fields['gst_no'] = array(
'type' => 'text',
'default' => WC()->session->get('gst_no')
);
return $fields;
}