it-swarm.com.de

Verwenden Sie meta_query, um Ereignisse nach Datum in einem benutzerdefinierten Feld anzuzeigen

Ich arbeite an einer Vorlage für ein bestimmtes Kategoriearchiv des Ereignisses mit benutzerdefiniertem Beitragstyp.

Ich muss eine Abfrage durchführen, die zukünftige und laufende Ereignisse anzeigt und nach Datum im benutzerdefinierten Feld sortiert.

$termName = get_queried_object()->name;
$termSlug = get_queried_object()->slug;
$event1 = current_time('Y-m-d');

$args = array(
    'post_type' => 'event',
    'event-categories' => $termSlug,
    'post_status' => 'publish',
    'posts_per_page' => 10,
    'order' => 'ASC',
    'meta_query' => array(
        'relation'    => 'OR',
        array(
            'relation'    => 'AND',

        array(

            'key' => '_event_start_date',
            'value' => $event1,
            'compare' => '>=',
            'type' => 'DATE',

        ),


        array(

            'key' => '_event_end_date',
            'value' => $event1,
            'compare' => '>=',
            'type' => 'DATE',

        )
        ),
        array(
            'key' =>  $event1,
            'value' => array('_event_start_date','_event_start_date'),
            'type' => 'DATE',
            'compare' => 'BETWEEN'
        )

    ),

     'orderby' => '_event_start_date',
 );
$events = new WP_Query($args);
echo $events->post_count   ;

Das Ergebnis zeigt nur die zukünftigen Ereignisse, aber keine laufenden Ereignisse.

Was ist falsch?

2
Filippo Tah

Einfacher CODE:

Wenn Sie >= sowohl für _event_start_date als auch für _event_end_date prüfen, wird die BETWEEN-Prüfung logischerweise automatisch abgedeckt.

Der folgende CODE sollte also funktionieren:

$termName = get_queried_object()->name;
$termSlug = get_queried_object()->slug;
$event1 = current_time( 'Y-m-d' );

$args = array(
    'post_type'        => 'event',
    'event-categories' => $termSlug,
    'post_status'      => 'publish',
    'posts_per_page'   => 10,
    'order'            => 'ASC',
    'meta_query' => array(
        'relation'    => 'OR',
        array(
            'key'     => '_event_start_date',
            'value'   => $event1,
            'compare' => '>=',
            'type'    => 'DATE',
        ),
        array(
            'key'     => '_event_end_date',
            'value'   => $event1,
            'compare' => '>=',
            'type'    => 'DATE',
        )
    ),
    'orderby' => '_event_start_date',
);
$events = new WP_Query( $args );
echo $events->post_count;

Datumskontrolle:

Stellen Sie außerdem sicher, dass der Datumswert $event1 richtig als der in der Datenbank (in der Post-Meta-Tabelle) gespeicherte Wert festgelegt ist. Normalerweise betrachtet WordPress intern alle date in der Zeitzone GMT. Dies kann jedoch variieren, je nachdem, wie der _event_start_date und der _event_end_date in Ihrem Fall gespeichert werden. Sie kann je nach gespeichertem Wert unterschiedlich sein:

// MySQL DATETIME field format
$event1 = current_time( 'mysql' );

// MySQL DATETIME field format in GMT
$event1 = current_time( 'mysql', 1 );

// Unix timestamp in local time zone
$event1 = current_time( 'timestamp' );

// Unix timestamp in GMT
$event1 = current_time( 'timestamp', 1 );

Überprüfen Sie daher besser, wie diese Daten gespeichert werden, oder testen Sie sie mit diesen Abweichungen. Wenn date-Felder auch Zeit enthalten, können Sie auch mit dem Typ DATETIME arbeiten.

Auch eine Notiz von codex :

Der Typ DATE arbeitet nur dann mit dem Vergleichswert BETWEEN, wenn das Datum im Format YYYY-MM-DD gespeichert und mit diesem Format getestet wurde.

tax Abfrage:

Die alte tax-Abfrage ist veraltet. Anstatt also:

'event-categories' => $termSlug,

benutzen:

'tax_query' => array(
    array(
        'taxonomy' => 'event-categories',
        'field'    => 'slug',
        'terms'    => $termSlug,
    ),
),
1
Fayaz