J'essaie de récupérer toutes mes commandes WooCommerce où certaines métadonnées supplémentaires sont égales à non vides.
$orders = wc_get_orders( array(
'orderby' => 'date',
'order' => 'DESC',
'meta_query' => array(
array(
'key' => 'var_rate',
'compare' => 'NOT EXISTS',
)
)
));
Donc, si le var_rate
est vide ou n'existe pas alors ne renvoyez pas cet enregistrement. Pour le moment, toutes les commandes sont retournées en utilisant ces arguments.
Exemple d'enregistrement vide -
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
}
}
L'argument meta_query
(que vous pouvez utiliser dans un WP_Query
) n'est pas activé par défaut lors de l'utilisation d'une fonction WC_Order_Query
à wc_get_orders()
WooCommerce.
Mais pour vous, vous pouvez utiliser les non documentés paramètres de champ personnalisés (comme dans un WP_Query
) :
meta_key
meta_value
meta_value_num
meta_compare
Donc, dans votre cas, vous pouvez utiliser les éléments suivants à la place:
$orders = wc_get_orders( array(
'limit' => -1, // Query all orders
'orderby' => 'date',
'order' => 'DESC',
'meta_key' => 'var_rate', // The postmeta key field
'meta_compare' => 'NOT EXISTS', // The comparison argument
));
Cette fois, cela fonctionne bien (testé sur WooCommerce 3.5.8 et 3.6.2).
Apparemment, WooCommerce ignore le meta_query
paramètre, c'est pourquoi vous recevez toutes les commandes.
Vous pouvez utiliser ce code pour rendre le meta_query
le paramètre fonctionne avec les requêtes WooCommerce (commandes):
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 );
Mais comme je l'ai indiqué dans mon commentaire, pour rechercher toutes les commandes où le var_rate
les métadonnées ne sont pas pas vides, définissez compare
sur !=
:
'meta_query' => array(
array(
'key' => 'var_rate',
'compare' => '!=',
'value' => '',
),
),
Et dans le cas où vous interrogez avec une seule méta-requête, vous pouvez simplement utiliser la meta_key
paramètre avec meta_compare
et meta_value
, sans avoir à utiliser le meta_query
paramètre:
'meta_key' => 'var_rate',
'meta_compare' => '!=',
'meta_value' => '',
De cette façon, vous n'avez pas à utiliser le code ci-dessus qui "active" le meta_query
paramètre.
Je pense que je ne faisais pas vraiment attention au titre de la question .. et je pensais que je devrais ajouter ceux-ci:
Dans le titre de la question, vous avez obtenu " où les métadonnées ne n'existent pas", et pour cela, le 'compare' => 'NOT EXISTS'
ou 'meta_compare' => 'NOT EXISTS'
est ce dont vous auriez besoin.
Mais dans le corps de la question, vous avez dit " où certaines métadonnées supplémentaires sont égales à pas vides" et aussi " si le var_rate
est vide ou n'existe pas alors ne retournez pas cet enregistrement ", et pour cela, le 'compare' => '!='
ou 'meta_compare' => '!='
est ce dont vous auriez besoin.
Parce que lorsque le compare
ou meta_compare
est réglé sur !=
, et le value
ou meta_value
est réglé sur ''
(la valeur par défaut, si elle n'est pas explicitement spécifiée), cela signifie: "rechercher les enregistrements où la méta existe dans la base de données et où la valeur n'est pas vide (pas ''
ou non NULL
) ".
J'espère que ça aide. :)