Unterkategorien mit Kategorieliste füllen

WordPress - In einer Hauptkategorie werden die Unterkategorien in einer ungeordneten Liste angezeigt

Wenn man im Standard-Theme eine Kategorie auswählt werden dort alle Beiträge aufgelistet, die sich in dieser Kategorie befinden. Oftmals ist dies nicht gewünscht – gerade wenn man WordPress-Artikel als CMS nutzen möchte. Folgender Ansatz bietet eine einfache Möglichkeit eine Liste der Unterkategorien anzeigen zu lassen – mit WP 2.9 getestet.

Die folgenden Arbeiten werden anhand des Kubrick-Themes vorgestellt. Dein Theme findest du im Verzeichnis wp-content/themes. Dort solltest du in absteigender Reihenfolge eine dieser drei Dateien vornehmen:

  • category.php
  • archive.php
  • index.php

Nun machen wir uns einmal grundlegend mit dem Theme vertraut. Ein wichtiger Bestandteil von WordPress ist die “Loop“. Diese könnte in etwa so aussehen:

< ?php if (have_posts()) : ?>
…
< ?php while (have_posts()) : the_post(); ?>

…< ?php the_content() ?>…

< ?php endwhile; ?>
…
< ?php endif; ?>

Die Loop wirft die Beiträge aus – dies soll nur geschehen wenn es keine Unterkategorie gibt. Es muss also eine Funktion her, die anhand der aufgerufenen Kategorie überprüft ob es eine Unterkategorie dazu gibt. Diese Aufgabe erfüllt folgende Funktion:

function subcategory_exists($catID) {
global $wpdb;
$abfrage = "SELECT parent FROM $wpdb->term_taxonomy WHERE parent = ".$catID;
$result = $wpdb->get_results($abfrage);
if (empty($result)) {return false;} else {return true;}
}

Diese Funktion wird in die functions.php im Theme-Verzeichnis eingetragen. Sie wirft anschaulich ein “Ja” zurück, wenn eine Unterkategorie existiert. Und genau in diesem Fall soll die Loop nicht ausgeführt werden, sondern eine Liste mit den verbleibenden Unterkategorien ausgegeben werden.

Nun kümmern wir uns um den Rest. Je nach Theme wird eine der oben genannten drei Dateien bearbeitet. Im Kubrick-Theme ist das die archive.php. Wenn eine Unterkategorie existiert wollen wir ein Menü mit den verbleibenden Unterkategorien einfügen und es sollen keine Beiträge ausgegeben werden. Kümmern wir uns zunächst um das erstere:

if (is_category()) { ?>
		<h2 class="pagetitle">Archive der Kategorie < ?php single_cat_title(); ?></h2>

< ?php 
if (subcategory_exists($cat)) {
echo  "<ul>";
wp_list_categories('child_of='.$cat.'&title_li=');
echo "";
} ?>
…

Der Einsatz der Funktion subcategory_exists ist klar. Die übergebene Variable $cat enthält die ID der aktuellen Kategorie. Die Loop wird nun folgendermaßen ergänzt:

< ?php while (have_posts()) : the_post(); ?>
		< ?php if (!(subcategory_exists($cat))) { ?>
		<div <?php post_class(); ?>>
…
< ?php the_content() ?>
…
< ?php } ?>
< ?php endwhile; ?>
</div>

Folglich werden Beiträge ausgegeben, wenn keine Unterkategorie existiert. Somit haben wir auch alles erreicht, was wir wollten.

Vorsicht: Dadurch sind Artikel, die in einer Oberkategorie liegen, für den Besucher nicht sichtbar. Trotzdem kann man diese über die direkte URL aufrufen – sofern diese bekannt ist.

13 Kommentare

  1. Michael

    Hallo Jan,

    ich habe Deinen Code ausprobiert.
    Leider werden weiterhin die Posts der Unterkatogieren angezeigt.
    Richtigerweise wird darüber jetzt aber eine Liste der Unterkategorien ausgegeben.

    Viele Grüße

    Micha

    • Fabian

      Hej Micha,

      wer ist Jan?;)

      In dem Artikel habe ich wohl nicht ganz sauber erklärt: Die Funktion subcategory_exists ermöglicht es zunächst einmal einfach abzufragen, ob eine Unterkategorie existiert. Was du nun damit machst ist natürlich deine Sache. Bei dir wird schätzungsweise der “else”-Teil fehlen:

      if (subcategory_exists($cat)) {
      //gebe die Menüliste aus
      }
      else {
      //hier kommt die Loop hin
      // also stehen nur Artikel hier, wenn keine Unterkategorie existiert
      }

      Ich denke mal, dass dieser Zweig bei dir fehlt.
      Lieben Gruß,
      Fabian

  2. Michael

    Ähm ich meine Fabian,

    sorry :)

    Also Die Funktion subcategory verstehe ich schon.

    Nur bin ich gerade erst dabei in die Loop einzusteigen. Bisher habe ich mich mehr mit Layout-Anpassung der Themes beschäftigt.

    normalerweise sollte es doch so aussehen oder?
    In der archive.php

    <?php if (subcategory_exists($cat)) {echo "”;
    wp_list_categories(‘child_of=’.$cat.’&title_li=’);echo “”; } ?>

    <div class="post" id="post-”>
    <a href="” rel=”bookmark” title=” “>

    |

  3. Michael

    ähm ahja Code hiereinschreiben ist wahrscheinlich nicht ganz so sinnvoll :)

  4. Michael

    //?php while (have_posts()) : the_post(); ?//

    //?php if (subcategory_exists($cat)) {echo “”;
    wp_list_categories(‘child_of=’.$cat.’&title_li=’);echo “”; } ?//
    //?php else : ?//

    //div class=”post” id=”post-”>
    <a href="” rel=”bookmark” title=” “>

    ……..
    ///div>

  5. Michael

    so sollte es doch richtig sein?
    Also die // natürlich=

    Gibt aber einen Fehler.

    VG

    Micha

    • Fabian

      Du kannst deinen Quelltext in code-Tags packen, dann gibt es keine Probleme.

      Bist du sicher, dass die archive.php auch verwendet wird? Zur Not nimm sie raus und probier das mal mit der index.php.

      Der schwer lesbare Quelltext sieht aber richtig aus. Du kannst trotzdem nochmal probieren statt
      … else : …
      einfach
      …} else {…} zu schreiben. Achte darauf, dass die Klammern richtig geöffnet und geschlossen werden.

  6. Michael

    Danke wieder für die schnelle Antwort.
    An Code Tags hatte ich nicht gedacht, sorry fürs Zumüllen :)

    Die Archive.php wird aber auf jeden Fall verwendet, denn die Liste wird ja korrekt ausgegeben. Nur Stopt das Script nicht.
    Also die Subcategory wird erfolgreich erkannt und die Liste der Unterkategorien wird ausgegeben.
    Danach gehts aber einfach weiter im Loop und ich bekomme den Stop nicht rein.

    Mit dem der Else funktion bekomm ich in beiden Varianten den Fehler
    “unexpected Else”.

    <?php if (subcategory_exists($cat)) { echo "";
    wp_list_categories('child_of='.$cat.'&title_li='); echo "";
    } ?>

    <div class="post" id="post-">
    <a href="" rel="bookmark" title=" ">

  7. Michael

    *seufz* hab doch code-Tags verwendet :(

    trotzdem schneidet er Teile raus

    <?php if (subcategory_exists($cat)) { echo "";
    wp_list_categories('child_of='.$cat.'&title_li='); echo "";
    } ?>

    <div class="post" id="post-">
    <a href="" rel="bookmark" title=" ">

  8. Michael

    Ich habs!

    Danke!
    Lag an der nicht abgeschlossenen else Anweisung mit < ?php } ?>

    • Fabian

      Jetzt war ich mal ein paar Stunden nicht da und schon hast du dein Problem selbst gelöst;)
      Dann wünsch ich noch viel Erfolg damit!
      Gruß

  9. Michael

    Ja aber nochmal vielen Dank für Deine Anleitung!

    Aber sag mal besteht die Möglichkeiten zu den ausgegebenen Unterkategorien noch eine Liste der Artikel in den Kategorien auszugeben?

    Also

    Sub_Kategorie A
    Artikel 1
    Artikel 2
    Sub_Kategorie B
    Artikel 1
    Sub_Kategorie C
    Artikel 1
    Artikel 2
    Artikel 3

    Wahrscheinlich nicht, da die Sub_kategorienliste ja keine Schleife sondern eine direkte Auflistung ist, oder?

    Gruß Micha

    • Fabian

      Möglich ist das sicherlich, aber ich weiß auch gerade nicht wie es einfach gehen könnte. Aber vielleicht hilft dir folgendes weiter:
      Du hast prinzipiell die aktuelle (Ober-)Kategorie-ID in $cat gegeben.
      Ohne Unterkategorie-Überschrift könntest du einfach eine Loop erzeugen – aber das macht die archive.php ja gerade normalerweise. Du kannst vllt. versuchen, nur eine “Überschrift” auszugeben, wenn es sich um eine noch nicht aufgelistete Kategorie handelt. Wobei das schon schwer werden kann, da ein Artikel mehreren Kategorien zugeordnet werden kann.

      Wenn du dazu nichts bei einer Suchmaschine findest, kannst du sicherlich im WordPress-Deutschland-Forum nachfragen. Ich glaube die können da sehr kompetent helfen.

      Viel Erfolg:)

Kommentieren