2017-04-12 140 views
3

我目前正试图从WooCommerce添加默认的国家搜索到注册页面,而国家的默认列表,可以用下面的代码片段: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:似乎它是与脚本的这部分对于国家选择:

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

不完全知道如何,我敢肯定,这正是添加到注册页面它有话做一个循环允许的国家和什么不是,所以任何帮助将不胜感激!

Edit3:我找到了我的一个侧面问题的答案,我将如何设置默认国家,这可以通过在woocommerce_form_field数组中添加'default'=>'XX'来完成。 XX代表国家代码,因此对于比利时,这将是BE。

先感谢您的详细信息。

TL; DR: enter image description here

结论:问题与HelgaTheVviking和Raunak古普塔,既帮助解决在我的整个注册页面,包括所有的部分(和自定义增值税页面目前全码)如下:

/* ---------------------- 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'])); 
    } 
} 

我感谢大家谁在这个过程中,并与我以前的问题,帮助我的好,我的整个项目几乎就要结束了,所以我真的要感谢#1共同体他们的大力支持!

+0

你跟WooCommerce注册加入一个领域,而结账或WordPress的注册表格本身? –

+0

http://stackoverflow.com/questions/33934028/using-the-woocommerce-api-to-get-the-country-state-lists –

+1

http://stackoverflow.com/questions/34757408/wc-countries-states -selection-下拉-woocommerce –

回答

2

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辅助下拉。

+0

嗨,再次HelgaTheViking!感谢您的回复,但是将类型更改为国家/地区并不会改变外观,恐怕我的主要帖子中的外观仍然像图片左侧一般。这是网页的URL,以免任何形式的帮助:https://uklederwaren.be/my-account/ –

+0

您的网址正在建设中。但我发现你需要排队国家选择脚本。看我的编辑。这对我来说很有用,虽然它可能不是你希望显示该字段的地方。 – helgatheviking

+0

是的,这个网址在我发布后只公开了大约3个小时,因为它仍然是一个不应该公开的网站,我只能在发布后的3小时内打开它,我想提到这个,但是我无法编辑我的帖子了。 这就是说,我确实尝试了你的代码片段悬停,没有工作完全没有任何领域出现。我也考虑过自己排列脚本,但即使在默认标题中添加脚本代码,也没有达到预期效果。 然而,现在接受的JS代码片段的答案确实对我有用。不过,我还是非常感谢你的帮助! –

2

如果你看到WooCommerce结帐页面的HTML源代码,那么你将看到 它使用select2 JS插件。所以,你需要传递一个额外的 ID /类woocommerce_form_field()然后叫JS选择2功能 在页脚。

所以你完整的代码将

//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。

enter image description here

希望这有助于!

+0

非常感谢,这对我有用!我也首先想到,它必须是像我发现的脚本那样排队等待的东西,但那也不起作用。但是你提供的脚本片段直接工作。所以,感谢您的帮助,并且您已经得到了奖励并被标记为有效;) 非常感谢您的协助。 –

+0

@RafaëlDeJongh:我在过去使用过选择框jQuery插件,所以我知道我必须初始化它。顺便说一句,我很高兴它为你工作,作为回报,我还得学习如何定制注册页面。 –

+0

再一次感谢,未来对HelgaTheViking代码的调查确实能够奏效,并且由于它使用了WC的更多内置功能,因此我现在将接受她的回答为有效。但是要知道,你的代码为我的第一个工作,而我在实现其他代码时遇到了一些麻烦。 无论哪种方式,我非常感谢您的帮助和帮助! –