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
Dies geschieht aufgrund der OR
name__-Beziehung auf meta_query
und der Art und Weise, wie WordPress die tatsächliche Abfragezeichenfolge generiert. Sie müssen den meta_key
und orderby
aus den Abfrage-Args auslassen und den posts_clauses
-Filter einbinden, um die Teile where
und orderby
der 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)