Cum să interoghezi comenzile WooCommerce unde metadatele nu există | Soluție PHP
Încerc să preiau toate comenzile mele WooCommerce unde unele metadate suplimentare sunt egale cu nu este gol.
$orders = wc_get_orders( array(
'orderby' => 'date',
'order' => 'DESC',
'meta_query' => array(
array(
'key' => 'var_rate',
'compare' => 'NOT EXISTS',
)
)
));
Deci dacă var_rate este gol sau nu există, atunci să nu returneze acea înregistrare. În acest moment, toate comenzile sunt returnate folosind acești parametri.
Exemplu de înregistrare goală -
object(WC_Meta_Data)#2344 (2) {
["current_data":protected]=>
array(3) {
["id"]=>
int(6471)
["key"]=>
string(15) "var_rate"
["value"]=>
NULL
}
["data":protected]=>
array(3) {
["id"]=>
int(6471)
["key"]=>
string(15) "var_rate"
["value"]=>
NULL
}
}
Argumentul meta_query (pe care îl poți folosi într-un WP_Query) nu este activat implicit atunci când folosești un WC_Order_Query prin funcția WooCommerce wc_get_orders().
Dar poți utiliza parametrii nedocumentați ai Câmpurilor Personalizate (la fel ca într-un WP_Query):
meta_keymeta_valuemeta_value_nummeta_compare
Deci, în cazul tău, poți folosi următoarele în schimb:
$orders = wc_get_orders( array(
'limit' => -1, // Interoghează toate comenzile
'orderby' => 'date',
'order' => 'DESC',
'meta_key' => 'var_rate', // Câmpul meta_key din postmeta
'meta_compare' => 'NOT EXISTS', // Argumentul de comparație
));
De data aceasta funcționează perfect (Testat pe WooCommerce 3.5.8 și 3.6.2).
Se pare că WooCommerce ignoră parametrul meta_query, motiv pentru care primești toate comenzile.
Poți folosi acest cod pentru a face parametrul meta_query să funcționeze cu interogările WooCommerce (pentru comenzi):
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 );
Dar, așa cum am menționat în comentariul meu, pentru a interoga toate comenzile în care metadatele var_rate nu sunt goale, setează compare la !=:
'meta_query' => array(
array(
'key' => 'var_rate',
'compare' => '!=',
'value' => '',
),
),
Și în cazul tău, unde interoghezi cu un singur meta query, poți pur și simplu să folosești parametrul meta_key împreună cu meta_compare și meta_value, fără a fi nevoie să folosești parametrul meta_query:
'meta_key' => 'var_rate',
'meta_compare' => '!=',
'meta_value' => '',
În acest fel, nu trebuie să folosești codul de mai sus care "activează" parametrul meta_query.
ACTUALIZARE
Cred că nu am fost atent la titlul întrebării.. și cred că ar trebui să adaug aceste lucruri:
În titlul întrebării, ai scris "unde metadatele nu există", iar pentru asta, ai nevoie de 'compare' => 'NOT EXISTS' sau 'meta_compare' => 'NOT EXISTS'.
Dar în corpul întrebării, ai spus "unde unele metadate suplimentare sunt egale cu nu goale" și de asemenea "dacă var_rate este gol sau nu există, atunci nu returna acea înregistrare", iar pentru asta, ai nevoie de 'compare' => '!=' sau 'meta_compare' => '!='.
Pentru că atunci când compare sau meta_compare este setat la !=, iar value sau meta_value este setat la '' (valoarea implicită, dacă nu este specificată explicit), înseamnă "găsește înregistrările în care meta există în baza de date și valoarea nu este goală (nu este '' sau nu este NULL)".
Sper că aceste informații te ajută. :)