Aktualisieren Sie das Benutzer-Meta nach dem WooCommerce-Checkout-Formularprozess

Lesezeit: 4 Minuten

Benutzer-Avatar
Benutzer2610975

Ich verwende WooCommerce mit WordPress und habe dem Checkout einige benutzerdefinierte Felder hinzugefügt:

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

      }
}

Jetzt erscheinen diese derzeit in der Kasse in Ordnung, nicht sicher, ob sie verwendet werden woocommerce_after_order_notes hat in diesem fall recht. Ich habe auch einige benutzerdefinierte Felder zum Benutzer-Meta hinzugefügt, die den Feldern entsprechen, die der Kasse hinzugefügt wurden – die alle auf der Benutzerprofilseite angezeigt werden:

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

Wie Sie sich vorstellen können, funktioniert es gut, wenn ich eines dieser Felder auf einer beliebigen Profilseite aktualisiere, aber was ich anscheinend nicht tun kann, ist, das Benutzer-Meta zu aktualisieren, wenn ein neuer Benutzer einen Kauf tätigt, es aktualisiert nicht das Benutzer-Meta für diese Felder in der Datenbank.

Ich verstehe viel darüber, wie das funktioniert, und verstehe, dass ich mich in einen Woocommerce-Prozess einklinken muss, um die Felder in den Prozess einzufügen. Also habe ich diesen Code auch in meine Funktionen eingefügt:

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

Der Haken an der Sache ist, dass dies funktioniert, wenn ein Benutzer, der bereits als Mitglied angemeldet ist, einen erneuten Kauf tätigt und durch die Kasse geht – der Grund, warum dies funktioniert, ist, weil $user_id existiert bereits, aber wenn ein neuer Benutzer auscheckt, existiert er noch nicht als Benutzer, daher kann die Funktion das Benutzer-Meta von nicht aktualisieren NIL wo $user_id ist nicht vorhanden.

Meine Frage ist, wie ich mich in den Checkout-Prozess einklinke, vermutlich NACHDEM der Benutzer angelegt wurde, damit ich das bekommen kann $user_id zurückgegeben, und führen Sie diese Funktion aus, um das Benutzer-Meta zu aktualisieren.

  • Eine kanonische Antwort finden Sie hier.

    – Steve

    24. April 2016 um 11:41 Uhr

class-wc-checkout.php Zeile 639 erstellt den neuen Benutzer mit $this->customer_id = wp_insert_user( apply_filters( 'woocommerce_new_customer_data', $new_customer_data ) ); Die neuen Kundendaten sind ein Array, das direkt über dieser Zeile aufgeführt ist.

Anschließend können Sie mit der Aktion in Zeile 649 auf die Benutzer-ID zugreifen do_action( 'woocommerce_created_customer', $this->customer_id );

Es ist unwahrscheinlich, dass Sie in Ihrem Fall den Filter verwenden müssen, aber fügen Sie einfach die Aktion „woocommerce_created_customer“ hinzu, ziehen Sie die ID ein und fügen Sie das Meta hinzu.

Wenn der Kunde nicht eingeloggt ist, sollte die Checkout-Seite ein akzeptables Feld sein, in dem der Kunde ein neues Konto erstellen möchte. Nachfolgend wird der Beispielcode auf der Checkout-Seite geändert, wenn der Kunde einen neuen Artikel bestellt und die Metadaten des Benutzers aktualisiert.

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

} 

1055030cookie-checkAktualisieren Sie das Benutzer-Meta nach dem WooCommerce-Checkout-Formularprozess

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy