web-dev-qa-db-fra.com

Interroger les commandes WooCommerce où les métadonnées n'existent pas

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
  }
}
2
SamXronn

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

3
LoicTheAztec

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.

MISE À JOUR

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

4
Sally CJ