簡體   English   中英

注冊時WooCommerce國家選擇

[英]WooCommerce Country Selection on Registration

我目前正在嘗試將來自WooCommerce的默認國家/地區搜索者添加到注冊頁面,而使用以下代碼段可以使用默認的國家/地區列表:

<?php
$countries_obj  = new WC_Countries();
$countries      = $countries_obj->get_allowed_countries();
woocommerce_form_field('billing_country',array(
'type'      => 'select',
'class'     => array('chzn-drop'),
'label'     => __('Country'),
'placeholder' => __('Choose your country.'),
'options'   => $countries,
'required'  => true,
'clear'     => true
));
?>

它當然與原始國家從WooCommerce中選擇的不一樣,所以我想知道是否有人知道將這個國家選擇字段添加到注冊頁面的正確方法。

編輯:如果我理解正確,你需要加載一個JavaScript庫以使下拉列表正常工作,如何有人將這個加載到注冊頁面上以及如何將默認國家/地區設置為“比利時”?

Edit2:似乎它與Country Selector的這部分腳本有關:

<script type='text/javascript' src='//uklederwaren.be/wp-content/plugins/woocommerce/assets/js/frontend/country-select.min.js?ver=2.6.14'></script>

不完全確定如何將此確切地添加到注冊頁面,因為我確定它與允許的國家/地區的循環有關,所以任何幫助將不勝感激!

編輯3:我找到了我的一個問題的答案,我可以如何設置默認國家/地區,這可以通過在woocommerce_form_field數組中添加'default'=>'XX'來完成。 XX代表國家代碼,因此對比利時而言,這將是BE。

提前感謝您提供更多信息。

TL; DR: 在此輸入圖像描述

結論:在HelgaTheVviking和Raunak Gupta的幫助下解決了這個問題,我現在的整個注冊頁面的完整代碼包括所有部分(以及自定義增值頁面)如下:

/* ---------------------- Registration page ----------------------- */
//Add extra fields in registration form
add_action('woocommerce_register_form_start','my_extra_register_fields');
function my_extra_register_fields(){
?>
    <p class="woocommerce-FormRow 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>
    <p class="woocommerce-FormRow 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>
    <div class="clearfix"></div>
    <p class="woocommerce-FormRow woocommerce-FormRow--wide form-row form-row-wide">
        <label for="reg_billing_company"><?php _e('Company Name','woocommerce'); ?><span class="required">*</span></label>
        <input type="text" class="input-text" name="billing_company" id="reg_billing_company" value="<?php if(! empty($_POST['billing_company'])) esc_attr_e($_POST['billing_company']); ?>"/>
    </p>
    <div class="clearfix"></div>
    <p class="woocommerce-FormRow woocommerce-FormRow--wide form-row form-row-wide">
        <label for="reg_billing_vat"><?php _e('VAT Number','woocommerce'); ?><span class="required">*</span></label>
        <input type="text" class="input-text" name="billing_vat" id="reg_billing_vat" value="<?php if(! empty($_POST['billing_vat'])) esc_attr_e($_POST['billing_vat']); ?>" maxlength="15" placeholder="Enter VAT Number"/>
    </p>
    <div class="clearfix"></div>
<?php
    wp_enqueue_script('wc-country-select');
    woocommerce_form_field('billing_country',array(
        'type'        => 'country',
        'class'       => array('chzn-drop'),
        'label'       => __('Country'),
        'placeholder' => __('Choose your country.'),
        'required'    => true,
        'clear'       => true,
        'default'     => 'BE'
    ));
?>
    <p class="woocommerce-FormRow form-row form-row-first">
        <label for="reg_billing_postcode"><?php _e('Postcode / ZIP','woocommerce'); ?><span class="required">*</span></label>
        <input type="text" class="input-text" name="billing_postcode" id="reg_billing_postcode" value="<?php if(! empty($_POST['billing_postcode'])) esc_attr_e($_POST['billing_postcode']); ?>"/>
    </p>
    <p class="woocommerce-FormRow form-row form-row-last">
        <label for="reg_billing_city"><?php _e('Town / City','woocommerce'); ?><span class="required">*</span></label>
        <input type="text" class="input-text" name="billing_city" id="reg_billing_city" value="<?php if(! empty($_POST['billing_city'])) esc_attr_e($_POST['billing_city']); ?>"/>
    </p>
    <div class="clearfix"></div>
    <p class="woocommerce-FormRow woocommerce-FormRow--wide form-row form-row-wide">
        <label for="reg_billing_address_1"><?php _e('Address','woocommerce'); ?><span class="required">*</span></label>
        <input type="text" class="input-text" name="billing_address_1" id="reg_billing_address_1" value="<?php if(! empty($_POST['billing_address_1'])) esc_attr_e($_POST['billing_address_1']); ?>" placeholder="Street address"/>
    </p>
    <p class="woocommerce-FormRow woocommerce-FormRow--wide form-row form-row-wide">
        <input type="text" class="input-text" name="billing_address_2" id="reg_billing_address_2" value="<?php if(! empty($_POST['billing_address_2'])) esc_attr_e($_POST['billing_address_2']); ?>" placeholder="Apartment,suite,unit etc. (optional)"/>
    </p>
    <div class="clearfix"></div>
    <p class="woocommerce-FormRow woocommerce-FormRow--wide 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>
    <div class="clearfix"></div>
<?php
}
//Registration form fields Validation
add_action('woocommerce_register_post','my_validate_extra_register_fields',10,3);
function my_validate_extra_register_fields($username,$email,$validation_errors){
    if(isset($_POST['billing_first_name']) && empty($_POST['billing_first_name'])){$validation_errors->add('billing_first_name_error',__('A first name is required!','woocommerce'));}
    if(isset($_POST['billing_last_name']) && empty($_POST['billing_last_name'])){$validation_errors->add('billing_last_name_error',__('A last name is required!','woocommerce'));}
    if(isset($_POST['billing_company']) && empty($_POST['billing_company'])){$validation_errors->add('billing_company_error',__('A Company name is required!','woocommerce'));}
    if(isset($_POST['billing_vat']) && empty($_POST['billing_vat'])){$validation_errors->add('billing_vat_error',__('VAT number is required!','woocommerce'));}
    if(isset($_POST['billing_country']) && empty($_POST['billing_country'])){$validation_errors->add('billing_country_error',__('A country is required!','woocommerce'));}
    if(isset($_POST['billing_city']) && empty($_POST['billing_city'])){$validation_errors->add('billing_city_error',__('A city is required!','woocommerce'));}
    if(isset($_POST['billing_postcode']) && empty($_POST['billing_postcode'])){$validation_errors->add('billing_postcode_error',__('A postcode is required!','woocommerce'));}
    if(isset($_POST['billing_state']) && empty($_POST['billing_state'])){$validation_errors->add('billing_state_error',__('A state is required!','woocommerce'));}
    if(isset($_POST['billing_address_1']) && empty($_POST['billing_address_1'])){$validation_errors->add('billing_address_1_error',__('An address is required!','woocommerce'));}
    if(isset($_POST['billing_phone']) && empty($_POST['billing_phone'])){$validation_errors->add('billing_phone_error',__('A phone number is required!','woocommerce'));}
    return $validation_errors;
}
//Below code save extra fields when new user register
add_action('woocommerce_created_customer','my_save_extra_register_fields'); 
function my_save_extra_register_fields($customer_id){
    if(isset($_POST['billing_first_name'])){
        update_user_meta($customer_id,'first_name',sanitize_text_field($_POST['billing_first_name']));
        update_user_meta($customer_id,'billing_first_name',sanitize_text_field($_POST['billing_first_name']));
    }
    if(isset($_POST['billing_last_name'])){
        update_user_meta($customer_id,'last_name',sanitize_text_field($_POST['billing_last_name']));
        update_user_meta($customer_id,'billing_last_name',sanitize_text_field($_POST['billing_last_name']));
    }
    if(isset($_POST['billing_company'])){
        update_user_meta($customer_id,'billing_company',sanitize_text_field($_POST['billing_company']));
    }
    if(isset($_POST['billing_vat'])){
        update_user_meta($customer_id,'billing_vat',sanitize_text_field($_POST['billing_vat']));
    }
    if(isset($_POST['billing_country'])){
        update_user_meta($customer_id,'billing_country',sanitize_text_field($_POST['billing_country']));
    }
    if(isset($_POST['billing_city'])){
        update_user_meta($customer_id,'billing_city',sanitize_text_field($_POST['billing_city']));
    }
    if(isset($_POST['billing_postcode'])){
        update_user_meta($customer_id,'billing_postcode',sanitize_text_field($_POST['billing_postcode']));
    }
    if(isset($_POST['billing_state'])){
        update_user_meta($customer_id,'billing_state',sanitize_text_field($_POST['billing_state']));
    }
    if(isset($_POST['billing_address_1'])){
        update_user_meta($customer_id,'billing_address_1',sanitize_text_field($_POST['billing_address_1']));
    }
    if(isset($_POST['billing_phone'])){
        update_user_meta($customer_id,'billing_phone',sanitize_text_field($_POST['billing_phone']));
    }
    if(isset($_POST['email'])){
        update_user_meta($customer_id,'billing_email',sanitize_text_field($_POST['email']));
    }
}

我感謝在此過程中幫助我的所有人以及我以前的問題,我的整個項目幾乎即將結束,所以我真的要感謝Stackoverflow社區的大力支持!

woocommerce_form_field()函數支持country類型,因此我認為這可行:

/**
 * Add new register fields for WooCommerce registration.
 */
function wooc_extra_register_fields() {

    wp_enqueue_script( 'wc-country-select' );

    woocommerce_form_field( 'billing_country', array(
        'type'      => 'country',
        'class'     => array('chzn-drop'),
        'label'     => __('Country'),
        'placeholder' => __('Choose your country.'),
        'required'  => true,
        'clear'     => true
    ));

}
add_action( 'woocommerce_register_form_start', 'wooc_extra_register_fields' );

編輯您需要將國家/地區選擇腳本排入隊列以獲取JS輔助下拉列表。

如果您看到WooCommerce Checkout頁面的源HTML,那么您將看到它使用select2 JS插件。 所以你需要在woocommerce_form_field()傳遞額外的ID /類,然后在頁腳中調用select2 JS函數。

所以你的完整代碼就是

//to add billing_country
function wh_extra_register_fields()
{
    $countries_obj = new WC_Countries();
    $countries = $countries_obj->get_allowed_countries();
    woocommerce_form_field('billing_country', array(
        'type' => 'select',
        'input_class' => array('myClass'), //<--check this line
        'label' => __('Country'),
        'placeholder' => __('Choose your country.'),
        'options' => $countries,
        'required' => true,
        'clear' => true,
        'default' => 'BE' //<--check this line
    ));
}

add_action('woocommerce_register_form_start', 'wh_extra_register_fields');

//to add js code in My Account page footer
function wh_AccountPageJS()
{
    if (is_account_page())
    {
        echo '<script>jQuery(".myClass").select2();</script>';
    }
}

add_action('wp_footer', 'wh_AccountPageJS', 100);

代碼位於活動子主題(或主題)的functions.php文件中。 或者也可以在任何插件php文件中。
代碼經過測試和運行。 3.0版。

在此輸入圖像描述

希望這可以幫助!

在模板/函數中添加:

<?php
$field = [
        'type' => 'country',
        'label' => 'Country',
        'required' => 1,
        'class' => ['address-field']
];
woocommerce_form_field( 'billing_country', $field, '' );
$field = [
    'type' => 'state',
    'label' => 'State',
    'required' => 1,
    'class' => ['address-field'],
    'validate' => ['state']
];
woocommerce_form_field( 'billing_state', $field, '' );
?>

在頁面中包含woocommerce country-select.js,其格式為:

<?php
    $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);
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM