Es wird versucht, eine komplexe benutzerdefinierte Feldabfrage mit der Reihenfolge nach Feldwert durchzuführen

Ich habe zwei benutzerdefinierte Felder für Event-Posts: event-start und event-end . Wenn ich nach aktuellen Ereignissen frage, würde ich gerne einen Beitrag zeigen, bei dem der event-start ODER das event-end größer oder gleich dem heutigen Datum ist und ich möchte sie per event-start bestellen (nicht den Standard post_date).

Ich habe eine Abfrage mit den folgenden Parametern erstellt:

 $args = array( 'post_type' => 'post', 'posts_per_page' => $number, 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'event-start', 'value' => $today_is, 'type' => 'NUMERIC', 'compare' => '>=' ), array( 'key' => 'event-end', 'value' => $today_is, 'type' => 'NUMERIC', 'compare' => '>=' ) ), 'orderby' => 'meta_value', 'order' => 'ASC', ); 

Die Abfrage erhält die richtigen Posts, aber das Problem ist, dass ich die Bestellung nicht erhalten kann. Diese Gruppe von Argumenten führt die folgende Abfrage aus:

 SELECT SQL_CALC_FOUND_ROWS wp_18_posts.ID FROM wp_18_posts INNER JOIN wp_18_postmeta ON (wp_18_posts.ID = wp_18_postmeta.post_id) INNER JOIN wp_18_postmeta AS mt1 ON (wp_18_posts.ID = mt1.post_id) WHERE 1=1 AND wp_18_posts.post_type = 'post' AND (wp_18_posts.post_status = 'publish' OR wp_18_posts.post_status = 'private') AND ( (wp_18_postmeta.meta_key = 'event-start' AND CAST(wp_18_postmeta.meta_value AS SIGNED) >= '1344289896') OR (mt1.meta_key = 'event-end' AND CAST(mt1.meta_value AS SIGNED) >= '1344289896') ) GROUP BY wp_18_posts.ID **ORDER BY wp_18_posts.post_date** ASC LIMIT 0, 3 

Beachten Sie, dass die ORDER BY-Klausel weiterhin auf post_date festgelegt ist. Wenn ich die Abfrageargumente so ändere, dass sie den alten Stil von meta_key sowie orderby meta_value zusammen mit der neuen meta_query wie folgt verwenden:

 $args = array( 'post_type' => 'post', 'posts_per_page' => $number, 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'event-start', 'value' => $today_is, 'type' => 'NUMERIC', 'compare' => '>=' ), array( 'key' => 'event-end', 'value' => $today_is, 'type' => 'NUMERIC', 'compare' => '>=' ) ), 'orderby' => 'meta_value', 'meta_key' => 'event-start', 'order' => 'ASC', ); 

Ich habe am Ende folgende Frage:

 SELECT SQL_CALC_FOUND_ROWS wp_18_posts.ID FROM wp_18_posts INNER JOIN wp_18_postmeta ON (wp_18_posts.ID = wp_18_postmeta.post_id) INNER JOIN wp_18_postmeta AS mt1 ON (wp_18_posts.ID = mt1.post_id) INNER JOIN wp_18_postmeta AS mt2 ON (wp_18_posts.ID = mt2.post_id) WHERE 1=1 AND wp_18_posts.post_type = 'post' AND (wp_18_posts.post_status = 'publish' OR wp_18_posts.post_status = 'private') AND (wp_18_postmeta.meta_key = 'event-start' OR (mt1.meta_key = 'event-start' AND CAST(mt1.meta_value AS SIGNED) >= '1344289518') OR (mt2.meta_key = 'event-end' AND CAST(mt2.meta_value AS SIGNED) >= '1344289518') ) GROUP BY wp_18_posts.ID ORDER BY wp_18_postmeta.meta_value ASC LIMIT 0, 3 

Das zieht alle Posts mit einem event-start Metaschlüssel an, unabhängig von dem für diesen Schlüssel festgelegten Datum.

Irgendwelche Ideen, wie man eine komplexe kundenspezifische Feldabfrage und -reihenfolge durch den event-start aufstellt, würde groß geschätzt werden.

Solutions Collecting From Web of "Es wird versucht, eine komplexe benutzerdefinierte Feldabfrage mit der Reihenfolge nach Feldwert durchzuführen"

Wenn der Wert Ihrer benutzerdefinierten Felder numerisch ist, können Sie versuchen, mit meta_value_num zu bestellen. Beachten Sie auch, dass sowohl meta_value als auch meta_value_num in der Abfrage wie hier beschrieben meta_key erfordern.

 $args = array( 'post_type' => 'post', 'posts_per_page' => $number, 'meta_query' => array( 'relation' => 'OR', array( 'meta_key' => 'event-start', 'value' => $today_is, 'type' => 'NUMERIC', 'compare' => '>=' ), array( 'meta_key' => 'event-end', 'value' => $today_is, 'type' => 'NUMERIC', 'compare' => '>=' ) ), 'orderby' => 'meta_value_num', 'order' => 'ASC', ); 

Hier ist die beste Lösung, die ich gefunden habe:

 $args = array( 'post_type' => 'post', 'posts_per_page' => $number, 'meta_key' => 'event-start', 'meta_value' => $today_is, 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'event-start', 'value' => $today_is, 'type' => 'NUMERIC', 'compare' => '>=', ), array( 'key' => 'event-end', 'value' => $today_is, 'type' => 'NUMERIC', 'compare' => '>=', ) ), 'orderby' => 'meta_value', 'order' => 'ASC', ); 

Es verwendet die gleiche komplexe meta_query , aber ich habe einen separaten meta_key und meta_value meta_key meta_value , um die meta_value Wert-Reihenfolge durch zu triggern.

Wenn ich mich richtig erinnere, hatte ich zu der Zeit, als ich diesen Beitrag schrieb, diese Lösung versucht, aber es hat nicht funktioniert. Ich glaube auch, dass ich in WordPress Core auf ein Trac-Ticket gestoßen bin, das zu diesem Thema gehört, aber für das Leben von mir kann es jetzt nicht finden.

Fazit: Zu der Zeit des ursprünglichen Posts, glaube ich, gab es einen WordPress-Bug, der das verhinderte, aber jetzt funktioniert es.