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'); ?>

WordPress Meta-Tag “generator” ohne Plugin entfernen

Kurze Frage, kurze Antwort. Der meta-tag “generator” wird nicht vom verwendeten Theme generiert, sondern stammt aus dem Kern der WordPress-Installation. Wie immer: möchte man eine Kernfunktion von WordPress ändern, sollte man nicht direkt im Kern eingreifen und modifizieren, sondern die gewünschte Änderung in der function.php des verwendeten Themes vornehmen. Von hieraus harkt man sich dann im Kern ein und veranlasst die Änderung.

Warum man die function.php bearbeitet und nicht direkt im Kern

Da sind 2 wichtige Gründe. Erstens zerschießt es dir, sofern Du etwas falsch machst (was man ja aber auch wieder rückgängig machen kann), erstmal nur das Theme und nicht gleich die ganze Website. Zweitens: sobald die neue Version von WordPress erscheint und man updatet, gehen leicht alle Änderungen im Kern verloren. Daher immer in der functions.php Funktionen des Kern ändern.

Ja, und wie nun das meta-tag “generator” ändern?

Einfach folgenden Codeschnipsel in die functions.php des verwendeten Themes eintragen:

remove_action('wp_head', 'wp_generator');

So einfach ist das. Schon ist das meta-tag “generator” aus dem Header von WordPress verschwunden.

WordPress: ohne Plugin Cookies erstellen und abfragen

Jaja, man muss sich notieren, was man sich merken mag… Heute: wie speichert man Cookies mit WordPress ohne Plugin und wie regelt man die Abfrage des Cookies?

An sich ganz einfach. Um das Prinzip einfach zu erklären, gehen wir davon aus, wir möchten einen Besucher begrüßen. Ist es der erste Besuch, zeigen wir ein “Hallo Fremder!”. Sobald der Besucher ein zweites mal auf die Website kommt, möchten wir ihm eine Meldung wie “Schön, Dich wieder zu sehen!”

Der Mechanismus dahinter ist ebenso einfach. Wir prüfen, ob ein (unserer) Cookie schon vorhanden ist. Wenn nicht, machen wie Aktion X, wenn ja, machen wir Aktion Y. Um dies zu realisieren, lassen wir beim ersten Besuch einen Cookie erstellen und prüfen zugleich, ob er schon vorhanden ist. Da der Cookie zwar beim ersten Besuch erstellt wird, aber beim Aufruf der Website noch nicht vorhanden ist, greift der Mechanismus

Cookies mit WordPress erstellen

Um das setzen des Cookies in WordPress zu realisieren, trage folgenden Code in die functions.php deines WordPress-Themes ein:

function set_newuser_cookie() {
if (!isset($_COOKIE['sitename_newvisitor'])) {
setcookie('sitename_newvisitor', 1, time()+1209600, COOKIEPATH, COOKIE_DOMAIN, false);
}
}
add_action( 'init', 'set_newuser_cookie');

Dies setzt einen Cookie namens “sitename_newvisitor”, welcher 2 Wochen lang gültig ist. Wenn Du mehr über die Funktionsweise und den Aufbau von Cookies erfahren magst, empfehle ich setcookie function at PHP.net.

Cookies mit WordPress und PHP überprüfen

Um nun zu prüfen, ob der Besucher erstmalig die Website besucht oder dies ein erneuter Besuch ist, könntest Du nun folgenden PHP-Code verwenden:

if (isset($_COOKIE['sitename_newvisitor'])) {
echo 'Schön, Dich wieder zu sehen!';
}
else {
echo 'Hallo Fremder!';
}

Nun bist Du an der Reihe!

Hat Dir das kleine Tutorial geholfen? Hat alles bei Dir funktioniert oder ist Dir das setzen eines Cookies mit WordPress immernoch ein Rätsel? Ich freue mich über Dein Feedback!

Individuelle Pinterest-Button ohne Plugin

Pinterest. Bekannt, geliebt, teilweise vergöttert. Pinterest bietet auf seiner Website auch einen Generator für den wohl bekannten “Pin-It-Button”. Schön und gut ist dieser Generator aber nicht gerade. Individualisierungswünsche lassen sich damit nicht realisieren. Dieses kleine Tutorial zeigt, wie man den “Pin-It-Button” anpasst bzw. individualisieren kann.

Pin-It-Button anpassen – garnicht so schwer

Zuvor sollte man sich die Frage stellen: was will ich eigentlich? Wie soll der Button angepasst werden und aussehen? Um nicht auf hunderte, gar tausende Individuallösungen eingehen zu müssen, zeige ich das Grundgerüst jener gewollten Individualität. Zuerst zeige ich den “Pin-It-Button”, wie er vom Generator auf Pinterest ausgegeben wird. Dies ist die Variante ohne Zähler.

Zuerst der Code, welcher im Code dort positioniert wird, wo der Button erscheinen soll.

<a href="//pinterest.com/pin/create/button/" data-pin-do="buttonBookmark" ><img src="//assets.pinterest.com/images/pidgets/pin_it_button.png" /></a>

Zuzüglich muss noch eine kleiner Code auf der Website zwischen <body> und </body> eingefügt werden, welcher eine JavaScript-Datei einbindet. Diese Datei liegt auf dem Server von Pinterest. Generell ist es ja zu bevorzugen, wenn man möglichst wenige Dinge von externen Servern einbindet – aber das ist eine andere Geschichte.

<script type="text/javascript" src="//assets.pinterest.com/js/pinit.js"></script>

Obige Beispiele sehen auf den ersten Blick so aus, als könne man einfach das Bild, welches vom Link umschlossen wird, austauschen und somit frei wählen, welches Element den Pinterest-Link erhalten soll. Falsch. Funktioniert nicht. Viel mehr wird die Grafik auch von JavaScript bestimmt, welche im body eingebunden wird. Lässt man die JavaScript-Datei einfach weg, funktioniert die Funktion nicht…

Pin-It-Button für Individualisten

Wir erkennen also: Einerseits benötigen wir die Funktion der JavaScript-Datei, andererseits müssen wir den Code umschreiben. Nun könnte man den Code aus der Datei extrahieren und in eine eigene externe Datei auslagern. Könnte man. Um mein Beispiel zu veranschaulichen, habe ich den benötigten JavaScript einfach direkt im von uns benötigten Link integriert. Somit steht es mir frei, welches Element ich wie zum Pin-It-Button umwandeln will.

<a href='javascript:void((function()%7Bvar%20e=document.createElement('script');e.setAttribute('type','text/javascript');e.setAttribute('charset','UTF-8');e.setAttribute('src','http://assets.pinterest.com/js/pinmarklet.js?r='+Math.random()*99999999);document.body.appendChild(e)%7D)());'>
 
Hier nun der zu verlinkende Inhalt. Ob Bild, Text, Container - was auch immer.
 
</a>

Da nun der benötigte JavaScript schon im Link enthalten ist, kann auf die Einbindung der externen JavaScript-Datei von Pinterest verzichtet werden.

Eigentlich ganz einfach, oder? Wenn man weiß, wie… Du schneidest das nicht ganz mit oder hast Fragen? Schreibe ruhig einen Kommentar. Oder Du hast einfach nicht das Können oder Lust, um diese Technik in die eigene Website zu integrieren? Nicht schlimm – dafür gibt es ja wellseo – einfach anrufen oder anschreiben.