woocommerce_checkout_update_order_meta Aktion funktioniert nicht

Lesezeit: 6 Minuten

Hallo, heute habe ich mit Woo-Commerce gearbeitet und einige benutzerdefinierte Checkout-Felder gemäß den Benutzeranforderungen erfolgreich erstellt, aber ich kann sie nicht in der Datenbank speichern.

Hier, wie ich benutzerdefinierte Checkout-Felder erstellt habe … es befindet sich im untergeordneten Thema functions.php

add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
// Over Ridding, Removing, Creating New Fields.
function custom_override_checkout_fields( $fields ) {
     unset($fields['billing']['billing_company']);
     unset($fields['billing']['billing_address_2']);    
     unset($fields['order']['order_comments']);
     unset($fields['billing']['billing_address_1']);
     unset($fields['billing']['billing_city']);
     unset($fields['billing']['billing_postcode']);
     unset($fields['billing']['billing_email']);


     $fields['billing']['your_name'] = array(
    'type'      => 'text',
    'label'     => __('Full Name', 'woocommerce'),
    'placeholder'   => _x('Full Name', 'placeholder', 'woocommerce'),
    'required'  => false,
    'class'     => array('form-row-wide'),
    'clear'     => true
     );

     $fields['billing']['your_phone_number'] = array(
    'type'      => 'text',
    'label'     => __('Your Phone Number', 'woocommerce'),
    'placeholder'   => _x('Your Phone Number', 'placeholder', 'woocommerce'),
    'required'  => false,
    'class'     => array('form-row-wide'),
    'clear'     => true
     );

     $fields['billing']['recipient_name'] = array(
    'type'      => 'text',
    'label'     => __("Recipient's Name", 'woocommerce'),
    'placeholder'   => _x("Recipient's Name", 'placeholder', 'woocommerce'),
    'required'  => false,
    'class'     => array('form-row-wide'),
    'clear'     => true
     );

     $fields['billing']['recipient_company_name'] = array(
    'type'      => 'text',
    'label'     => __("Recipient's Company (if any)", 'woocommerce'),
    'placeholder'   => _x("Recipient's Company (if any)", 'placeholder', 'woocommerce'),
    'required'  => false,
    'class'     => array('form-row-wide'),
    'clear'     => true
     );

     $fields['billing']['recipient_phone_number'] = array(
    'type'      => 'text',
    'label'     => __("Recipient's Phone Number", 'woocommerce'),
    'placeholder'   => _x("Recipient's Phone Number", 'placeholder', 'woocommerce'),
    'required'  => false,
    'class'     => array('form-row-wide'),
    'clear'     => true
     );

     $fields['billing']['recipient_address'] = array(
    'type'      => 'text',
    'label'     => __("Recipient's Address", 'woocommerce'),
    'placeholder'   => _x("Recipient's Address", 'placeholder', 'woocommerce'),
    'required'  => false,
    'class'     => array('form-row-wide'),
    'clear'     => true
     );

     return $fields;
}

In db, wo ich nach den Feldern suche. es ist wp_postmeta Tisch. Im Anhang ist ein Screenshot, den ich mit der Bestell-ID suche.
wp_postmeta db-Tabelle

Jetzt habe ich die hinzugefügt checkout_update_order_meta Aktion, um das Bestellmeta zu aktualisieren und meine benutzerdefinierten Felder zu speichern. Aber es scheint, als ob es nicht funktioniert, denn wenn ich einchecke wp_postmeta Tabelle mit der zuletzt erstellten Auftrags-ID. Ich finde meine benutzerdefinierten Felder dort nicht.

add_action( 'woocommerce_checkout_update_order_meta', 'some_custom_checkout_field_update_order_meta' );

function some_custom_checkout_field_update_order_meta( $order_id ) {


if ( ! empty( $_POST['recipient_address'] ) ) {
add_post_meta( $order_id, 'recipient_address', sanitize_text_field( $_POST['recipient_address'] ) );
}
if (!empty($_POST['recipient_phone_number'])) {
        update_post_meta($order_id, 'recipient phone number', sanitize_text_field($_POST['recipient_phone_number']));
    }

}

Es ist mein erster Umgang mit Woocommerce-Code. Ich habe viel gesucht und bin hierher gekommen, als ich es aufgegeben habe. Bitte helfen Sie mir, dieses Rätsel zu lösen.

Bitte korrigiert mich was ich falsch mache. Auch nach diesem Schritt muss ich diese benutzerdefinierten Felder im WordPress-Dashboard unter woocommerce > Bestellungen > Bestelldetails anzeigen. Wenn es also einen hilfreichen Link dafür gibt, geben Sie ihn bitte an.

Danke im Voraus.

Benutzer-Avatar
LoicTheAztec

Ich habe gerade Ihre letzte Hook-Funktion ein wenig geändert und sie funktioniert (auf WC-Version 2.6.x und 3.0+). Es ist besser mit empty() php-Funktion zur Verwendung von Variablen (um retrokompatibel zu sein).
Ist auch besser zu bedienen update_post_meta() Anstatt von add_post_meta() da diese Funktion dafür sorgt, dass die meta_key bereits existiert und falls nicht, add_post_meta() wird stattdessen angerufen…

Hier ein Screenshot der wp_postmeta Tabelle zu den Metadaten der Bestellung:
wp_postmeta-Tabelle

Wenn die meta_key Beginnen Sie nicht mit einem Unterstrich wie hier, er erscheint auf der Backend-Bearbeitungsseite in der Metabox für benutzerdefinierte Felder:Geben Sie hier die Bildbeschreibung ein

Hier ist dieser Code:

add_action( 'woocommerce_checkout_update_order_meta', 'saving_checkout_cf_data');
function saving_checkout_cf_data( $order_id ) {

    $recipient_address = $_POST['recipient_address'];
    if ( ! empty( $recipient_address ) )
        update_post_meta( $order_id, 'recipient_address', sanitize_text_field( $recipient_address ) );

    $recipient_phone_number = $_POST['recipient_phone_number'];
    if ( ! empty( $recipient_phone_number ) )
        update_post_meta($order_id, 'recipient_phone_number', sanitize_text_field( $recipient_phone_number ) );

}

Code geht in die function.php-Datei Ihres aktiven Child-Themes (oder Themes) oder auch in jede Plugin-Datei.

Wenn Sie eine haben möchten meta_key beginnend mit _billing… wie klassische Checkout-Felder für die Abrechnung müssen Sie dies nur ändern update_post_meta() Funktion. Zum Beispiel:

update_post_meta( $order_id, '_billing_recipient_address', sanitize_text_field( $recipient_address ) );

In diesem Fall wird dies jedoch nicht in der Metabox für benutzerdefinierte Felder auf der Bestellbearbeitungsseite angezeigt.

  • Es funktionierte wie ein Champion, also war der einzige Fehler die verschachtelte Funktion. if(! empty($_POST[‘PROBLEM I AM NOT GOING TO WORK AS NESTED FUNCTION’])); VIELEN DANK MATE CODE ARBEITEN WIE EIN CHAMP AUCH SIE HABEN MEINEN DENKEN FÜR EINIGE ANDERE DINGE GEÖFFNET

    – Aitazaz Khan

    18. Mai 2017 um 23:55 Uhr


  • Sie können auch immer verwenden update_post_meta() wie add_post_meta() ist darin enthalten …

    – LoicTheAztec

    18. Mai 2017 um 23:58 Uhr

  • Ich werde mich um die von Ihnen erwähnten Dinge kümmern, aber es gibt ein weiteres Problem, wie ich die benutzerdefinierten Feldinformationen im WordPress-Dashboard im Bestellmenü anzeigen werde? Kannst du helfen

    – Aitazaz Khan

    18. Mai 2017 um 23:59 Uhr

  • Als Referenz ist dies das offizielle Entwicklerdokument für benutzerdefinierte Checkout-Felder: Anpassen von Checkout-Feldern mithilfe von Aktionen und Filtern

    – LoicTheAztec

    19. Mai 2017 um 0:00 Uhr

  • Ich habe den von Ihnen gesendeten Link mehrmals durchgesehen. Aber ich denke, das Problem war, dass meine Datenbank nicht mit benutzerdefinierten Metaschlüsseln und -werten aktualisiert wurde. Deshalb habe ich die Daten der benutzerdefinierten Felder im Backend nicht gesehen. Lassen Sie es mich jetzt versuchen und werde mich bei Ihnen melden … ÜBRIGENS vielen Dank Champion Champion Champion

    – Aitazaz Khan

    19. Mai 2017 um 0:03 Uhr

Ich musste mehr als ein Feld hochladen, und ich habe ein Array wie dieses verwendet:

add_action('woocommerce_checkout_update_order_meta', 'tu_funcion'); 
function tu_funcion($order_id) 
{ 
$arrEnv = array('billing_cif', 'despliegue_nombre', 'despliegue_apellido', 'despliegue_correo');
foreach ($arrEnv as $valor) :
if (!empty($_POST[$valor]))
update_post_meta($order_id, $valor, sanitize_text_field($_POST[$valor]));
endforeach; }

zuvor habe ich sie zur Kasse eingeführt mit:

add_filter ('woocommerce_checkout_fields', 'custom_fields_finish_purchase');
function custom_fields_finish_purchase($fields){
 $fields['billing']['billing_cif'] = array (
     'type' => 'text',
     'label' => 'CIF',
     'placeholder' => 'Write here the CIF of the company',
     'class' => array ('form-row-wide'),
     'required' => true,
 );
// more fields here...
return $fields;
}

Für Bestelldetails können Sie mit diesem Fook schreiben:

add_action('woocommerce_admin_order_data_after_billing_address', 'your_function', 10, 1);
function your_function{
echo '<p><strong>CIF:</strong> ' . get_post_meta($order->get_id(), 'billing_cif', true) . '</p>';}

Und zum Schreiben in E-Mails können Sie diesen add_action-Hook verwenden:

‘woocommerce_email_after_order_table’

1381780cookie-checkwoocommerce_checkout_update_order_meta Aktion funktioniert nicht

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

Privacy policy