Come interrogare gli ordini WooCommerce dove i metadati non esistono
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
}
}
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_keymeta_valuemeta_value_nummeta_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).
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. :)