Cum să interoghezi comenzile WooCommerce unde metadatele nu există | Soluție PHP

14 mai 2019, 15:02:25
Vizualizări: 18.5K
Voturi: 5

Î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
  }
}
2
Comentarii

Codul tău interoghează toate comenzile care nu au metadatele var_rate. Dacă acest lucru returnează toate comenzile, ești sigur că există efectiv comenzi care au această metadată? Ești sigur că numele este var_rate? Și pentru a include doar comenzile unde acea metadată nu este goală, ar trebui să folosești 'compare' => '!=' și opțional să adaugi 'value' => '' în array.

Sally CJ Sally CJ
14 mai 2019 16:20:17

@SallyCJ mulțumesc pentru răspuns. Verificând datele mele, o valoare goală este NULL. Am încercat cum ai sugerat și am inclus următoarele 'value' => NULL dar încă primesc ambele comenzi. Mulțumesc.

SamXronn SamXronn
14 mai 2019 16:51:34
Toate răspunsurile la întrebare 2
0
15

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

14 mai 2019 21:10:06
0

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

14 mai 2019 18:29:34