WordPress: Artikel aus Unterkategorien ausblenden

Nachtrag: habe im WordPress-Newsletter Nr. 8 falschen Link gesetzt gehabt. Der Link zu Anleitung wegen des Blog-Archivs: WordPress: Blog-Archiv mit Bordmitteln.

Nehmen wir mal an, man möchte, wie im letzten Artikel beschrieben, ein Lexikon oder Glossar auf Basis von WordPress aufbauen. Die Hauptkategorie heißt Lexikon und die Unterkategorien sind die einzelnen Anfangsbuchstaben (A-Z). In den jeweiligen Unterkategorien, werden die Lexikoneinträge als einzelne Artikel abgelegt. So weit so gut.

Standardmäßig werden in WordPress, wenn man die Hauptkategorie aufruft, auch die Artikel aus den zugehörigen Unterkategorien aufgelistet. Das ist aber nicht wünschenswert und im speziellen Fall hat der Kunde den Wunsch gehabt, dass man beim Aufruf der Hauptkategorie, also Lexikon, nur die Artikel der Hauptkategorie zu sehen bekommt und erst wenn man die Unterkategorien ansteuert auch die jeweiligen Einträge des Lexikons aufgelistet werden.

Mit dem Plugin Simply Exclude kam ich nicht wirklich weiter, weil das Mechanismus, mit dem man die einzelnen Kategorie-Archive ein- und ausblenden kann nicht fein genug war.

Kategorien im Theme filtern

Eine zweite Möglichkeit um Artikel bestimmter Kategorien aus dem Loop herauszufiltern bietet mir der Template-Tag query_post. Wenn ich diesen Template-Tag vor dem Loop, des entsprechenden Kategorie-Templates (hier category-lexikon.php) notiere, dann kann ich Artikel aus nur bestimmten Kategorien erlauben:

<?php query_posts('cat=3,4,5'); ?>

oder aus dem Loop ausschließen:

<?php query_posts('cat=-3,-4,-5'); ?>

[adrotate banner=”18″]

Es gibt hierbei allerdings zwei Probleme: Zum einen ist das sehr mühselig wenn es sehr viele Unterkategorien gibt, die man ausblenden muss, weil man die IDs komplizierter weise erst im Backend erfährt, indem man mit der Maus über die einzelnen Kategorielinks fährt. Zum anderen können sich die Kategorie-IDs ändern, wenn man zum Beispiel mit dem Weblog umzieht.

Ich fände es bei dieser Methode viel sinnvoller, wenn man dem Ausschlussverfahren auch mit Kategorienamen arbeiten könnte, zum Beispiel query_posts('cat=-lexikon,-allgemein');, weil man sich dadurch zum einen die mühsame Suche nach den IDs sparen kann und weil die Namen der Kategorie üblicherweise auch über einen Umzug hinaus “überleben”.

Unterkategorien per functions.php aussieben

Wem das alles zu mühsam ist, der kann einfach folgenden Code in die functions.php einfügen:

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' );
    }
}

Quelle: WP Engeneer

Wir arbeiten seit 20 Jahren mit WordPress und bieten diverse Dienst­leistungen rund um das System an. Kontaktiere uns für weitere Informationen oder für ein Angebot.

Verwandte Beiträge:

3 Kommentare

  1. Hey,
    danke dir für den Snippet. Es gibt allerdings ein kleines Problem: Wenn ich einen Artikel in die Hauptkategorie speichere und diese dann Aufrufe, sagt er mir das in dieser Kategorie keine Artikel gefunden wurden. Woran kann das liegen?

Kommentare sind geschlossen.