Come interrogare gli ordini WooCommerce dove i metadati non esistono

14 mag 2019, 15:02:25
Visualizzazioni: 18.5K
Voti: 5

Sto cercando di recuperare tutti i miei ordini WooCommerce dove alcuni metadati aggiuntivi sono uguali a non vuoto.

$orders = wc_get_orders( array(
    'orderby'   => 'date',
    'order'     => 'DESC',
    'meta_query' => array(
        array(
            'key' => 'var_rate',
            'compare' => 'NOT EXISTS', // Cerca i record dove il metadato non esiste
        )
    )
));

Quindi se var_rate è vuoto o non esiste, non restituire quel record. Al momento vengono restituiti tutti gli ordini utilizzando questi argomenti.

Esempio di record vuoto -

object(WC_Meta_Data)#2344 (2) {
  ["current_data":protected]=>
  array(3) {
    ["id"]=>
    int(6471)
    ["key"]=>
    string(15) "var_rate"
    ["value"]=>
    NULL // Valore NULL indica che il metadato è vuoto
  }
  ["data":protected]=>
  array(3) {
    ["id"]=>
    int(6471)
    ["key"]=>
    string(15) "var_rate"
    ["value"]=>
    NULL
  }
}
2
Commenti

Il tuo codice sta interrogando tutti gli ordini che non hanno il metadato var_rate. Quindi, se restituisce tutti gli ordini, sei sicuro che ci siano effettivamente ordini con quel metadato? Sei sicuro che il nome sia var_rate? E per includere solo gli ordini dove quel metadato non è vuoto, dovresti usare 'compare' => '!=' e opzionalmente aggiungere 'value' => '' all'array.

Sally CJ Sally CJ
14 mag 2019 16:20:17

@SallyCJ grazie per la tua risposta. Controllando i miei dati, un valore vuoto è NULL. Ho provato come hai suggerito includendo 'value' => NULL ma ottengo comunque entrambi gli ordini. Grazie

SamXronn SamXronn
14 mag 2019 16:51:34
Tutte le risposte alla domanda 2
0
15

L'argomento meta_query (che puoi utilizzare in una WP_Query) non è abilitato di default quando usi una WC_Order_Query tramite la funzione wc_get_orders() di WooCommerce.

Ma puoi comunque utilizzare i parametri dei campi personalizzati non documentati (proprio come in una WP_Query):

  • meta_key
  • meta_value
  • meta_value_num
  • meta_compare

Quindi nel tuo caso puoi usare invece il seguente codice:

$orders = wc_get_orders( array(
    'limit'        => -1, // Query tutti gli ordini
    'orderby'      => 'date',
    'order'        => 'DESC',
    'meta_key'     => 'var_rate', // Il campo chiave dei postmeta
    'meta_compare' => 'NOT EXISTS', // L'argomento di confronto
));

Questa volta funziona correttamente (testato su WooCommerce 3.5.8 e 3.6.2).

14 mag 2019 21:10:06
0

Sembra che WooCommerce stia ignorando il parametro meta_query, ecco perché stai ottenendo tutti gli ordini.

Puoi utilizzare questo codice per far funzionare il parametro meta_query con le query di WooCommerce (ordini):

add_filter( 'woocommerce_get_wp_query_args', function( $wp_query_args, $query_vars ){
    if ( isset( $query_vars['meta_query'] ) ) {
        $meta_query = isset( $wp_query_args['meta_query'] ) ? $wp_query_args['meta_query'] : [];
        $wp_query_args['meta_query'] = array_merge( $meta_query, $query_vars['meta_query'] );
    }
    return $wp_query_args;
}, 10, 2 );

Ma come ho sottolineato nel mio commento, per interrogare tutti gli ordini in cui il metadato var_rate non è vuoto, imposta compare a !=:

'meta_query' => array(
    array(
        'key'     => 'var_rate',
        'compare' => '!=',
        'value'   => '',
    ),
),

E nel tuo caso, in cui stai interrogando con un singolo meta query, potresti semplicemente usare il parametro meta_key insieme a meta_compare e meta_value, senza dover usare il parametro meta_query:

'meta_key'     => 'var_rate',
'meta_compare' => '!=',
'meta_value'   => '',

In questo modo, non devi usare il codice sopra che "abilita" il parametro meta_query.

AGGIORNAMENTO

Penso di non aver prestato abbastanza attenzione al titolo della domanda... e ho pensato di aggiungere queste informazioni:

Nel titolo della domanda, hai scritto "dove il metadato non esiste", e per quello, avresti bisogno di 'compare' => 'NOT EXISTS' o 'meta_compare' => 'NOT EXISTS'.

Ma nel corpo della domanda, hai detto "dove alcuni metadati aggiuntivi sono uguali a non vuoto" e anche "se il var_rate è vuoto o non esiste, allora non restituire quel record", e per quello, avresti bisogno di 'compare' => '!=' o 'meta_compare' => '!='.

Perché quando compare o meta_compare è impostato a !=, e value o meta_value è impostato a '' (il valore predefinito, se non specificato esplicitamente), significa "trova i record in cui il meta esiste nel database e il valore non è vuoto (non '' o non NULL)".

Spero che questo ti aiuti. :)

14 mag 2019 18:29:34