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_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).

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. :)
