2013-07-23 1 views
3

Я использую WooCommerce с Wordpress и добавил некоторые пользовательские поля в кассу:Обновление меты пользователя после того, как WooCommerce процесса контроля формы

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 и выполнить эту функцию для обновления метаданных пользователя.

+0

Канонический ответ можно найти здесь (http://stackoverflow.com/a/36732816/667903). – Steve

ответ

2

class-wc-checkout.php line 639 создает нового пользователя с $this->customer_id = wp_insert_user(apply_filters('woocommerce_new_customer_data', $new_customer_data)); Новые данные клиента представляют собой массив, указанный выше этой строки.

После этого, вы можете получить доступ к идентификатор пользователя с линией 649 в действии do_action('woocommerce_created_customer', $this->customer_id);

Он unlikey, в вашем случае, вам нужно будет использовать фильтр, а просто добавить действие «woocommerce_created_customer», тянуть в id и добавьте мета.

1

Когда клиент не зарегистрирован на странице проверки, должен быть приемлемым полевым клиентом, который хочет создать новую учетную запись. Изменить код образца кода на странице проверки, когда заказ клиента на новый элемент и обновление пользовательских метаданных.

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

}