Kontrolle von Inhalt via Userrechten & Zeit mit WordPress

Die Zeiten ändern sich.

Dieser Beitrag scheint älter als 12 Jahre zu sein – eine lange Zeit im Internet. Der Inhalt ist vielleicht veraltet.

WordPress bringt eine eigene User-Verwaltung mit und so kann man auch auf Grund diverser Rollen und Objekte die Inhalte steuern. In einigen Fällen ist es eine typische Anforderung, dass man den kompletten Inhalt nur den registrierten Usern zugänglich macht. Gleiches gilt natürlich auch für Teile des Content. Es gibt sicher verschiedene Anwendungen – einige kleine Lösungsvorschläge möchte ich hier kurz vorstellen.

Rechte-Abfrage

Eine einfache Möglichkeit ist die Abfrage der Rechte – die WordPress-Funktion current_user_can() erlaubt dies und kann einfach in Templates des Themes verwendet werden. Somit kann man steuern, dass nur geloggte User mit den entsprechenden Rechten den Inhalt sehen.
Im einfachsten Fall könnte man dies wie folgt im Template einbauen:


if ( current_user_can( 'manage_options' ) )
	the_content( the_title( '', '', false ) . ' ' . __( 'weiterlesen »', FB_BASIS_TEXTDOMAIN ) );
else
	_e( 'Nur für geloggte User zugänglich', FB_BASIS_TEXTDOMAIN );

Ohne die einzelnen Rechte abzufragen genügt die Abfrage mittels der Funktion is_user_logged_in(). Damit wird geprüft, ob der User geloggt ist.

Hier gibt es sicher diverse Ansätze und Möglichkeiten, die aber leicht nutzbar sind und trotzdem die unterschiedlichen Rollen und Objekte berücksichtigen. Die Objekte je Rolle sind übersichtlich im Codex beschrieben.

Prüfung auf Login via Funktion

Nun ist die Integration im Template recht einfach, sorgt aber dafür dass man in der Regel jedes Template anpassen muss. Da WordPress mit Hooks arbeitet, kann man hier auch einhaken und zentral via Plugin oder functions.php im Theme eine Funktion dafür ablegen.

Die folgende Funktion ist so ein Beispiel und prüft in dem Fall unabhängig von den Rechten, sondern lediglich ob der User geloggt ist – wenn ja, dann darf der Inhalt gesehen werden. Über den Hook the_content wird hier zentral gesteuert – so dass die Ausgabe im Theme, welche via dem Template Tag the_content() kommt, nur dann den Content wieder gibt, wenn man als User geloggt ist.
Parallel wurde hier auch explizit im Feed nur ausgegeben, wenn man geloggt ist – !is_feed().

Als Alternative für nicht geloggte User wird ein Abschnitt des Content ausgegeben – dazu gibt es verschieden Ansätze, hier wurde explizit mit Zeichen gearbeitet. So entsteht quasi ein Teaser für den Leser.


function content_only4logged_in($content) {
	
	// alle geloggten User
	if ( is_user_logged_in() && 
			!is_null($content) && 
			!is_feed() 
		 ) {
			
		return $content;
	} else {
		
		$content  = wp_html_excerpt( $content, 80 );
		$content .= ' …';
		$content .= __( '
Sorry, more of this content is only available for logged users.', FB_TEXTDOMAIN ); return $content; } } add_action( 'the_content', 'content_only4logged_in' );

Inhalte via Shortcode einschränken

Eine weitere Alternative ist es, nur einen bestimmten Abschnitt des Content nur für geloggte User frei zu geben. Dies könnte man beispielsweise über die Shortcode-API von WordPress tun. Auch dazu ein Beispiel. Hier wird der Shortcode [member] eingesetzt. Alles innerhalb dieses Elementes ist nur für geloggte User sichtbar.
Auch dieser Code gehört in ein Plugin oder die Schnittstelle des Themes für neue Funktionen.


function fb_check_logged_in( $atts, $content = null ) {
	if ( is_user_logged_in() && 
		!is_null($content) && 
		!is_feed() 
		 ) {
			
		return $content;
	} else {
		
		return __( 'Sorry, this content is only available for logged users.', FB_TEXTDOMAIN );
	}
}
add_shortcode( 'member', 'fb_check_logged_in' );

Zeitabhängig ausgeben

Eine denkbare Alternative ist auch das Ausgeben von Inhalten nach einem bestimmten Zeitraum. Diese Möglichkeit kann sicher beliebig erweitert werden. So lohnt sicher die Erweiterung um eine Metabox zur Eingabe eines Datums an den Beiträgen oder Erweiterung von Parametern um den Zeitrahmen in einem Shortcode abzufragen.


function content_only4time($content) {
	
	$date = strtotime( '01-10-2010' ); // day-month-year
	$now  = strtotime( date('d-m-Y') );
	echo $now . ' - ' . $date;
	if ( $date && ( $date < $now ) ) {
		
		return $content;
	} else {
		
		return __( '
Sorry, die Zeit ist noch nicht reif.', FB_TEXTDOMAIN ); } } add_action( 'the_content', 'content_only4time' );

In diesem Zusammenhang kann das Plugin wpSleep genutzt werden, welches via Shortcode und den Parametern der Zeit die Ausgabe steuert.

Mehr

Die Liste der Ansätze und vor allem der Möglichkeiten lässt sich beliebig fort führen – mit den Möglichkeiten kommt man eventuell auf eigene Ideen und kann die aufgezeigten Ansätze nutzen. Gern können weitere Ideen und Möglichkeiten in den Kommentaren untergebracht werden.

Von Frank Bültge

bueltge.de [by:ltge.de] wird von Frank Bültge geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.