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

Divi: Premium-Theme für WordPress
Werbung

Geschrieben von Vladimir

Vladimir Simović, arbeitet seit 2000 mit HTML & CSS und seit Januar 2004 mit WordPress. Im Laufe der Jahre hat er diverse Fachbücher und Fachartikel publiziert.

  1. Hintergründe und Erläuterungen zu meiner Funktion mit einigen Zusatzinfos zum Hook gibt es auch in deutscher Sprache, wer mag.

  2. 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?

  3. Nachtrag: Hab grad deinen anderen Beitrag gesehen: http://bueltge.de/keine-sub-kategorien-im-loop-von-wordpress/901/

    Nutze jetzt den 2. Snippet und dieser funktioniert so wie er soll, danke dir vielmals!

Kommentare sind geschlossen.