Heute möchte ich euch einen kleinen Codeschnippsel an die Hand geben, der mir in der vergangenen Woche bei einem Problem mit den Berechtigungen geholfen hat. In einem Projekt sollte es Benutzern mit einer bestimmten Rolle ermöglicht werden, Seiten eines Custom Post Types zu bearbeiten. Die Einschränkung war hier allerdings, dass sie nur eigene Seiten des Custom Post Types bearbeiten dürfen.
Author-Box für Custom Post Type aktivieren
Eigentlich sollte das ja ganz einfach sein – dachte ich zumindest. Zuerst einmal muss man natürlich die Autor-Box für den Custom Post Type aktivieren. Nehmen wir einfach mal eine Portrait Seite als Beispiel. Dies geschieht bei der Registrierung des selbigen:
register_post_type( 'portrait', array( // ... 'supports' => array( 'title', 'editor', 'author' ), // ... );
Jetzt hätte ich erwartet, dass ich als Administrator ein Portrait anlegen und diesem den Nutzer zuweisen kann. Den Nutzern hatte ich zuvor explizit das Recht eingeräumt, die eigenen Portraits zu bearbeiten. Leider fand ich in der Liste der Autoren nur solche Nutzer, die die WordPress Rolle „Autor“ hatten. Ich wollte aber nicht jedem Nutzer ermögliche, auch Beiträge zu verfassen.
Author-Box Dropdown anpassen
Ich könnte euch jetzt lange erzählen, was ich alles versucht habe. Aber nach einigen Versuchen habe ich dann die recht einfache Lösung gefunden. Mit wenigen Zeilen Code und einem einzigen Filter konnte ich das Problem lösen:
function portrait_wp_dropdown_users_args( $query_args, $r ) { if ( 'portrait' === get_current_screen()->post_type ) { $query_args['role__in'] = array( 'administrator', 'portraiteditor' ); $query_args['who'] = ''; // This is important to enable non-authors } return $query_args; } add_filter( 'wp_dropdown_users_args', 'portrait_wp_dropdown_users_args', 10, 2 );
Über den Filter „wp_dropdown_users_args
“ können wir die „WP_User_Query
“ beeinflussen. Hier müssen wir nun lediglich angeben, welche Rollen aufgeführt werden sollen. Wichtig ist aber auch, dass wir den Wert von „who“ auf einen leeren String setzen. Denn nur dann greift auch die „role__in
“ Auswahl. Ansonsten würden weiterhin nur Autoren aufgelistet werden.
Fazit
Ich hoffe euch hat mein sehr kurzer Artikel gefallen. Er zeigt mal wieder, dass in WordPress die Lösung für viele Probleme oft „nur einen Filter entfernt ist“ 😉
P.S. Ich habe euch mal noch ein Beispiel-Plugin in einem Gist veröffentlicht, damit ihr es mal selbst testen könnt.