WordPress 3.0: Beiträge in Oberkategorien anzeigen

KategorienauswahlHeute mal wieder ein kleiner Code-Schnipsel für WordPress. Ich habe gerade eine neue Seite aufgebaut, die u.a. Unterkategorien enthält. Unter WP 3.0 stellte sich dann heraus, dass im Archiv der Oberkategorie keine Beiträge einer Unterkategorie angezeigt werden, wenn diese nur der Unterkategorie zugeordnet sind. Wenn ich also die Kategorie „Romane“ als Unterkategorie von „Bücher“ habe, dann will ich ja beim Klick auf „Bücher“ auch alle Beiträge zu Romanen sehen. Als Autor nervt es aber, wenn man immer beide Kategorien anhaken muss, und gerade bei fremden Autoren kann man es schlicht nicht garantieren, dass sie dran denken.

Per Google sah es übrigens so aus, als wäre das das Standardverhalten von WP (gewesen?), da ich nur Forenbeiträge fand, in denen Leute nach genau der entgegengesetzten Lösung fragten. Bei meiner WP 3.0-Installation mit Twenty Ten und ohne Plugins wurden die Beiträge der Unterkategorie jedoch nie in der Oberkategorie angezeigt. Vielleicht wurde das also mit WP 3.0 geändert?!

So oder so, es gibt dafür nun zwei Möglichkeiten: Die Query anpassen beim Aufruf der Oberkategorie oder das Speichern anpassen, so dass der Beitrag automatisch immer auch allen Oberkategorien zugeordnet wird. Da es einfacher und schneller ging, habe ich letztere Lösung umgesetzt. Den folgenden Code braucht ihr nur in die functions.php eures Themes zu packen oder in ein kleines Funktions-Plugin:

/**
 * Makes sure that if a sub-category is selected when saving a post, that all
 * parent categories are also selected.
 * 
 * @param categoryIds The array of selected category IDs.
 */
function jr_add_parent_category($categoryIds) {
  $catsToAdd = array();
  if (!$categoryIds || empty($categoryIds)) {
    return $categoryIds;
  }
  foreach ($categoryIds as $catId) {
    while ($catId != '') {
      $catObject = &get_category($catId);
      if (is_wp_error($catObject) || !$catObject->parent
          || ($catObject->parent == $catObject->term_id)) {
        $catId = '';
        continue;
      }
      if (!in_array($catObject->parent, $categoryIds)) {
        $catsToAdd[] = $catObject->parent;
      }
      $catId = $catObject->parent;
    } /* end while parents */
  } /* end foreach category */
  foreach ($catsToAdd as $catId) {
    $categoryIds[] = $catId;
  } /* end foreach category */
  return $categoryIds;
}

add_filter('category_save_pre', 'jr_add_parent_category');

Getestet mit: WordPress 3.0

Damit sollten nun automatisch auch immer alle Oberkategorien mitgespeichert werden. Das wirkt natürlich nur für Beiträge, die danach gespeichert werden. Es kann also nicht automatisch eine bestehende Seite anpassen.

Wie immer gilt: Der Code wurde getestet und wird von mir in einem Projekt soweit erfolgreich eingesetzt. Garantien, dass er Bug-frei ist, gibt es aber natürlich nicht. Über Kommentare dazu freue ich mich, auch bei Problemen sagt bitte Bescheid. Geschrieben habe ich den Code für WP 3.0, es sollte aber auch mit neueren Versionen gehen sowie mit älteren bis mindestens WP 2.6 (den verwendeten Filter gibt’s schon ewig, also vielleicht klappt das sogar in Uralt-WPs).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Bitte beachte die Kommentarregeln: 1) Kein Spam, und bitte höflich bleiben. 2) Ins Namensfeld gehört ein Name. Gerne ein Pseudonym, aber bitte keine Keywords. 3) Keine kommerziellen Links, außer es hat Bezug zum Beitrag. mehr Details...

So, noch mal kurz drüber schauen und dann nichts wie ab damit. Vielen Dank fürs Kommentieren! :-)