2016-04-18 9 views
2

Ich habe erstellt die folgenden benutzerdefinierten Felder für den Anwender Meta mit dem PODS.io Wordpress-Plugin speichern:Wie WooCommerce Kasse benutzerdefinierte Felder Benutzer meta

  • DATE_OF_BIRTH
  • emergency_contact_name
  • Beziehung
  • emergency_phone

Ich habe diese Felder zum WooCommerce Checkout hinzugefügt, unter zusätzliche Informationen, durch mein Thema ist mit dem folgenden Code in functions.php:

add_action('woocommerce_after_order_notes', 'my_custom_checkout_field'); 

function my_custom_checkout_field($checkout) { 

    woocommerce_form_field('date_of_birth', array(
     'type'   => 'text', 
     'class'   => array('my-field-class form-row-wide'), 
     'label'   => __('Date of Birth'), 
     'placeholder' => __('dd/mm/yyyy'), 
     ), $checkout->get_value('date_of_birth')); 

    woocommerce_form_field('emergency_contact_name', array(
     'type'   => 'text', 
     'class'   => array('my-field-class form-row-wide'), 
     'label'   => __('Emergency Contact Name'), 
     'placeholder' => __('contact name'), 
     ), $checkout->get_value('emergency_contact_name')); 

    woocommerce_form_field('relation', array(
     'type'   => 'text', 
     'class'   => array('my-field-class form-row-wide'), 
     'label'   => __('Emergency Relation'), 
     'placeholder' => __('wife/husband'), 
     ), $checkout->get_value('relation')); 

    woocommerce_form_field('emergency_phone', array(
     'type'   => 'text', 
     'class'   => array('my-field-class form-row-wide'), 
     'label'   => __('Emergency Phone'), 
     'placeholder' => __('xxxx xxx xxx/xxxx xxxx'), 
     ), $checkout->get_value('emergency_phone')); 

} 

Fehlerprüfung:

add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process'); 

function my_custom_checkout_field_process() { 
    // Check if set, if its not set add an error. 
    if (! $_POST['date_of_birth']) 
     wc_add_notice(__('Please enter your date of birth'), 'error'); 
    if (! $_POST['emergency_contact_name']) 
     wc_add_notice(__('Please enter your Emergency Contact Name'), 'error');  
    if (! $_POST['relation']) 
     wc_add_notice(__('Please enter how your Emergency Contact is related to you'), 'error'); 
    if (! $_POST['emergency_phone']) 
     wc_add_notice(__('Please enter the phone number of your Emergency Contact'), 'error');    
} 

(hoffentlich) aktualisieren, um den Benutzer meta auf der Kasse:

add_action('woocommerce_checkout_update_user_meta', 'my_custom_checkout_field_update_user_meta'); 

function my_custom_checkout_field_update_order_meta($order_id) { 
    if (!empty($_POST['date_of_birth'])) { 
     $dob = sanitize_text_field($_POST['date_of_birth']); 
     update_user_meta($current_user->ID, 'date_of_birth', $dob); 
    } 
    if (! empty($_POST['emergency_contact_name'])) { 
     update_user_meta($user_id, 'emergency_contact_name', sanitize_text_field($_POST['emergency_contact_name'])); 
    } 
    if (! empty($_POST['relation'])) { 
     update_user_meta($user_id, 'relation', sanitize_text_field($_POST['relation'])); 
    } 
    if (! empty($_POST['emergency_phone'])) { 
     update_user_meta($user_id, 'emergency_phone', sanitize_text_field($_POST['emergency_phone'])); 
    }   
} 

Leider Die benutzerdefinierten Benutzermetadatenfelder werden beim Auschecken nicht aktualisiert.

kann ich die um meta benutzerdefinierten Felder mit dem folgenden Code aktualisieren:

add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta'); 

function my_custom_checkout_field_update_order_meta($order_id) { 
    if (! empty($_POST['date_of_birth'])) { 
     update_post_meta($order_id, 'Date Of Birth', sanitize_text_field($_POST['date_of_birth'])); 
    } 
    if (! empty($_POST['emergency_contact_name'])) { 
     update_post_meta($order_id, 'Emergency Contact Name', sanitize_text_field($_POST['emergency_contact_name'])); 
    } 
    if (! empty($_POST['relation'])) { 
     update_post_meta($order_id, 'Emergency Relation', sanitize_text_field($_POST['relation'])); 
    } 
    if (! empty($_POST['emergency_phone'])) { 
     update_post_meta($order_id, 'Emergency Phone', sanitize_text_field($_POST['emergency_phone'])); 
    }   
} 

Allerdings müssen wir die benutzerdefinierten Felder in dem Benutzer meta, nicht die Reihenfolge Meta.

Können Sie sehen, was mit dem Code falsch ist, der benutzerdefinierte Felder beim Auschecken an den Benutzer Meta speichert?

Danke. (Verwendung woocommerce_checkout_fields Filter)

function reigel_woocommerce_checkout_fields($checkout_fields = array()) { 

    $checkout_fields['order']['date_of_birth'] = array(
     'type'   => 'text', 
     'class'   => array('my-field-class form-row-wide'), 
     'label'   => __('Date of Birth'), 
     'placeholder' => __('dd/mm/yyyy'), 
     'required'  => true, 
     ); 

    return $checkout_fields; 
} 
add_filter('woocommerce_checkout_fields', 'reigel_woocommerce_checkout_fields'); 

Hinzufügen 'required' und wenn er zu true haben den gleichen Effekt mit, wie Sie überprüfen, ob dieses Feld gesetzt ist oder nicht:

+0

$ userid ist in Ihrem Beispiel nicht definiert – David

Antwort

6

erste, sollten Sie Ihre benutzerdefinierte Felder wie folgt hinzufügen . (Ihre "Fehlerprüfung")

dann in Ihrem woocommerce_checkout_update_user_meta, der erste Parameter ist nicht $order_id, sondern der $customer_id. Sie sollten auch wissen, dass der zweite Parameter $posted ist. $posted enthält die $_POST[] Daten. Einschließlich Ihrer benutzerdefinierten Felder, wenn Sie den obigen Code gemacht haben.

function reigel_woocommerce_checkout_update_user_meta($customer_id, $posted) { 
    if (isset($posted['date_of_birth'])) { 
     $dob = sanitize_text_field($posted['date_of_birth']); 
     update_user_meta($customer_id, 'date_of_birth', $dob); 
    } 
} 
add_action('woocommerce_checkout_update_user_meta', 'reigel_woocommerce_checkout_update_user_meta', 10, 2); 
+0

Das ist genau das, was ich brauchte Reigel. Der Code funktioniert wie ein Zauber. – Steve

+0

Reigel, ich habe eine ähnliche Frage gestellt [hier] (http://stackoverflow.com/questions/36719372/save-woocommerce-order-product-name-to-user-meta-custom-field). – Steve

Verwandte Themen