Hide a single category in WordPress

Advertisement:

Kategorie in WordPress verstecken

Heute war ich mal wieder im WordPress Plugin Directory unterwegs. Ich sichte nach einem klitzekleinen Plugin, das eine einzelne Kategorie “versteckt”. Ich wollte aber nicht, dass alle Beiträge in dieser Kategorie ebenso versteckt sind. Das Plugin soll mir nur diese eine bestimmte Kategorie in den einzelnen Blogeinträgen und in der Sidebar-Kategorieliste ausblenden. Ich möchte nämlich Beiträge erstellen, die zusätzlich in einer Kategorie abgelegt sind, die nirgendwo angezeigt wird. Die Liste aller Beiträge in dieser Kategorie soll aber über den direkten Aufruf der Kategoriearchivseite abrufbar sein. Klar soweit? Nein? Gut, hier ein praktisches Beispiel:

Ich poste ja immer wieder Bilder meines Flickr-Accounts. Diese möchte ich in die Kategorie “Flickr” einsortieren. Die Kategorie “Flickr” soll aber nicht unterhalb des Beitrags in der Zeile “Dieser Artikel wurde gepostet in: Fotografie und Flickr” erscheinen. Hier soll nur “Dieser Artikel wurde gepostet in Fotografie” stehen. Außerdem soll die Kategorie “Flickr” nicht in der Seitenleiste unter “Kategorien” angezeigt werden. Ich möchte aber, dass alle Beiträge in “Flickr” über den Link /category/flickr angezeigt werden.

Zugegeben, das scheint eine ein abwägige Sache zu sein, aber es ist nur ein Beispiel.

Also habe ich, wie gesagt, das Plugin Directory durchsucht und irgendwie … nichts gefunden. Ich weiss nicht, ob es an der Suchfunktion an sich liegt, an den Beschreibungen der Plugins, oder an meinen Suchbegriffen (“exclude category”, “category exclusion”, “category visibility”, etc.). Jedenfalls habe ich hier nichts wirklich brauchbares gefunden. Die meisten Plugins können nur eines: Wähle eine oder mehrere Kategorien XY aus und diese werden dann komplett versteckt. Also nicht nur in der Sidebar, im Feed und in den Beiträgen, sondern auch die Beiträge innerhalb dieser Kategorien werden ausgeblendet. Das hilft mir so nicht weiter.

Also habe ich die Suchmaschine meines Vertrauens bemüht. Ziemlich zügig kam ich dann darauf, dass ich wohl die WordPress-Funktion the_category “hacken” muss. Denn genau hier möchte ich eingreifen und die Kategorie “verstecken”. Also habe ich an der Stelle weiter gegoogelt meine Suche weiter verfeinert und bin auf eine Lösung gestoßen, wie man einzelne Kategorien von der WordPress-Funktion the_category entfernen kann.

Der Code für die Kategorie-Einträge im Einzelbeitrag

Die Kategorie-ID erfährt man, in dem man im WordPress-Backend in der Kategorie-Bearbeitungsseite (/wp-admin/edit-tags.php?taxonomy=category) über die jeweilige Kategorie fährt bzw. den Link kopiert. Der sieht dann nämlich in etwa so aus: /wp-admin/edit-tags.php?action=edit&taxonomy=category&tag_ID=4&post_type=post. Das, was sich hier hinter der “tag_ID” verbirgt, ist nämlich die Kategorie-ID.

Den Code für die Funktion übernehme ich hier ganz frech aus der o.g. Quelle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function the_category_filter($thelist,$separator=' ') {
	if(!defined('WP_ADMIN')) {
		//Category IDs to exclude
		$exclude = array(17);
 
		$exclude2 = array();
		foreach($exclude as $c) {
			$exclude2[] = get_cat_name($c);
		}
 
		$cats = explode($separator,$thelist);
		$newlist = array();
		foreach($cats as $cat) {
			$catname = trim(strip_tags($cat));
			if(!in_array($catname,$exclude2))
				$newlist[] = $cat;
		}
		return implode($separator,$newlist);
	} else {
		return $thelist;
	}
}
add_filter('the_category','the_category_filter', 10, 2);

In der Zeile 4 trägt man die Kategorie-ID ein, die man ausschliessen möchte. Um mehrere Kategorien auszuschliessen, gibt man die Werte im Array einfach kommagetrennt ein, z.B. $exclude = array(1,7,25);

Damit wird dann die Kategorie, die anhand der ID(s) bestimmt wurde, nicht mehr im Beitrag angezeigt.

Das Kategorie-Widget

Der Eintrag der Kategorie wird nicht über die o.g. Funktion gesteuert. Hierfür brauchen wir eine andere. Dies wird aber im WordPress-Codex dokumentiert. Auch hier habe ich einfach den dort vorhanden Code per Copy & Paste verwendet:

25
26
27
28
29
30
31
32
33
34
function widget_categories_args_filter( $cat_args ) {
       $cat_list = array( 17 );
       if ( $cat_args['exclude'] ) {
               //TODO: write code to insert category ids into existing list
       } else {
               $cat_args['exclude'] = implode( ',', $cat_list);
       }
       return $cat_args;
}
add_filter( 'widget_categories_args', 'widget_categories_args_filter', 10, 1 );

Der Code sieht zwar wegen des Kommentars unvollständig aus, er tut aber trotzdem was er soll: nämlich aus dem Kategorie-Widget in der Sidebar (oder anderswo) die jeweilige Kategorie ausblenden.

Einbindung

Beide Funktionen müssen in der functions.php im WordPress-Theme eingebunden werden. Wer ein Standard-Theme verwendet, das regelmäßig vom Anbieter aktualisiert wird, dem empfehle ich das Anlegen eines Child-Themes. Das hat den Vorteil, dass bei der nächsten Theme-Aktualisierung die Einträge nicht verloren gehen.

Hinweise, wie ich den Code verbessern, verkleinern (verkürzen) kann, bin ich dankbar – da ich ja doch kein WordPress-Developer bin. Ich hab es so übernommen, wie es dort steht – und es funktioniert! :-)

Like this post? Share it!
Advertisement:

2 thoughts on “Hide a single category in WordPress

  1. Hallo Rob,

    vielen Dank für deinen Artikel.

    Ich selber bin gerade dabei und möchte eine bestimmte Kategorie von meiner Blog-Übersicht ausschließen und einen “extra Blog” bestehend aus dieser Kategorie erstellen.

    Im Prinzip genau wie du es möchtest, allerdings bin ich gerade etwas überfragt.

    Muss ich die kompletten Zeilen (1-23) aus deiner ersten Beschreibung so in die functions.php einfügen?
    Oder nur die Zeile 4?

    Ich hatte nun Zeile 1-22 eingefügt und die Kategorie ID eingefügt, trotzdem wird der Artikel angezeigt.

    Zeile 23 hatte ich jetzt nicht mit kopiert, da dort ja auch zwei ID’s stehen, ich aber leider nicht weiß, was mit diesen dann passieren wird.

    Vielleicht kannst du mir hier ja weiterhelfen :-)

    Viele Grüße
    Stefan

    • Hallo Stefan,

      ja, du musst Zeile 1 bis einschließlich 23 in die functions.php mit aufnehmen. Zeile 1 bis 22 ist die Funktion, die definiert welche Kategorien (Zeile 4, $exclude) ausgeblendet werden und wie dies geschehen soll.

      Zeile 23 fügt diese Funktion dem Kategorie-Filter hinzu und bestimmt, dass sie immer dann laufen soll, wenn eine Kategorieliste mit der u.g. Funktion abgefragt wird. Wenn du das weg lässt passiert, wie du beobachtest, nichts :-)

      [The the_category filter is] applied to the list of categories (an HTML list with links) created by the get_the_category_list function. Filter function arguments: generated HTML text, list separator being used (empty string means it is a default LI list), parents argument to get_the_category_list.

      Die Beiden Zahlen am Ende des Aufrus bestimmten die Priorität (10) und die Anzahl der Variablen, die dem Filter übergeben werden sollen (2, nämlich $thelist,$separator=' '

      Weitere Infos:
      WP code reference add_filter
      WP Plugin API/Filter Reference

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>