wake-up-neo.com

WP_Query Meta_Query-Ergebnisse Datum für Datum

Geh nicht! Dies ist keine andere Frage, wie man bei meta_value bestellt!

Ich habe einen Beitragstyp mit dem Namen eventsname__, und jeder Beitrag, den ich erstelle, hat ein Metafeld, das ich einfallsreich als event_dates_wp bezeichnet habe. Es akzeptiert mehrere Daten und speichert sie als Array im Format Ymdname__.

Ich habe einen WP_Query, der Posts mit einem Datum zwischen den beiden meta_queryvaluename__s zurückgibt, wie folgt:

$args = [
    'post_type' => 'event',
    'order' => 'ASC',
    'orderby' => 'meta_value',
    'meta_key' => 'event_dates_wp',
    'posts_per_page' => -1,
    'meta_query' => [
      [
        'key' => 'event_dates_wp',
        'type' => 'DATE',
        'value' => '20180801',
        'compare' => '>='
      ],
      [
        'key' => 'event_dates_wp',
        'type' => 'DATE',
        'value' => '20180831',
        'compare' => '<='
      ]
    ]
  ];

Dies alles funktioniert wunderbar und gibt eine Liste von Posts zurück, die einen event_dates_wp -Wert enthalten, der zwischen dem 1. August 2018 und dem 31. August 2018 liegt. Aber die Ergebnisse sind eher postzentrisch als datumszentriert - lassen Sie mich Folgendes erklären:

Das Obige ist das, was man erwarten würde, aber ich möchte die Daten auflisten, beginnend mit dem 1. August bis zum 31. August, wobei jeder passende Beitrag unter jedem Datum aufgeführt wird, damit sie sich wiederholen können.

Zum Beispiel:

Event A contains dates [20180801, 20180802, 20180803, 20180804]
Event B contains dates [20180803, 20180804, 20180805]
Event C contains dates [20180804, 20180807]

Die Ergebnisse würden ungefähr so ​​aussehen:

20180801 // 1st Aug 2018
Event A

20180802 // 2nd Aug 2018
Event A

20180803 // 3rd Aug 2018
Event A
Event B

20180804 // 4th Aug 2018
Event A
Event B
Event C

20180805 // 5th Aug 2018
Event B

20180806 // 6th Aug 2018
[NO RESULT]

20180807 // 7th Aug 2018
Event C

20180808 // 8th Aug 2018
[NO RESULT]

20180809 // 9th Aug 2018
[NO RESULT]
...

Die einzige Möglichkeit, dies zu tun, besteht darin, ein einzelnes Datum abzufragen und dann das nächste abzufragen. Das kann keine gute Idee sein. Gibt es eine Möglichkeit, dieses scheinbar übliche Muster zu erreichen, datumsbasierte Ereignisse abzufragen und wie beschrieben zu formatieren?

Ein gutes Beispiel für diese Art von Verhalten ist die Barbican-Ereignisseite , von der ich glaube, dass sie Drupal verwendet. Es muss doch einen WordPress-Weg geben, um so etwas zu tun?

Danke fürs Lesen!

2
PUncle

Meine Idee folgt.

1. Ermittle das Array aller Metadaten, die deine Events haben. DISTINCT in der MySQL-Abfrage bedeutet keine Duplikate einschließen.

<?php
/*
 * From https://wordpress.stackexchange.com/a/9451/11761
 */
function get_all_possible_meta_dates( $key = 'event_dates_wp', $type = 'page', $status = 'publish' )
{

    global $wpdb;

    $result = $wpdb->get_col( $wpdb->prepare( "
        SELECT DISTINCT pm.meta_value FROM {$wpdb->postmeta} pm
        LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
        WHERE pm.meta_key = '%s'
        AND p.post_status = '%s'
        AND p.post_type   = '%s'
    ", $key, $status, $type ) );

    return $result;
}

2. Durchlaufe alle Posts mit dem Metaschlüssel event_dates_wp und erhalte das Posts-Objekt. Du brauchst es einmal.

3. Vergleichen Sie jedes Post-Meta mit den möglichen Daten, die Sie haben. Wenn es eine Übereinstimmung gibt, drucken Sie diese aus.

<?php
function print_posts_by_meta_dates()
{

    $args = [
        'post_type' => 'event',
        'order' => 'ASC',
        'orderby' => 'meta_value',
        'meta_key' => 'event_dates_wp',
        'posts_per_page' => -1,
    ];

    // all events having `event_dates_wp`
    $loop = new WP_Query( $args );

    // all posssible event dates
    $distinct_meta_dates = get_all_possible_meta_dates();

    foreach( $distinct_meta_dates as $event_meta_date ) {

        // date header
        echo '<h1>' . $event_meta_date . '</h1>';

        // loop through all events
        foreach( $loop->posts as $event ) {

            // get current event dates array
            $event_all_dates = get_post_meta( $event->ID, 'event_dates_wp', false );

            // compare
            if( in_array( $event_meta_date, $event_all_dates ) ) {

                // post name
                echo '<p>' . $event->post_name;

            }
        }
    }
}

4. Drucken Sie die Beitragsliste mit der Funktion print_posts_by_meta_dates() in einer Vorlage.

5. Oder erstellen Sie den Shortcode für den Beitrag oder die Seite.

add_shortcode( 'test_shortcode', 'print_posts_by_meta_dates' );

Sie erhalten etwas Ähnliches wie:

  • 20180801
    • testseite-1
  • 20180802
    • testseite-1
    • testseite-2
    • test-Seite-3
  • 20180803
    • testseite-2
    • test-Seite-3

Denken Sie daran, benutzerdefinierte Felder nicht mit e zu trennen. G. Komma, aber füge sie separat hinzu:

 enter image description here 

1
Max Yudin