Wie bestellt ich Beiträge nach einem benutzerdefinierten Feld und filtert sie durch einen anderen?

wordpress.stackexchange https://wordpress.stackexchange.com/questions/1839

  •  16-10-2019
  •  | 
  •  

Frage

In meinem WordPress -Blog habe ich Veranstaltungen, die ich bestellen und nach benutzerdefinierten Feldern filtern möchte. Die Bestellung sollte durch das benutzerdefinierte Feld "event_date_end" erfolgen, was bedeutet, dass jedes Ereignis, das noch ausgeführt wird, angezeigt werden sollte.

Um die Ereignisse zu bestellen, verwende ich ein zweites benutzerdefiniertes Feld "event_date_start". Ein Ereignis, das am 10. beginnt und am 20. endet, sollte es bis zum 20. angezeigt werden, sollte jedoch neben allen anderen Ereignissen ab dem 10. bestellen.

Ich verwende thematisch als übergeordnetes Thema und benutze die Funktion query_posts (), die beide Regeln als Parameter hinzufügt. So verwende ich es in der Indexschleife:

function my_index_loop($content) {
    global $query_string;
    query_posts($query_string
    // filter by event_date_end
    ."&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Y-m-d')
    // order by event_date_start
    ."&meta_key=event_date_start&orderby=meta_value&order=ASC"); 
}
add_filter('thematic_indexloop', 'my_index_loop');

Jetzt werden die Beiträge korrekt bestellt, aber auch der Filter erfolgt mit dem Wert "Event_date_start". Eine Veranstaltung, die gestern begonnen wurde und immer noch weitergeht, wird nicht angezeigt.

Wenn ich die Reihenfolge der Teile "Filter" und "Bestellung" wechsle, werde ich alle Ereignisse sehen, aber ein Ereignis, das am 10. und am 20. endet, wird am 20. an alle Veranstaltungen platziert.

Ich weiß, dass ich selbst Abfragen in SQL erstellen kann, aber werden sie mit Thematik arbeiten? Und wie muss ich Aussagen für Archiv, Kategorie und Tag -Auflistung schreiben?

Die Lösung:

Nachdem ich die genannten Seiten gelesen hatte, fand ich die folgende Lösung. Ich musste einige rohe SQL verwenden und sie durch Filter innerhalb des spezifischen Schleifenfilters hinzufügen. Dies sind die Funktionen, die ich hinzugefügt habe:

function my_loop_where($where){
    global $wpdb;
    $where .= " AND pm_where.meta_value >= '".date('Y-m-d')."'";
    return $where;
}

function my_loop_join($join){
    global $wpdb;
    $join .= " LEFT JOIN " . $wpdb->postmeta . " AS pm_order ON (" . $wpdb->posts . ".ID = pm_order.post_id AND pm_order.meta_key = 'event_date_start')";
    $join .= " LEFT JOIN " . $wpdb->postmeta . " AS pm_where ON (" . $wpdb->posts . ".ID = pm_where.post_id AND pm_where.meta_key = 'event_date_end')";
    return $join;
}

function my_loop_order(){
    return 'pm_order.meta_value ASC';
}

Und als ich einfach Filter zu diesen Funktionen innerhalb der EG -Indexschleife hinzugefügt habe:

function my_index_loop($content) {
    global $query_string;
    add_filter('posts_where', 'my_loop_where' );    
    add_filter('posts_join', 'my_loop_join' );
    add_filter('posts_orderby', 'my_loop_order' );
    query_posts($query_string . "&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Y-m-d')/*."&meta_key=event_date_start&orderby=meta_value&order=ASC"*/);
}
add_filter('thematic_indexloop', 'my_index_loop');

Jetzt kann ich diesen Filter und die Bestellung auf den Index- und Kategorieschleifen leicht verwenden, aber den Standardfilter und Bestellungen auf den Archivseiten aufbewahren.

War es hilfreich?

Lösung

Dies wird nicht funktionieren, da Sie gleiche festlegen meta_key Parameter zweimal mit unterschiedlichen Werten und nur einer ist wirksam.

Anstatt rohe Fragen zu erstellen, ist es besser, Filter zu verwenden, um die WP -Abfrage zu ändern. Abfrageübersicht Die Dokumentation enthält eine Liste der Hooks, in denen Sie Ihre Mods einfügen können (wie das Ende unter Welche Plugins können ändern).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top