WordPress: Neue Benutzerrollen ohne Plugin erstellen

In WordPress können eigene Benutzerroller erstellt werden, falls die 5 von WordPress vorgegebenen Benutzerrollen nicht den Bedürfnissen entsprechen. Neue Benutzerrollen ermöglichen eine bessere Differenzierung der einzelnen Rollen und Benutzer und somit eine weit bessere Möglichkeit, individuell auf den jeweiligen Benutzer (und auf seine Rolle) eingehen zu können.

Man könnte auch die bereits vorhandenen Benutzerprofile anpassen, was jedoch nicht immer die beste Lösung ist, da sich hier leichter Fehler bei der Editierung der Rechtevergabe einschleichen können. Auch sind neue Benutzerrollen besser, wenn es sich um Benutzerrollen handelt, welche der eigentlichen Verwaltung des WordPress ziemlich fern sind. Hier im Beispiel sind das Autoverkäufer und Interessenten, welche in unserem Theme „MotorMarket“ erstellt werden. MotorMarket – eine Verkaufsplattform für Autoverkäufer & -händler auf Basis eines WordPress-Themes.

Neue Benutzerrollen: Verkäufer und Interessenten

Beide Benutzerrollen werden nicht nur der eigentlichen Verwaltung der Website aus Sicherheitsgründen möglichst fern gehalten und bedürfen daher eine komplett angepasste Rechtevergabe. Auch unterscheiden sich die beiden Rollen im Beispiel erheblich und müssen mit komplett anderen Rechten ausgestattet werden.

Aber keine Sorge: was hier kompliziert klingt, ist einfacher als wahrscheinlich gedacht und schnell getan.

Los gehts: functions.php

Eine neue Benutzerrolle wird zeitgleich mit seinen Berechtigungen erstellt. Die Rolle wird also benannt und sogleich definiert. Der PHP-Code, welcher dies tätigt, wird in die functions.php geschrieben (oder alternativ inkludiert). Nachdem die function.php entsprechend erweitert wurde, muss der Webserver die functions.php einmal neu laden und die neue Rolle ist verfügbar.

(Wie bitte? Die functions.php neu laden? Keine Sorge, das tut sie automatisch bei jedem Seitenaufruf deines WordPress, egal ob der Aufruf im Front- oder Backend stattfindet – also schon beim nächsten Aufruf, um beispielsweise einen neuen Benutzer in dieser Rolle zu erstellen.)

Folgender Code in der functions.php erstellt die Benutzerrolle „Seller“:

$newuser = add_role( 'seller', __('Seller'), array() );
Leicht verständlich: Die Variable ist austauschbar und beinhaltet den Befehl add_role (Rolle hinzufügen), welche den Slug seller bekommt. Als Name wird Seller gewählt, was sich hier im Beispiel dann aber auch leicht übersetzen lassen wird. Zum Schluss kommt ein Array, welches die Angaben zur Berechtigungsvergabe enthält. Obiges Beispiel würde zwar tatsächlich eine Benutzerrolle erstellen, welche so aber keine Funktionalität hat.

Daher: folgender Code erstellt die Benutzerrolle „Seller“ und gibt ihr im Array sogleich Berechtigungen und Restriktionen:

$newuser = add_role( 'seller', __('Seller'), array(
'read' => true, // true erlaubt das reguläre lesen
'edit_posts' => true, // Erlaubt eigene Beiträge (Posts) zu editieren
'edit_pages' => false, // Verbietet Seiten (Pages) zu editieren
'edit_others_posts' => false, // Verbietet Beiträge anderer Benutzer zu editieren
'create_posts' => true, // Erlaubt neue Beiträge (Posts) zu erstellen
'manage_categories' => false, // Verbietet Beitrags-Kategorien zu managen
'publish_posts' => true, // Erlaubt das Veröffentlichen eigener Beiträge (Andererseits würden sie als Entwurf gespeichert werden)
'edit_themes' => false, // Verbietet das Theme zu editieren
'install_plugins' => false, // Verbietet neue Plugins zu installieren
'update_plugin' => false, // Verbietet Plugins zu aktualisieren
'update_core' => false // Verbietet den WordPress-Core zu updaten
)
);

Die so erstellte Benutzerrolle hat nun sehr angepasste Berechtigungen. Um diese Rolle, und die Gruppe der Benutzer derer, aber auch weitestgehend von wichtigen Einstellungen fern zu halten, wie weiter oben im Beitrag als Ziel definiert, sollten noch weitere Zugangs- und Sicherheitsmechanismen eingebaut werden – was aber nicht Inhalt des Artikels ist. Benutzerrolle erstellt, funktioniert, alles fein.

Im Grunde kann nun der Eintrag aus der functions.php wieder gelöscht werden, was auch in Bezug auf Dateigröße und Ladegeschwindigkeit Sinn macht. Ich empfehle jedoch, den Vorgang ordentlich zu protokollieren, um später einfach nachschauen zu können, welcher Benutzerrolle welche Rechte gegeben wurden.

Fragen, Anregungen oder konstruktive Kritik? Ich freue mich über den Dialog!

WordPress: Seite für Theme-Optionen im Backend ohne Plugin erstellen

Hochwertige WordPress-Themes bringen zumeist vielfältige Möglichkeiten mit sich, Einstellungen direkt aus dem Backend heraus vornehmen zu können. Dieser Artikel erklärt die grundlegenden 2 Schritte, wie man eine solche Theme-Option-Page erstellt, mit Optionen ausstattet und diese Optionen letztlich im Theme ausgibt/anzeigt/verwendet. In einem folgenden Artikel werden wir dann die Optionsseite funktionell und optisch aufmotzen.

Theme Options Page anlegen

Zuerst muss die Seite für das Backend erstellt werden. Folgende Code gehört in die functions.php des Themes und sorgt für eine Optionsseite im Menü des Backends unter „Einstellungen“ > „Theme-Optionen“.

Weiterhin werden durch den Code ein Eingabefeld und eine Textarea in der Theme-Options-Page erstellt. Das Eingabefeld „Fußzeile“ ermöglicht beispielsweise einen Hinweis aus das Copyright, den Designer oder was auch immer. Die Textarea ermöglicht hier im Beispiel einen Trackingcode in den Fußbereich der Website (footer.php) einzubauen.

add_action( 'admin_init', 'theme_options_init' );
add_action( 'admin_menu', 'theme_options_add_page' );
 
// Einstellungen registrieren (http://codex.wordpress.org/Function_Reference/register_setting)
function theme_options_init(){
register_setting( 'wellseo_options', 'wellseo_theme_options', 'wellseo_validate_options' );
}
 
// Seite in der Dashboard-Navigation erstellen
function theme_options_add_page() {
add_theme_page('Theme-Optionen', 'Theme-Optionen', 'edit_theme_options', 'theme-optionen', 'wellseo_theme_options_page' ); // Seitentitel, Titel in der Navi, Berechtigung zum Editieren (http://codex.wordpress.org/Roles_and_Capabilities) , Slug, Funktion
}
 
// Optionen-Seite erstellen
function wellseo_theme_options_page() {
global $select_options, $radio_options;
if ( ! isset( $_REQUEST['settings-updated'] ) )
$_REQUEST['settings-updated'] = false; ?>
 
<div class="wrap">
<?php screen_icon(); ?><h2>Theme-Optionen für <?php bloginfo('name'); ?></h2>
 
<?php if ( false !== $_REQUEST['settings-updated'] ) : ?>
<div class="updated fade">
<p><strong>Gespeichert!</strong></p>
</div>
<?php endif; ?>
 
<form method="post" action="options.php">
&lgt;?php settings_fields( 'wellseo_options' ); ?>
<?php $options = get_option( 'wellseo_theme_options' ); ?>
 
<table class="form-table">
<tr valign="top">
<th scope="row">Fußzeile</th>
<td><input id="wellseo_theme_options[fusszeile]" class="regular-text" type="text" name="wellseo_theme_options[fusszeile]" value="<?php esc_attr_e( $options['fusszeile'] ); ?>" /></td>
</tr>
<tr valign="top">
<th scope="row">Trackingcode</th>
<td><textarea id="wellseo_theme_options[trackingcode]" class="large-text" cols="50" rows="10" name="wellseo_theme_options[trackingcode]"><?php echo esc_textarea( $options['trackingcode'] ); ?></textarea></td>
</tr>
</table>
 
<!-- submit -->
<p class="submit"><input type="submit" class="button" value="Speichern" /></p>
</form>
</div>
<?php }
 
// Strip HTML-Code:
// Hier kann definiert werden, ob HTML-Code in einem Eingabefeld
// automatisch entfernt werden soll. Soll beispielsweise im
// Copyright-Feld KEIN HTML-Code erlaubt werden, kommentiert die Zeile
// unten wieder ein. http://codex.wordpress.org/Function_Reference/wp_filter_nohtml_kses
function kb_validate_options( $input ) {
// $input['copyright'] = wp_filter_nohtml_kses( $input['copyright'] );
return $input;
}

Oder per include

Wenn der Code für die Optionsseite umfangreicher ausfällt, kann darüber nachgedacht werden, ihn in eine eigene Datei auszulagern und diese Datei in der functions.php zu inkludieren.

Nehmen wir also einmal an, wir hätten obigen Code in einer seperaten Datei gespeichert, welche da beispielsweise heisst wellseo-theme-options.php und welche wir direkt im Themeordner ablegen. Folglich inkludieren wir diese Datei in der functions.php durch folgenden Code.

require_once ( get_stylesheet_directory() . '/wellseo-theme-option.php' );

Erstellte Theme-Optionen im Theme ausgeben

Die nun erstellten Werte können theoretisch überall im Theme angezeigt werden. In unserem Beispiel geben wir über fusszeile einen Hinweis auf den Designer aus. trackingcode wird auch seiner Bestimmung nach genutzt.

<?php
$options = get_option('wellseo_theme_options');
echo $options['fusszeile'];
echo $options['trackingcode'];
?>

Fragen, Anregungen oder konstruktive Kritik? Ich freue mich auf den Dialog!

WordPress Benutzerprofil: Benutzerdefinierte Felder ohne Plugin hinzufügen.

Benutzerdefinierte Felder für weitere Informationen zu den Benutzerprofilen in WordPress hinzufügen? Ohne Plugin! Es gibt 2 Möglichkeiten. Einerseits weitere Felder im Bereich Kontaktangaben hinzufügen oder andererseits einen kompletten Bereich, beispielsweise Weitere Informationen genannt, selbst erstellen.

Möglichkeit 1: weitere Felder zum Bereich Kontaktangaben

Die schnellste und einfachste Methode. Auch wenn diese zusätzlichen Felder im Backend unter Kontaktangaben angezeigt werden, müssen sie nicht zwangsläufig für Kontaktangaben genutzt werden. Auch ein Input-Feld ist nicht zwingend notwendig. Auch Textboxen, Datums- oder Farbwahl wäre denkbar.

Folgender PHP-Code ist klein, leicht anpassbar und wird in die functions.php kopiert und dort den eigenen Anforderungen angepasst.

function modify_contact_methods($profile_fields) {
 
// Add new fields
$profile_fields['twitter'] = 'Twitter Username';
$profile_fields['facebook'] = 'Facebook URL';
$profile_fields['gplus'] = 'Google+ URL';
 
return $profile_fields;
}
add_filter('user_contactmethods', 'modify_contact_methods');

Ausgabe der gespeicherten Informationen

Alle Felder sind nun über
get_the_author_meta();
ansprechbar. Für das Feld twitter wäre es also:
get_the_author_meta('twitter');

Möglichkeit 2: einen eigenen Bereich erstellen

Vom Code her etwas umfangreicher, aber immernoch übersichtlich. Dieses Beispiel erstellt einen Bereich namens „Informations for seoite“ und erstellt 3 Felder, um Angaben zu sozialen Profilen zu machen. Dies kann natürlich leicht angepasst werden. Der Code ist sehr leicht und selbsterklärend. Bei Fragen, bitte ich um Kommentare oder E-Mails.

Der Code wurde in Englisch gehalten und zur Übersetzung vorbereitet. Arbeitet man im Team und/oder soll eine mehrsprachigkeit umgesetzt werden oder wenn man einfach nur sauber arbeiten will, empfiehlt sich diese Vorgehensweise. Einheitlich im Code und übersetzt über eine entsprechende Sprachdatei.

In die functions.php kopieren und den eigenen Anforderungen anpassen:

/**
* More informations on user profiles
*/
 
add_action( 'show_user_profile', 'extra_user_profile_fields' );
add_action( 'edit_user_profile', 'extra_user_profile_fields' );
 
function extra_user_profile_fields( $user ) { ?>
<h3><?php _e("Informations for seoite", "blank"); ?></h3>
 
<table class="form-table">
<tr>
<th><label for="fbfanpage"><?php _e("Facebook Fanpage"); ?></th>
<td>
<input type="text" name="fbfanpage" id="fbfanpage" value="<?php echo esc_attr( get_the_author_meta( 'fbfanpage', $user->ID ) ); ?>" class="regular-text" /><br />
<span class="description"><?php _e("Please enter your Facebook Fanpage like https://facebook.com/example."); ?></span>
</td>
</tr>
<tr>
<th><label for=""twitterusername"><?php _e("Twitter username"); ?></label></th>
<td>
<input type="text" name="twitterusername" id="twitterusername" value="<?php echo esc_attr( get_the_author_meta( 'twitterusername', $user->ID ) ); ?>" class="regular-text" /><br />
<span class="description"><?php _e("Please enter your Twitter username without @."); ?></span>
</td>
</tr>
<tr>
<th><label for="pinterestusername"><?php _e("Pinterest username"); ?></label></th>
<td>
<input type="text" name="pinterestusername" id="pinterestusername" value="<?php echo esc_attr( get_the_author_meta( 'pinterestusername', $user->ID ) ); ?>" class="regular-text" /><br />
<span class="description"><?php _e("Please enter your Pinterest username."); ?></span>
</td>
</tr>
</table>
<?php }
 
add_action( 'personal_options_update', 'save_extra_user_profile_fields' );
add_action( 'edit_user_profile_update', 'save_extra_user_profile_fields' );
 
function save_extra_user_profile_fields( $user_id ) {
 
if ( !current_user_can( 'edit_user', $user_id ) ) { return false; }
 
update_user_meta( $user_id, 'fbfanpage', $_POST['fbfanpage'] );
update_user_meta( $user_id, 'twitterusername', $_POST['twitterusername'] );
update_user_meta( $user_id, 'pinterestusername', $_POST['pinterestusername'] );
}

Ausgabe der gespeicherten Informationen

Wie auch bei der ersten Methode ist die Ausgabe kinderleicht und exakt gleich:
<?php get_the_author_meta(); ?>
Für den Benutzernamen von twitter wäre das dann:
<?php get_the_author_meta('twitterusername'); ?>