Für Menschen · Seien Sie begeistert und Sie werden begeistern !
Nicht immer soll die Ausgabe des Loop innerhalb einer Kategorie die Unterkategorien enthalten. Um das zu bewerkstelligen kann man einen eigene WP Query bauen und jeweils ein Template erstellen, siehe einige Tipps und Hinweis dazu in einem anderen Beitrag von mir. Alternativ kann man aber auch einen Hook nutzen und alle Unterkategorien zu filtern. Die folgende Syntax ablegen in der functions.php des Themes oder in ein Plugin auslagern und fertig.
Alternativ kann man diesen Hook aber auch zu anderen Sachen benutzen. Auch dazu möchte ich hier einige Worte verlieren.
Der Hook posts_where ist eine wichtige Möglichkeit um auf den Query von WordPress Einfluss zu nehmen und daher ein Bestandteil des Query: $where = apply_filters('posts_where', $where);. Er dient beispielsweise dazu, den Query von WordPress zu erweitern. Dabei wird immer ein Parameter übergeben. Dieser kann mit jede Art von SQL-Anweisungen befüllt werden.
Ein bekanntes Beispiel ist eventuell mein Artikel zum verspäteten Veröffentlichen von Feeds: „WordPress Feed zeitversetzt befüllen“.
Eine weitere Möglichkeit ist es, wie schon im Eingang angesprochen, dass bei der Ausgabe innerhalb von Kategorien die Unterkategorien nicht gelistet werden sollen. Die folgende Syntax tut genau dies.
if ( !function_exists('fb_filter_child_cats') ) {
function fb_filter_child_cats( $cats= '' ) {
global $wp_query, $wpdb;
if ( is_category() ) {
// get children ID's
if ( $excludes = get_categories( "child_of=" . $wp_query->get('cat') ) ) {
// set array with ID's
foreach ( $excludes as $key => $value ) {
$exclude[] = $value->cat_ID;
}
}
// remove child cats
if ( isset($exclude) && is_array($exclude) ) {
$cats .= " AND " . $wpdb->prefix . "term_taxonomy.term_id NOT IN (" . implode(",", $exclude) . ") ";
}
}
return $cats;
}
if ( !is_admin() ) {
add_filter( 'posts_where', 'fb_filter_child_cats' );
}
}
Um ein stabileres Ergebnis zu erzielen, sollte man möglichst SQL Selects umgehen und damit stabiler in WP zu bleiben. Daher hier eine weitere Lösung für die Filterung der Kinder-Kategorien:
function fb_filter_child_cats($query) {
$cat = get_term_by('name', $query->query_vars['category_name'], 'category');
$child_cats = (array) get_term_children( &$cat->term_id, 'category' );
if ( !$query->is_admin )
$query->set( 'category__not_in', array_merge($child_cats) );
return $query;
}
add_filter( 'pre_get_posts', 'fb_filter_child_cats' );
Ein weiteres Beispiel soll zeigen, wie man den Query erweitert. Dabei beziehe ich mich auf einige Fragen aus der WP Hacker Mailingliste, die eigentlich dort nicht hingehören, dazu ist das Forum da.
In die Funktion habe ich mal drei Beispiele integriert.
Ich hoffe, dass die Möglichkeiten damit recht gut dargestellt werden.
if ( !function_exists('fb_filter_where') ) {
function fb_filter_where( $where = '' ) {
global $wpdb;
// allow future posts in loop
$where .= " OR $wpdb->posts.post_status = 'future' ";
// show pages in loop
$where .= " OR $wpdb->posts.post_type = 'page' ";
// only older (<) as 5 days
$where .= " AND post_date < '" . date('Y-m-d', strtotime('-5 days')) . "'";
return $where;
}
if ( !is_admin() ) {
add_filter( 'posts_where', 'fb_filter_where' );
}
}
Die Möglichkeiten sind sehr flexibel und im Grunde nur abhängig von den SQL-Abfragen. Damit sollte der Hook ein wenig verständlicher sein und seine vielseitigen Möglichkeiten lassen sich nur annähernd darstellen. Dieser Hook ist nur einer von vielen Hooks, die die Flexibilität von WordPress auszeichnen.
bueltge.de [by:ltge.de] wird von Frank Bültge geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.
Das Weblog wird angetrieben von WordPress und aktuell gibt es 980 Beiträge, 18722 Kommentare in 14 Kategorien und 464 Tags.
Das Blog wird liebevoll mit xHTML & CSS in Handarbeit gestaltet. Erstellt mit ♥ zum Befüllen und Erhalten.
Design und Code ist unter Copyright
© 2001 - 2012 bueltge.de [by:ltge.de]
13. November 2009 um 21:51
Dieser Post machte meinen Tag! Danke.
13. Oktober 2010 um 17:51
An welcher Stelle der functions.php füge ich den Code ein?
habe ihn ans Ende gestellt und erhalte die Fehlermeldung über die Zeile:
add_filter( 'posts_where', 'fb_filter_where' );
14. Oktober 2010 um 09:51
@Jens: wo ist egal, Hauptsache innerhalb von PHP
<?php ?>18. Oktober 2010 um 19:11
Jetzt wollte ich mich fast beim falschen bedanken....
Diese Erweiterung der functions.php ist aus meiner Sicht ein muss will ich WordPress als CMS System einsetzen und die Kategorien als hierarchische Verzeichnisstruktur nutzen.
8. Januar 2011 um 19:30
Ist es denn möglich der oberen Funktion auch zu sagen, welche Unterkategorien ausgeschlossen werden sollen? Ich möchte z.B. nur Artikel von zwei Unterkategorien ausschließen.
Danke,
Wolf
9. Januar 2011 um 12:47
@Wolf Larsen: diese solltest du über den Query steuern, siehe dieser Beitrag.
25. Februar 2011 um 14:22
Servus Frank,
der Code für das Ausnehmen der Subkategorien scheint bei mir nach dem Update auf 3.1 nicht mehr zu funktionieren. Die Oberkategorie bleibt leer, obwohl dort Artikel liegen. Wenn ich den Code aus meiner function lösche, dann habe ich wieder den gewohnten Anblick, also den WordPress-Standard. Danke!
Wolf
6. März 2011 um 14:25
Hi Frank!
Habe Deinen Artikel zu diesem Thema auf wpengineer.com gelesen. Hast Du eine Idee, wieso der Code nicht mehr mit WP 3.1 funktioniert? Beim Einsatz des Codes in der functions.php wird in der Hauptkategorie überhaupt kein Artikel mehr angezeigt.
9. März 2011 um 22:28
@Michael: prüfe mal diesen, sollte gehen:
11. März 2011 um 19:29
Hallo Frank!
Danke für Deine Rückmeldung, aber leider ist der von Dir gepostete Code mit dem von der wpengineer Seite identisch. Das funktioniert leider nicht.
14. März 2011 um 09:17
@Michael: ja, der ist so gut wie immer der gleiche, da ich ja beide Blogs betreibe und update. Ich habe aber in einem Beispiel getestet und in den Archiven waren die child-cats nicht mehr gelistet. Was funktioniert nicht, wie sieht deine Ausleitung aus; also was passiert?
14. März 2011 um 19:02
Hi!
Wie in #8 beschrieben erscheinen mit diesem Code keine Artikel mehr in der Elternkategorie. Stattdessen erhalte ich dort eine Meldung, dass keine passenden Beiträge gefunden werden können (Meldung kommt aus der archive.php). Klicke ich auf eine Unterkategorie, werden mir dort die zugeordneten Artikel angezeigt. Wie gesagt, ist das erst seit WP 3.1 so. Vorher funktionierte es wie von Dir beschrieben.
Beispiel WP 3.0.4
Beispiel WP 3.1
14. März 2011 um 22:11
@Michael: ich schaue nochmal, aber genau das habe ich im Test versucht - bei Darstellung der Elternkategorie waren nur die Artikel in dieser Kategorie enthalten, nicht die aus der Kinder-Kategorie.
14. März 2011 um 23:20
@Michael: irgendwie hatte ich via Copy/paste den gleichen Code nochmal rein gepackt, teste nun mal meinen Kommentar
14. März 2011 um 23:35
@Michale: ich denke, dass ich eine bessere Lösung habe, ohne DB-select, was es stabil gegenüber den WP Versionen macht:
16. März 2011 um 18:30
Hallo Frank!
Sorry, für die späte Rückmeldung! Hab in letzter Zeit einiges zu tun und komm nur noch Abends zu den WP-Geschichten...
Vielen vielen Dank! Der Code aus #9 funktioniert nun wieder. Super!
Natürlich habe ich auch Deinen zweiten Versuch mal getestet, aber da werden die Unterkategorien nicht herausgefiltert und erscheinen demnach noch in den Elternkategorien.
Trotzdem ein dickes Dankeschön für Deine Mühe! Ich schau aber die Tage nochmal rein, vielleicht hast Du ja noch eine Idee bezgl. #15.
Gruß
Michael
16. März 2011 um 23:26
@Michael: ich denke ich habe eine Lösung gefunden, wenn man WP in De betreibt, dann habe ich die ID nicht in $query, daher ging es bei mir im englischen Blog, meine neue Version holt die Id aus dem Namen und ging eben in allen Tests.
23. März 2011 um 19:32
Hallo Frank!
Sorry für die späte Rückmeldung! Habe nun mal Deine 2te Variante aus #17 getestet. Die scheint auch problemlos zu funktionieren. Super! Herzlichen Dank nochmal für Deine Arbeit!
14. April 2011 um 03:03
Hallo Frank!
ich bin immer noch am tun wegen diesen ausgenommenen Unterkategorien. Mit 3.0.5 und dem alten Code ging alles wunderbar. Mit 3.1 brachte ich nichts zu stande. Nun mit 3.1.1 habe ich folgendes Verhalten: Der Code aus Beitrag 15 und 17 filtert überhaupt nichts, wie Standard also.
Der Code aus Beitrag 9 ist besser, aber er lässt trotzdem eine andere Unterkategorie zu. Ich habe also alle meine Beiträge aus der Oberkategorie und zwei Beiträge aus einer Unterkategorie. Ich habe schon die Unterkategorie umbenannt, gelöscht und unter anderem Namen angelegt, nichts. Wenn ich die beiden Beiträge in eine andere schon angelegte Unterkategorie verschiebe, dann geht es. Sowas macht mich fast verrückt
Ich schwöre, dass es mit 3.0.5 schon ging
Die Kategorie zum schauen ist hier:
http://tinyurl.com/67l3trlDanke,
Wolf
16. April 2011 um 11:08
Hallo Frank,
ich habe nochmal geforscht. Komischerweise ist es so, dass neue oder bis vor einiger Zeit angelegte Unterkategorien einfach nicht aus der Oberkategorie verschwinden. Schon ältere bestehende Unterkategorien werden aber ausgenommen. Da bin ich echt ratlos.
Wolf
19. Mai 2011 um 10:45
Hallo,
ich habe das Problem, dass ich genau das umgekehrte benötige. Die Kategorie-Seiten zeigen bei mir nur die Artikel der Hauptkategorie und nicht auch die der Sub-Kategorien an.
Weisst Du da evt. Rat?
Danke
Mark
23. Mai 2011 um 13:12
@Mark: es sollte reichen, wenn du category__not_in in category__in änderst.