Cum accesezi datele meta personalizate ale unui articol din comandă folosind o cheie meta în WooCommerce?

23 sept. 2019, 08:18:32
Vizualizări: 60K
Voturi: 8

Încerc să afișez niște date meta personalizate care sunt asociate cu livrarea unei comenzi în WooCommerce. Iată întreaga poveste a ceea ce încerc să fac (ca să poată ajuta și pe alții și să înțelegeți complet ce încerc să realizez)...

Când se creează o comandă, atașez un timp de livrare ca date meta la elementul de livrare al comenzii. Iată codul pentru referință:

add_action( 'woocommerce_checkout_create_order_shipping_item', 'add_leadtime_meta',  20, 4  );

function add_leadtime_meta( &$item, $package_key, $package, $order ) {
    $lt = get_current_lead_time();   
    $item->add_meta_data( 'Lead Time', $lt, true );
}

Când mă uit în baza de date, acesta este creat, iar order_item_id se potrivește cu order_item_id pentru livrarea din acea comandă, deci totul funcționează bine (și îl pot vedea afișat în vizualizarea comenzii din backend).

Ceea ce încerc să aflu este cum să extrag manual aceste date pentru a le putea afișa în câteva locații pe site (și în e-mail). Încep cu pagina de comenzi din contul utilizatorului (/my-account/orders/). Am adăugat o coloană pentru a afișa această valoare și încerc să aflu cum să obțin datele. Iată codul pentru cum am adăugat o coloană, în caz că este cineva curios:

add_filter( 'woocommerce_account_orders_columns', 'new_orders_columns' );
function new_orders_columns( $columns = array() ) {

// Ascunde coloanele
if( isset($columns['order-total']) ) {
    // Elimină coloanele pe care vrei să le ascunzi
    unset( $columns['order-number'] );
    unset( $columns['order-date'] );
    unset( $columns['order-status'] );
    unset( $columns['order-total'] );
    unset( $columns['order-actions'] );
}

// Adaugă coloanele înapoi cu una nouă pentru a putea seta ordinea
$columns['order-number'] = __( 'Factură', 'Text Domain' );
$columns['order-date'] = __( 'Data Comenzii', 'Text Domain' );
$columns['order-lead-time'] = __( 'Timp de Livrare', 'Text Domain' );
$columns['order-status'] = __( 'Status', 'Text Domain' );
$columns['order-total'] = __( 'Total', 'Text Domain' );
$columns['order-actions'] = __( 'Acțiune', 'Text Domain' );

return $columns;
}

Unde mă chinui este să obțin valoarea timpului de livrare pe care am stocat-o mai sus în tabel. Am încercat tot ce mi-a venit în minte și ce am putut găsi online, fără succes. Pot accesa array-urile cu succes, deci știu că sunt aproape, dar este ceva ce fac greșit cu căutarea datelor meta 'Lead Time' care nu funcționează. Iată un exemplu a ceea ce am încercat:

add_action( 'woocommerce_my_account_my_orders_column_order-lead-time', 'bs_order_lead_time_data' );
function bs_order_lead_time_data( $order ) {
    foreach( $order->get_items( 'shipping' ) as $item_id => $shipping_item_obj ){
        $shipping_method_id          = $shipping_item_obj->get_method_id(); // ID-ul metodei
        $shipping_method_instance_id = $shipping_item_obj->get_instance_id(); // ID-ul instanței

    $lt1 = wc_get_order_item_meta( $shipping_method_id , 'Lead Time', $single = true );
    $lt2 = wc_get_order_item_meta( $shipping_method_instance_id , 'Lead Time', $single = true );
    $lt3 = get_post_meta( $shipping_item_obj, 'Lead Time', true );

    //echo $shipping_method_id;             //aceasta afișează 'free_shipping' FYI
    //echo $shipping_method_instance_id;    //aceasta afișează '2' FYI
    //echo $lt1;                            //aceasta nu afișează nimic...
    //echo $lt2;                            //aceasta nu afișează nimic...
    //echo $lt3;                            //aceasta nu afișează nimic...
    echo $shipping_item_obj;                //făcând acest lucru îmi arată obiectul de date și conținutul de care am nevoie este acolo.
}

}

Folosind ultimul exemplu de echo, iată array-ul de date pe care îl primesc:

{"id":39,"order_id":2050,"name":"Free shipping","method_title":"Free shipping","method_id":"free_shipping","instance_id":"2","total":"0.00","total_tax":"0","taxes":{"total":[]},"meta_data":[{"id":573,"key":"Items","value":"Test Part × 1"},{"id":574,"key":"Lead Time","value":"2 to 3 weeks"}]}

Sunt sigur că ratez ceva simplu, dar nu reușesc să-l găsesc. Orice ajutor ar fi apreciat.

Mulțumesc,

Danny

0
Toate răspunsurile la întrebare 1
2

Există cel puțin 2 moduri de a obține metadate personalizate ale articolelor de comandă dintr-o cheie meta definită:
1) Începând cu WooCommerce 3 - Folosind metoda WC_Data get_meta()
2) Modul vechi - Folosind funcția WooCommerce wc_get_order_item_meta()

Deci, codul funcției tale agățate bs_order_lead_time_data() va fi:

add_action( 'woocommerce_my_account_my_orders_column_order-lead-time', 'bs_order_lead_time_data' );
function bs_order_lead_time_data( $order ) {
    foreach ( $order->get_items('shipping') as $item_id => $item ) {
        // Folosind metoda WC_Data get_meta() începând cu WooCommerce 3
        echo $item->get_meta('Lead Time');

        // Sau modul vechi (folosind întotdeauna ID-ul articolului)
        // echo wc_get_order_item_meta( $item_id , 'Lead Time', true );
    }
}

Codul se plasează în fișierul functions.php al temei active pentru copii (sau al temei active). Ar trebui să funcționeze corect.

23 sept. 2019 11:55:38
Comentarii

A funcționat perfect. Mulțumesc!!

Danny Danny
24 sept. 2019 00:28:18

Este important de menționat că $item->get_meta() funcționează la fel ca get_post_meta() obișnuit din WP; dacă doriți doar o singură valoare (în loc de un array), folosiți $item->get_meta('Lead Time', true);

indextwo indextwo
23 apr. 2023 15:52:50