Die Ausgabe der Kategorien kann sehr unübersichtlich werden und ab und an sind auch Kategorien für bestimmte Zwecke angelegt, aber nicht dem Schreiben von Beiträgen zu bestimmten Kategorien. Daher kann es sinnvoll sein, wenn man Kategorien in der Metabox beim Schreiben eines Beitrags filtert. WordPress bietet dazu einen Filter und anhand zweier Beispiele zeige ich kurz das Vorgehen.
Im ersten Fall werden zwei Kategorien gefiltert. Es gibt lediglich eine Einschränkung: der Filter ist nicht (!
) aktiv, wenn der eingeloggte User das Berechtigungsobjekt manage_categories
hat; im Standard sind das die Rollen Administrator & Editor, siehe Übersicht der Objekte im Codex. Der Filter ist im Grunde so aufgesetzt, dass man das SQL-Statement erweitert und in die Klammer gehören die Titelform (slug) der Kategorien.
Es ist zu bedenken, dass diese kleine Funktion damit im Frontend und Backend zieht und die Kategorien werden überall gefiltert, daher im zweiten Beispiel eine erweitere Lösung.
function fb_list_terms_exclusions($args) {
$where = '';
if ( !current_user_can('manage_categories') )
$where = " AND t.slug NOT IN ('uncategorized', 'category-2')"; // slug of categories
return $where;
}
add_filter( 'list_terms_exclusions', 'fb_list_terms_exclusions' );
Im zweiten Beispiel werden die Abfragen erweitert, so dass wir eine Filterung getrennt in Frontend und Backend haben. natürlich ist auch nur dies ein Beispiel und kann auf verschiedene Anforderungen hin erweitert werden.
Im Beispiel habe ich die beiden Variablen $pagenow
und $post_type
global gesetzt. Diese Variablen sagen uns, wo und was im Backend gerade aktiv ist. In dem kleinen Beispiel wird der Filter im Backend (is_admin()
) nur angewandt, wenn der Post Type post
ist (==
). Ebenfalls könnte man via $pagenow auf die Seite prüfen, zum Beispiel post.php
.
Das Frontend wird im ersten Schritt angesprochen, immer wenn man nicht im Admin ( !is_admin()
) ist, werden die beiden Kategorien gefiltert.
function fb_list_terms_exclusions($args) {
global $pagenow, $post_type;
$where = '';
// filter only for frontend
if ( !is_admin() ) {
$where = " AND t.slug NOT IN ('uncategorized', 'category-2')"; // slug of categories
}
// backend, only on post-type post
if (
'post' == $post_type &&
is_admin() &&
!current_user_can('manage_categories')
) {
$where = " AND t.slug NOT IN ('slider')"; // slug of category
}
return $where;
}
add_filter( 'list_terms_exclusions', 'fb_list_terms_exclusions' );
Viel Potential für Anpassungen; aber auch ein Schritt um das Backend an die Bedürfnisse der Autoren anzupassen. Viel Spaß beim Nutzen und Erweitern.