wake-up-neo.net

Abfrage aktueller und zukünftiger Ereignisse, sortiert nach Startdatum

Unter Verwendung der Benutzeroberflächenerweiterung "Benutzerdefinierter Beitragstyp" habe ich einen benutzerdefinierten Beitragstyp "Ereignis" erstellt. Diese Felder werden mit benutzerdefinierten Feldern (erstellt mit der Erweiterung "Erweiterte benutzerdefinierte Felder") wie "Datums-Debüt" und "Datums-Fin" ausgefüllt. .

Auf einer Archivseite, die diesem Beitragstyp gewidmet ist, versuche ich, die 10 nächsten (aktuellen oder zukünftigen) Ereignisse in chronologischer Reihenfolge nach dem Anfangsdatum anzuzeigen.

Der Sortierteil scheint von sich aus in Ordnung zu sein. Aber es funktioniert nicht mehr, wenn ich die Tests zu Daten hinzufüge, und sowieso funktionieren diese auch nicht.

Hier ist mein Code:

        $current_date = date('ymd');
        $my_query = new WP_Query( array ( 
        'post_type'         => 'mna_event',
        'posts_per_page'    => 10,
        'orderby'           => 'meta_value_num',
        'meta_key'          => 'date_debut',
        'order'             => 'ASC',
        'meta_query'        => array (
            'relation'      => 'OR',
            array (
                'key'       => 'date_debut',
                'value'     => $current_date,
                'compare'   => '>='
                ),
            array (
                'key'       => 'date_fin',
                'value'     => $current_date,
                'compare'   => '>='
                )
            )
        )
    );

Beratung in der Sache wäre sehr dankbar. Vielen Dank

2
tosca

Dies geschieht aufgrund der ORname__-Beziehung auf meta_query und der Art und Weise, wie WordPress die tatsächliche Abfragezeichenfolge generiert. Sie müssen den meta_key und orderbyaus den Abfrage-Args auslassen und den posts_clauses-Filter einbinden, um die Teile whereund orderbyder Abfrage zu ändern:

function wpse_130954_orderby_fix($pieces){
    global $wpdb;
    $pieces['where']  .= " AND $wpdb->postmeta.meta_key = 'date_debut'";
    $pieces['orderby']  = "$wpdb->postmeta.meta_value ASC";
    return $pieces;
}

Fügen Sie den Filter hinzu, bevor Sie Ihr WP_Query-Objekt einrichten, und entfernen Sie ihn anschließend, nachdem Sie Ihre Abfrage ausgeführt haben, um andere Abfragen nicht zu beeinträchtigen:

add_filter( 'posts_clauses', 'wpse_130954_orderby_fix', 20, 1 );
$current_date = date_i18n('Y-m-d');
$my_query = new WP_Query( array ( 
    'post_type'         => 'mna_event',
    'posts_per_page'    => 10,
    'meta_query'        => array (
        'relation'      => 'OR',
        array(
            'key'       => 'date_debut',
            'value'     => $current_date,
            'compare'   => '>=',
            'type'      => 'DATE'
            ),
        array(
            'key'       => 'date_fin',
            'value'     => $current_date,
            'compare'   => '>=',
            'type'   => 'DATE'
            )
        )
    )
);

$result = $my_query->posts;

remove_filter( 'posts_clauses', 'wpse_130954_orderby_fix', 20 );

UPDATE: Verwenden Sie das Format yy-mm-dd für Ihre Datumsfelder in den ACF-Einstellungen. (yy-mm-dd in JS/ACF == Y-m-d in PHP/MySQL datetime format) Ich habe den obigen Code für dieses Format aktualisiert. ($current_date Format aktualisiert und 'type' => 'DATE' in meta_query hinzugefügt)

3
Parham