Abfragen von Posts zwischen zwei Daten (benutzerdefinierte Metaschlüssel) CMB2

Ich habe einen benutzerdefinierten Post-Typ (Projekte), die benutzerdefinierte cmb2-Metaschlüssel (str_dte und end_dte) haben, so dass jedes Projekt ein Startdatum und ein Enddatum hat. Ich versuche, Projekte zwischen zwei Daten zu bekommen.

Beispiel:

Projekt # 1: Startdatum = 20120101 (Jan 2012) / Enddatum = 20120601 (Juni 2012) (Ymd)

Projekt # 2: Startdatum = 20120401 (Apr 2012) / Enddatum = 20121201 (Dez 2012) (Jmd)

Die Abfrage:

query_posts(array( 'posts_per_page' => $numPosts, 'paged' => $page, 'post_type' => 'projects', 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'str_dte', 'compare' => '>=', 'value' => '20120501', //May 2012 'type' => 'DATE' ), array( 'key' => 'end_dte', 'compare' => ' '20120701', //July 2012 'type' => 'DATE' ) ), )); 

Problem: Bei dieser Abfrage wurde kein Projekt angezeigt, da der Datumsbereich zwischen dem Startdatum und dem Enddatum jedes Projekts nicht erkannt wurde.

Kurz gesagt: Ich muss eine Lösung finden, um Projekte / Posts zwischen zwei Daten (Startdatum und Enddatum) unter Berücksichtigung des Datumsbereichs zwischen jedem Projektanfangs- und Enddatum abzufragen.

Online-Ressourcen: Die nützlichste Lösung, die ich online gefunden habe, war (Robbiegod / Keesiemeijer) Lösung, aber es hat nicht für mich funktioniert, ich weiß nicht warum!

Deine Hilfe wird geschätzt. Vielen Dank.

LÖSUNG

 query_posts(array( 'posts_per_page' => $numPosts, 'paged' => $page, 'post_type' => 'projects', 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'str_dte', 'compare' => ' '$end_date_value', // 20120701 July (Ymd or UnixTime) 'type' => 'DATE' ), array( 'key' => 'end_dte', 'compare' => '>=', 'value' => '$start_date_value', // 20120501 May (Ymd or UnixTime) 'type' => 'DATE' ) ), )); 

Geben Sie als Wert für den Metaschlüssel “Enddatum” das Startdatumswertergebnis (Datum) ein, und geben Sie das Enddatumswertergebnis (Datum) als Wert für den Metaschlüssel “Startdatum” ein.

Das ist es.

Solutions Collecting From Web of "Abfragen von Posts zwischen zwei Daten (benutzerdefinierte Metaschlüssel) CMB2"

Um Projekte innerhalb einer Reihe von Daten zu finden, müssen Sie drei Fälle berücksichtigen:

  • Ein Projekt beginnt innerhalb des Bereichs
  • Ein Projekt endet innerhalb der Reichweite
  • Ein Projekt beginnt vor dem Bereich und endet nach dem Bereich

Sie können diese 3 Fälle getrennt mit einer OR Meta-Abfrage und 1 geschachteltem AND testen:

 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'str_dte', 'value' => array( $range_start, $range_end ), 'compare' => 'BETWEEN', ), array( 'key' => 'end_dte', 'value' => array( $range_start, $range_end ), 'compare' => 'BETWEEN', ), array( 'relation' => 'AND', array( 'key' => 'str_dte', 'value' => $range_start, 'compare' => '< ', ), array( 'key' => 'end_dte', 'value' => $range_end, 'compare' => '>', ), ), ), 

Wenn Sie viele dieser Abfragen ausführen und die performance ein Problem darstellt, können Sie wahrscheinlich schneller eine schnellere Abfrage erstellen, als dies generiert.

Verwenden Sie als erstes keine query_posts! (Warum nicht? Deshalb! )

Zweitens, wenn Ihre benutzerdefinierten Felder (CF) in der Ymd-Form gespeichert sind (Sie sind sicher, ja ?!), sollte alles in Ordnung sein, auch wenn Sie den “Typ” nicht als “Datum” definieren. Wenn man mehrere Diskussionen über SE usw. liest, scheint es besser zu sein, einfach den “Datum” -Typ zu vermeiden, wenn man einen Datumswert nicht mit einem Array von zwei Daten in einem Meta-Abfrage-Array vergleicht. Also, entferne 'type'=>'date' .

Nachdem ich das gesagt habe, frage ich mich, ob Ihre Abfrage überhaupt ein Ergebnis liefert, denn wenn ich es durchlaufe, kommt das heraus: Beide Bedingungen müssen wahr sein, da Sie eine relation von “und” verwenden.

Erste Bedingung : Wenn der Wert von 20120101 (= value ) größer oder gleich (= compare ) ist mit dem in str_date (= key ) gespeicherten Wert, ist es gut zu gehen.

  • Projekt # 1: 20120101> = 20120101: wahr.
  • Projekt # 2: 20120101> = 20120401: falsch.

Zweite Bedingung : Wenn der Wert von 20120630 (= value ) kleiner oder gleich (= compare ) ist mit dem in end_dte (= key ) gespeicherten Wert, ist es gut zu gehen.

  • Projekt # 1: 20120630 < = 20120601: falsch.
  • Projekt # 2: 20120630 < = 20121201: wahr.

Da keines der beiden Projekte beide Bedingungen erfüllt, frage ich mich, ob WP sogar einen zurückgibt. Ich denke, für was Sie wollen, sollte diese Abfrage funktionieren:

 // New Query: se216174 $se216174_args = array( 'posts_per_page' => -1, // Why '-1'? Because the custom fields limit the results anyway 'post_type' => 'projects', 'meta_query' => array( 'relation' => 'AND', // This is default, you could skip it array( 'key' => 'str_dte', 'compare' => '< =', // I have changed this, so everything with a date greater than what we have in the next line should be displayed. 'value' => '20120101', ), array( 'key' => 'end_dte', 'compare' => '>=', // Same as above 'value' => '20121201', // New date so that both your projects will match ), ), ); $se216174_query = new WP_Query( $se216174_args ); if ( $se216174_query->have_posts() ) : while ( $se216174_query->have_posts() ) : $se216174_query->the_post(); // Display post, eg. echo the_title(); endwhile; wp_reset_postdata(); else : // No posts, eg. echo 'Nothing found'; endif; 

Nicht getestet, aber das sollte funktionieren. Lass mich schnell nachsehen wie oben:

Erste Bedingung : Wenn der Wert von 20120101 (= value ) kleiner oder gleich (= compare ) ist mit dem in str_date (= key ) gespeicherten Wert, sind wir gut zu gehen.

  • Projekt # 1: 20120101 < = 20120101: wahr.
  • Projekt # 2: 20120101 < = 20120401: stimmt.

Zweite Bedingung : Wenn der Wert von 20120630 (= value ) größer oder gleich (= compare ) ist mit dem in end_dte (= key ) gespeicherten Wert, sind wir gut zu gehen.

  • Projekt # 1: 20121201> = 20120601: stimmt.
  • Projekt # 2: 20121201> = 20121201: wahr.

Also, wenn Sie alles zwischen 20120101 und 20121201 zeigen möchten – das ist die Abfrage, die Sie brauchen.