Come accedere ai metadati personalizzati degli articoli dell'ordine da una chiave meta in WooCommerce?

23 set 2019, 08:18:32
Visualizzazioni: 60K
Voti: 8

Sto cercando di visualizzare alcuni metadati personalizzati associati alla spedizione di un ordine in WooCommerce. Ecco la storia completa di quello che sto facendo (così potrebbe aiutare qualcun altro e per farti capire esattamente cosa sto cercando di fare)...

Quando viene creato un ordine, sto allegando un tempo di consegna come metadato all'articolo di spedizione dell'ordine. Ecco il codice di riferimento:

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

Quando guardo nel database, viene creato e l'order_item_id corrisponde all'order_item_id per la spedizione su quell'ordine, quindi tutto funziona correttamente (e posso vederlo visualizzato nella vista dell'ordine nel backend).

Quello che sto cercando di capire è come estrarre manualmente questi dati per poterli visualizzare in diverse posizioni nel sito (e nelle e-mail). Sto iniziando dalla pagina degli ordini dell'account utente (/my-account/orders/). Ho aggiunto una colonna per visualizzare questo valore e sto cercando di capire come estrarre i dati. Ecco il codice per come ho aggiunto una colonna nel caso qualcuno fosse curioso:

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

// Nasconde le colonne
if( isset($columns['order-total']) ) {
    // Rimuove le colonne che vuoi nascondere
    unset( $columns['order-number'] );
    unset( $columns['order-date'] );
    unset( $columns['order-status'] );
    unset( $columns['order-total'] );
    unset( $columns['order-actions'] );
}

// Aggiunge le colonne con quella nuova così possiamo impostare l'ordine
$columns['order-number'] = __( 'Fattura', 'Text Domain' );
$columns['order-date'] = __( 'Data Ordine', 'Text Domain' );
$columns['order-lead-time'] = __( 'Tempo di Consegna', 'Text Domain' );
$columns['order-status'] = __( 'Stato', 'Text Domain' );
$columns['order-total'] = __( 'Totale', 'Text Domain' );
$columns['order-actions'] = __( 'Azione', 'Text Domain' );

return $columns;
}

Dove sto avendo difficoltà è nell'ottenere il valore del tempo di consegna che ho memorizzato sopra nella tabella. Ho provato tutto quello che mi è venuto in mente e che ho trovato online senza successo. Posso accedere con successo agli array, quindi so di essere vicino, ma c'è qualcosa che sto facendo di sbagliato nella ricerca dei metadati 'Lead Time' che non funziona. Ecco un esempio di quello che ho provato:

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(); // L'ID del metodo
        $shipping_method_instance_id = $shipping_item_obj->get_instance_id(); // L'ID dell'istanza

    $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;             //questo mostra 'free_shipping' FYI
    //echo $shipping_method_instance_id;    //questo mostra '2' FYI
    //echo $lt1;                            //questo non mostra nulla...
    //echo $lt2;                            //questo non mostra nulla...
    //echo $lt3;                            //questo non mostra nulla...
    echo $shipping_item_obj;                //facendo questo mi mostra l'oggetto dati e il contenuto di cui ho bisogno è lì.
}

}

Usando l'ultimo esempio dell'echo, ecco l'array di dati che sto ottenendo:

{"id":39,"order_id":2050,"name":"Spedizione gratuita","method_title":"Spedizione gratuita","method_id":"free_shipping","instance_id":"2","total":"0.00","total_tax":"0","taxes":{"total":[]},"meta_data":[{"id":573,"key":"Items","value":"Parte di Test × 1"},{"id":574,"key":"Lead Time","value":"2-3 settimane"}]}

Sono sicuro che mi sta sfuggendo qualcosa di semplice, ma non riesco a trovarlo. Qualsiasi aiuto sarebbe apprezzato.

Grazie,

Danny

0
Tutte le risposte alla domanda 1
2

Esistono almeno 2 modi per ottenere i metadati personalizzati degli articoli dell'ordine da una chiave meta definita:
1) Da WooCommerce 3 in poi - Utilizzando il metodo WC_Data get_meta()
2) Il metodo più vecchio - Utilizzando la funzione WooCommerce wc_get_order_item_meta()

Quindi il codice della tua funzione agganciata bs_order_lead_time_data() sarà:

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 ) {
        // Utilizzando il metodo WC_Data get_meta() da WooCommerce 3
        echo $item->get_meta('Lead Time');

        // Oppure il metodo più vecchio (utilizzando sempre l'ID dell'articolo)
        // echo wc_get_order_item_meta( $item_id , 'Lead Time', true );
    }
}

Il codice va inserito nel file functions.php del tuo tema child attivo (o tema attivo). Dovrebbe funzionare correttamente.

23 set 2019 11:55:38
Commenti

Ha funzionato perfettamente. Grazie!!

Danny Danny
24 set 2019 00:28:18

Vale la pena notare che $item->get_meta() funziona allo stesso modo del normale get_post_meta() di WP; se vuoi solo un singolo valore (piuttosto che un array), usa $item->get_meta('Lead Time', true);

indextwo indextwo
23 apr 2023 15:52:50