如何解决将自定义字段添加到 WooCommerce 新帐户页面
在 WooCommerce 中创建了一个帐户注册页面,如下代码所示:
<?PHP
/**
* Add new register fields for WooCommerce registration.
*/
function wooc_extra_register_fields() {
?>
<?PHP // field ?>
<p class="form-row form-row-first">
<label for="reg_billing_first_name"><?PHP _e( 'First name','woocommerce' ); ?> <span class="required">*</span></label>
<input type="text" class="input-text" name="billing_first_name" id="reg_billing_first_name" value="<?PHP if ( ! empty( $_POST['billing_first_name'] ) ) esc_attr_e( $_POST['billing_first_name'] ); ?>" />
</p>
<?PHP // endfield ?>
<?PHP // field ?>
<p class="form-row form-row-last">
<label for="reg_billing_last_name"><?PHP _e( 'Last name','woocommerce' ); ?> <span class="required">*</span></label>
<input type="text" class="input-text" name="billing_last_name" id="reg_billing_last_name" value="<?PHP if ( ! empty( $_POST['billing_last_name'] ) ) esc_attr_e( $_POST['billing_last_name'] ); ?>" />
</p>
<?PHP // endfield ?>
<div class="clear"></div>
<?PHP // field ?>
<p class="form-row form-row-wide">
<label for="reg_Facebook"><?PHP _e( 'Facebook','woocommerce' ); ?> <span class="required">*</span></label>
<input type="text" class="input-text" name="billing_Facebook" id="reg_Facebook" value="" placeholder="input Facebook url" />
</p>
<?PHP // endfield ?>
<p class="form-row form-row-wide">
<label for="reg_billing_phone"><?PHP _e( 'Phone','woocommerce' ); ?> <span class="required">*</span></label>
<input type="text" class="input-text" name="billing_phone" id="reg_billing_phone" value="<?PHP if ( ! empty( $_POST['billing_phone'] ) ) esc_attr_e( $_POST['billing_phone'] ); ?>" />
</p>
<p class="form-row form-row-wide">
<label for="reg_whatsapp_phone"><?PHP _e( 'whatsapp','woocommerce' ); ?> <span class="required">*</span></label>
<input type="text" class="input-text" name="whatsapp_phone" id="reg_whatsapp_phone" value="" />
</p>
<?PHP
$field = [
'type' => 'country','label' => 'Country','required' => 1,'class' => ['address-field']
];
woocommerce_form_field( 'billing_country',$field,'' );
$field = [
'type' => 'state','label' => 'State','class' => ['address-field'],'validate' => ['state']
];
woocommerce_form_field( 'billing_state','' );
$handle = 'wc-country-select';
wp_enqueue_script($handle,get_site_url().'/wp-content/plugins/woocommerce/assets/js/frontend/country-select.min.js',array('jquery'),true);
?>
<?PHP
}
add_action( 'woocommerce_register_form_start','wooc_extra_register_fields' );
/**
* Save the extra register fields.
*
* @param int $customer_id Current customer ID.
*/
function wooc_save_extra_register_fields( $customer_id ) {
if ( isset( $_POST['billing_first_name'] ) ) {
// wordpress default first name field.
update_user_Meta( $customer_id,'first_name',sanitize_text_field( $_POST['billing_first_name'] ) );
// WooCommerce billing first name.
update_user_Meta( $customer_id,'billing_first_name',sanitize_text_field( $_POST['billing_first_name'] ) );
}
if ( isset( $_POST['billing_last_name'] ) ) {
// wordpress default last name field.
update_user_Meta( $customer_id,'last_name',sanitize_text_field( $_POST['billing_last_name'] ) );
// WooCommerce billing last name.
update_user_Meta( $customer_id,'billing_last_name',sanitize_text_field( $_POST['billing_last_name'] ) );
}
if ( isset( $_POST['billing_phone'] ) ) {
// WooCommerce billing phone
update_user_Meta( $customer_id,'billing_phone',sanitize_text_field( $_POST['billing_phone'] ) );
}
//
if ( isset( $_POST['billing_country'] ) ) {
// WooCommerce billing country
update_user_Meta( $customer_id,'billing_country',sanitize_text_field( $_POST['billing_country'] ) );
}
if ( isset( $_POST['billing_state'] ) ) {
// WooCommerce billing_state
update_user_Meta( $customer_id,'billing_state',sanitize_text_field( $_POST['billing_state'] ) );
}
update_user_Meta( $customer_id,'billing_Facebook',sanitize_text_field( $_POST['billing_Facebook'] ) );
}
add_action( 'woocommerce_created_customer','wooc_save_extra_register_fields' );
但我无法将新字段(例如(Facebook 和 WhatsApp 帐户)保存到会员的 (users.PHP) 帐户页面,我希望它们显示为订单注册页面上的字段(作为结帐字段) )。 怎么解决?
如何在数据库和字段中保存自定义woocommerce字段,并将其作为字段放在结帐页面中?
解决方法
以下将优化和压缩您的代码,添加字段验证并允许将所有字段值保存为用户元数据:
// Custom function with all extra field data arrays
function extra_register_fields() {
$text_domain = 'woocommerce';
return array(
'first_name' => array('type' => 'text','class' => ['form-row-first'],'required' => 1,'label' => __('First name',$text_domain) ),'last_name' => array('type' => 'text','class' => ['form-row-last'],'label' => __('Last name','phone' => array('type' => 'tel','class' => ['form-row-wide'],'label' => __( 'Phone',$text_domain ) ),'facebook' => array('type' => 'text','label' => __( 'Facebook ','whatsapp' => array('type' => 'text','label' => __( 'WhatsApp','country' => array('type' => 'country','class' => ['address-field'],'label' => __( 'Country','state' => array('type' => 'state','label' => __( 'State',);
}
// Add extra register fields
add_action( 'woocommerce_register_form_start','wooc_extra_register_fields' );
function wooc_extra_register_fields() {
foreach ( extra_register_fields() as $fkey => $values ) {
if( $fkey === 'phone' ) $values['clear'] = 1;
if( $fkey === 'state' ) $values['validate'] = ['state'];
$value = isset($_POST['billing_'.$fkey]) ? esc_attr($_POST['billing_'.$fkey]) : '';
woocommerce_form_field( 'billing_'.$fkey,$values,$value );
}
wp_enqueue_script('wc-country-select',get_site_url().'/wp-content/plugins/woocommerce/assets/js/frontend/country-select.min.js',array('jquery'),true);
}
// Extra register fields validation
add_action( 'woocommerce_register_post','wc_validate_reg_form_fields',10,3 );
function wc_validate_reg_form_fields( $username,$email,$validation_errors ) {
foreach ( extra_register_fields() as $fkey => $values ) {
if (isset($_POST['billing_'.$fkey]) && empty($_POST['billing_'.$fkey]) && $values['required'] ) {
$validation_errors->add( 'extra_fields',sprintf('%s is a required field',$values['label']) );
}
}
return $validation_errors;
}
// Save extra register fields values
add_action( 'woocommerce_created_customer','wooc_save_extra_register_fields' );
function wooc_save_extra_register_fields( $customer_id ) {
foreach( extra_register_fields() as $fkey => $values ) {
if ( isset($_POST['billing_'.$fkey]) ) {
$value = in_array($fkey,['country','state']) ? sanitize_text_field($_POST['billing_'.$fkey]) : esc_attr($_POST['billing_'.$fkey]);
update_user_meta( $customer_id,'billing_'.$fkey,$value );
if ( in_array($fkey,['first_name','last_name']) )
update_user_meta( $customer_id,$fkey,$value );
}
}
}
代码位于活动子主题(或活动主题)的functions.php 文件中。经测试有效。
要在我的帐户编辑帐单地址中显示“Facebook”和“WhatsApp”字段,请使用以下内容:
// Display Facebook and WhatsApp fields in My account eddit billing address
add_filter( 'woocommerce_billing_fields','additional_billing_fields',20,1 );
function additional_billing_fields($billing_fields) {
if ( is_wc_endpoint_url( 'edit-address' ) ) {
foreach ( extra_register_fields() as $fkey => $values ) {
if ( in_array($fkey,['facebook','whatsapp']) ) {
$billing_fields['billing_'.$fkey] = $values;
}
}
}
return $billing_fields;
}
要将“Facebook”和“WhatsApp”字段添加到管理员用户计费部分,请使用以下内容:
// WordPress User: Add Facebook and WhatsApp fields to billing section
add_filter('woocommerce_customer_meta_fields','wordpress_user_account_billing_birthdate_field');
function wordpress_user_account_billing_birthdate_field( $fields ) {
foreach ( extra_register_fields() as $fkey => $values ) {
if ( in_array($fkey,'whatsapp']) ) {
$fields['billing']['fields']['billing_'.$fkey] = array(
'label' => $values['label'],'description' => ''
);
}
}
return $fields;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。