2016-06-29 7 views
0

Es gibt eine einfache Abfrage mit zwei Meta-Bedingungen.Warum ignoriert Wordpress meta_query-Bedingungen?

$defaults = array(
    'post_type' => 'products', 
    'orderby' => 'date', 
    'order'  => 'DESC', 
); 

if($is_deadline) { // true, I checked 
    $defaults['meta_key'] = 'deadline', 
    $defaults['meta_type'] = 'NUMERIC', 
    $defaults['meta_value'] = (int)current_time('Ymd'); 
    $defaults['meta_compare'] = '>='; 

    $defaults['meta_query'] = array(// this query will be ignored 
     'relation' => 'OR', 
     array(
      'key'  => 'deadline', 
      'value' => '', 
      'compare' => '=' 
     ) 
    ); 
} 

Aber ich habe ein Problem: Wordpress ignoriert Meta-Abfrage-Block. Mit anderen Worten sieht $ query-> Anfrage wie folgt aus (ohne mit leeren String vergleichen):

SELECT adveq_posts.* FROM adveq_posts 
INNER JOIN adveq_postmeta ON (adveq_posts.ID = adveq_postmeta.post_id) WHERE 1=1 
AND ( 
    (adveq_postmeta.meta_key = 'deadline' AND CAST(adveq_postmeta.meta_value AS SIGNED) >= '20160629') 
) 
AND adveq_posts.post_type = 'products' 
AND (adveq_posts.post_status = 'publish' 
OR adveq_posts.post_status = 'private') 
GROUP BY adveq_posts.ID 
ORDER BY adveq_posts.post_date DESC 

Dieses Problem fliegt weg, wenn ich Bezug auf ‚UND‘ - meta_query nicht mehr ignoriert. Aber ich brauche ODER, nicht UND. Ich habe eine andere Variante versucht, nur mit Meta_Query.

$defaults = array(
    'post_type' => 'products', 
    'orderby' => 'date', 
    'order'  => 'DESC', 
); 

if($is_deadline) { // true, I checked 
    $defaults['meta_query'] = array(
     'relation' => 'OR', 
     array(
      'key'  => 'deadline', 
      'value' => (int)current_time('Ymd'), 
      'type' => 'NUMERIC', 
      'compare' => '>=' 
     ), 
     array(
      'key'  => 'deadline', 
      'value' => '', 
      'compare' => '=' 
     ) 
    ); 
} 

Aber in diesem Fall Wordpress ignoriert meta_query wie möglich, so viel. Selbst wenn relation = 'AND' ist, gibt es immer noch ein Problem und das WP-Verhalten ist genau dasselbe.

SELECT adveq_posts.* FROM adveq_posts 
WHERE 1=1 AND adveq_posts.post_type = 'structured_products' 
AND (adveq_posts.post_status = 'publish' OR adveq_posts.post_status = 'private') 
ORDER BY adveq_posts.post_date DESC 

Irgendwelche Vorschläge? Vielleicht ist das ein WP-Kernfehler? Dieses Verhalten ist sehr seltsam und unlogisch.

Antwort

0

Problem in dieser Frage meine eigenen Fehler. Ich habe Filter verwendet, um die wp_query-Logik zu modifizieren, und diese Modifikationen zerstören das normale Verhalten. Wenn Sie ein ähnliches Problem haben, achten Sie darauf, was Sie oder ein Plugin \ theme nicht verwendet haben (zB pre_get_posts oder andere), was die Ergebnisse von WP_Query verändern kann.

Wenn Sie jedoch diese Logik kombinieren und alle Vorteile von WP_Query nutzen möchten, können Sie Ihr eigenes Flag im WP_Query-Konstruktor übergeben und den Status überprüfen. Zum Beispiel:

$query = new WP_Query(array(
    'post_type'   => 'any_post_type', 
    'orderby'    => 'date', 
    'order'    => 'DESC', 

    'suppress_filters'  => false, 

    'is_your_custom_query' => true, // your custom flag 
)); 
1

Dies funktioniert nicht direkt. Sie müssen hier WP_Meta_Query verwenden.

Lesen Sie die folgenden https://codex.wordpress.org/Class_Reference/WP_Meta_Query

+0

Okay, aber in WP_Query bereits mit WP_Meta_Query. Wenn Sie den Quellcode einsehen, können Sie dies hier sehen: [link] (https://core.trac.wordpress.org/browser/tags/4.5.3/src/wp-includes/query.php#L2502). Aufruf-Kette ist: Abfrage-> get_posts-> WP_Meta_Query. Ich habe Arbeitsergebnis nur, wenn ich 'Pre_get_posts'-Filter und modifizierte Abfrage im letzten Moment direkt verwendet. – Raymond

Verwandte Themen