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_key
meta_value
meta_value_num
meta_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ă. :)
