Es gibt viele Gründe, bestimmte Blog-Inhalte nur für registrierte Nutzer sichtbar zu machen (Premium Content, Anweisungen, interne Links).
Leider gibt es keine Standard-Lösung von WordPress für dieses Vorhaben. Ich zeige dir, wie du dieses Problem elegant lösen kannst (mit wenigen Zeilen Code oder Plugins).
Inhaltsverzeichnis
Einige Plugins bietet dir genau die gewünschte Funktionalität. Teilweise ist dieses Feature auch bereits in Themes integriert.
Vielleicht passt eines der nachfolgenden Produkte genau zu deinem Vorhaben?
Digimember (Plugin)
Möchtest du bestimmte Inhalte verkaufen, kannst du direkt ein Memberplugin wie zum Beispiel Digimember* benutzen. Dann hast du im Backend die Möglichkeit, deine Beiträge und Seiten einem „Produkt“ zuzuweisen, welches nur noch Käufern angezeigt wird.
Besucht ein nicht eingeloggter User eine Produktseite, bekommt er eine Login-Maske angezeigt.
Was (mir) in Digimember fehlt, ist eine elegante Möglichkeit, Inhalte für alle registrierte Nutzer anzuzeigen – unabhängig von einem Produktkauf. Daher findest du weiter unten meine Lösung, wie ich diese Funktion in Digimember doch nutzen kann.
GeneratePress (Theme)
Das sehr beliebte WordPress Theme GeneratePress* (welches übrigens wirklich genial ist) bietet in der Premium-Version ebenfalls eine fertige Möglichkeit um Inhalte zu verstecken.
Mit Hilfe der sogenannten „Elements“ lassen sich beliebige Inhalte, an beliebigen Stellen, nach unterschiedlichen Kriterien in deinem Blog anzeigen.
So ist auch eine Konfiguration möglich, bestimmte Inhalte (Blöcke) beispielsweise nur für eingeloggte Leser sichtbar zu machen.
Es gibt natürlich noch eine Vielzahl anderer Plugins, die ähnliche Funktionen bieten. Wenn du einen Favoriten hast, hinterlasse gern einen Kommentar!
Eigener Shortcode mit weiteren Vorteilen
Die Fertiglösungen passten mir (wie immer) nicht. Daher habe ich mir, trotz Einsatz von Digimember, einen kleinen Shortcode geschrieben, der folgendes erlaubt:
- Inhalte für nicht registrierte Nutzer ausblenden
- Inhalte für registrierte Nutzer einblenden
- Inhalte für alle Nutzer anzeigen
Und dies unabhängig voneinander und sogar auf der gleichen Seite.
So lässt sich beispielsweise eine Login-Seite mit einem Dashboard kombinieren – abhängig davon, ob der User eingeloggt ist oder nicht.
Möglich wird dies alles durch die WordPress Funktion is_user_logged_in().
Folgende Funktion brauchst du dazu in deiner functions.php:
//Inhalte für registrierte / nicht registrierte Nutzer ausspielen function function_os_content($atts, $content = null) { //Standard Werte $values = shortcode_atts( array( 'type' => 'logged_out', ), $atts ); //Nur für ausgeloggte User sichtbar if($values['type'] == 'logged_out' && !is_user_logged_in()){ return do_shortcode($content); } //Nur für eingeloggte User sichtbar if($values['type'] == 'logged_in' && is_user_logged_in()){ return do_shortcode($content); } } add_shortcode('os_content', 'function_os_content');
Inhalte, die für ausgeloggte User angezeigt werden sollen, schreibst du zwischen die Shortcodes [os_content type=“logged_out“] und [/os_content].
Inhalte, die nur für eingeloggte User sichtbar sein sollen, kommen zwischen [os_content type=“logged_in“] und [/os_content].
Du kannst innerhalb der Shortcodes weitere Shortcodes einsetzen.
Sollen Inhalte immer angezeigt werden, dürfen sie von keinem der Shortcodes umschlossen sein.
Mit diesem einfachen Code-Schnipsel kannst du Inhalte jetzt beliebig ein- und ausblenden. Viel Spaß beim Tüfteln!
Hallo,
wie ist es eigentlich wenn das Theme ein automatisches Updates durchführt, ist dann der Eintrag in der functions.php überschrieben und damit weg?
Ja, deshalb immer ein Child-Theme anlegen oder ein eigenes, kleines Plugin dafür erstellen.
Genau nach so einer Möglichkeit hatte ich gesucht.
Danke
Allerdings wie im August der Christian schon schrieb, müssen die Anführungszeichen weg gelassen werden.
[os_content type=“logged_out“] hat es auch bei mir nicht funktioniert, erst so fonktionierte allles. [os_content type=logged_out]
Hallo!
Ich suche eine Funktion die eine größere Anzahl von Codes erkennt und dann eine Seite frei gibt. zB. ein Code wie: qweqd
wird per Maske abgefragt und gibt dann die Seite frei.
Geht das?
Na klar, im Endeffekt geht alles. 😉
Je nach Anwendungsfall kannst du ggf. sogar einfach .htaccess/.htpasswd nutzen.
Hey, Timo,
herzlichen Dank!
Super Ding. Einfach und gut. Ich brauche es im Zusammenhang mit Mitgliederbereich (Digimember) bei den Widgets/Footer. Registrierte und eingeloggte Member kann ich vom Newsletter-Formular verschonen. Das entschlackt und macht Weg frei für Wesentlicheres. Also ausblenden für eingeloggte User.
Beim testen habe ich ebenfalls die Anführungszeichen weggelassen, dann hat es geklappt (Verhalten mit [os_content type=“logged_out“]: Beim einloggen ausgeblendet (=ok) und beim ausloggen aber nicht mehr angezeigt. (= unerwünscht)).
Also ok mit:
[os_content type=logged_out]
Ich verwende das Theme „TwentyTwenty-One“.
Ganz herzlichen Dank!
Christian
Moin Christian, perfekt, danke für die Rückmeldung. 🙂
Die Funktion ist super!
Jetzt gleich weiter überlegt. Wie schwierig wäre es die Unterscheidung noch weiter zu treiben?
Also nicht nur abgemeldet und angemeldet, sondern gleich unterschiedliche Inhalte abhängig von der jeweiligen Rolle, die der Benutzer hat, anzeigen.
Liebe Grüße
Johannes
Das kann man alles machen, WP bietet einige Funktionen dafür.
Hallo Timo,
WP bietet einige Funktionen dafür? Das ist ja interessant. Dachte dass bei diesen Gedanken ausschließlich ein Snippet hilfreich sein könnte.
Welche Funktionen meinst Du ?
Ich habe bisher auf meiner Suche noch keine Lösung mit diesen Ansatz finden können. Genau dieser Ansatz würde mir aber bei einem Projekt sehr viel Umweg zum gewünschten Ergebnis ersparen.
Vielleicht plauderst Du ein wenig aus dem Nähkästchen? 🙂
Liebe Grüße
Johannes
In diese Richtung wird es gehen:
https://wordpress.org/documentation/article/roles-and-capabilities/
https://developer.wordpress.org/reference/functions/current_user_can/
WP unterstützt User-Rollen, die du entsprechend abfragen kannst. 🙂
Leider habe ich Probleme mit der letzten Zeile mit dem Funktionsaufruf add_shortcode…
Sobald ich diese einbaue ist die Ganze Seite nicht aufrufbar. Sofern die letzte Zeile weggelassen wird funktionierts, nur dann habe ich keinen Shortcode 🙂
Die shortcodes.php Datei mit der entsprechenden Datei habe ich natürlich… :/
Hey Super Tutorial! Bei mir hat es geholfen in Elementor einfach die „“ weg zu lassen dann hat es geklappt 🙂 allerdings hatte ich ein Problem wenn ich eine ganze Spalte bzw. ganzen block ausblenden lassen wollte. Für alle die evtl. das selbe Problem haben ich habe das so gelöst das ich im Customizer unter Zusätzliches CSS gegangen bin und folgenden Code eingefügt habe:
body:not(.logged-in) .deine-klasse-die-ausgebelendet-werden-soll {
display: none;
}
Damit wird der dementsprechende block ausgeblendet wenn man nicht eingeloggt ist, das ganze geht natürlich auch andersrum:
body.logged-in .deine-klasse-die-ausgebelendet-werden-soll {
display: none;
}
Damit wird es ausgeblendet wenn man eingeloggt ist 🙂
Danke. Per CSS geht es zwar auch, aber bedenke, dass die Inhalte dann weiterhin im Quelltext zu finden sind (und damit z. B. auch für Suchmaschinen sichtbar).
Für einige Fälle mag das aber absolut ausreichen.
Hallu,
Danke dir Thorsten, auf den Tipp mit den Anführungszeichen wäre ich nicht gekommen. Vor Allem auch ein riesen Danke an dich Timo, dein kurzer Code löst mein Problem perfekt.
Viele Grüße aus Passau
Hi,
Danke für die Antwort und das würde ich auch super gerne so umsetzen.
Nur weiß ich nicht was ich bei „deine-klasse-die-ausgebelendet-werden-soll“ eintragen soll.
Danke für eine Antwort
Danke für den Tipp, bei mir hat es auch geklappt, als ich die Anführungszeichen weggelassen hatte. Der Shortcode sieht dann so aus:
[os_content type=logged_in]
Hallo Timo,
zwecks Handlettering und (neu auch) Sketchnotes „verfolge“ ich deine Arbeit ja nun schon eine Weile, aber dass du auch Codieren kannst, war mir gar nicht bewusst. Wurdest gerade zum Retter meiner Nerven 😉
Nach endlosem Rumprobieren und nicht optimalen Lösungen, ist das hier in Kombination mit einem kleinen Login-Plugin perfekt und genau das, was ich gesucht habe.
Vielen, vielen Dank für den Code!
Liebe Grüße
Anne
Schön, dass es geholfen hat!
Ja, ich habe einfach zu viele Leidenschaften … 😀
Nach Änderung auf einfache Hochkommata hat es dann auch gut geklappt.
Danke!!!
Hi – klasse Beitrag. Kann man den Beitrag auch auf bestimmte Benutzer einschränken?
Gruß Marvin
Danke. Na klar, du kannst beliebige weitere Checks einbringen.
Hallo Timo,
eine klasse Funktion, vielen Dank für die Anleitung.
Eine Frage/Bitte: Kannst du ein Beispiel zeigen, wie man eine Rolle oder Berechtigung abfragt? Danke.
Und leider funktioniert es bei mir im Elementor nicht, obwohl andere Shortcodes funktionieren. Du hattest ja schon geschrieben, dass du nicht weißt, wie Elementor funktioniert. Welche Builder nutzt du denn? Im Gutenberg funktioniert dein Code.
Gruß
Jay
Hi Jay,
da musst du selber schauen. Diese Funktion ist dabei hilfreich: https://developer.wordpress.org/reference/functions/current_user_can/
Teste bei Elementor mal einfache bzw. gar keine Anführungszeichen im Shortcode – vielleicht klappt das!?
Beste Grüße!
Hallo Timo,
ich würde gerne auch auf meiner Webpräsenz die Seite, die ich als Blog Seite verwende, nur den eingeloggten Usern zur Verfügung stellen.
Wenn ich diese Seite bearbeiten will, dann habe ich im Editor nur ein sich ständig drehendes Wartesymbol, das nie endet und ich habe keine Möglichkeit dort einen Shortcode einzutragen.
Ich nehme an, dass dies daran liegt, weil die Blog Seite ja dynamisch aus den einzelnen Beiträgen erstellt wird. Oder ist das vielleicht eine Besonderheit vom Enfold Theme, dass ich verwende?
Hast Du da einen tipp für mich? Vielleicht mache ich ja auch noch irgendwas prinzipielles falsch.
Hi Frank, auch wenn der Feed (Blog) dynamisch generiert wird, solltest du die Seite im Backende bearbeiten können. Sonst stimmt etwas mit deinem Theme nicht.
Den Shortcode kannst du dort aber nicht nutzen, dann muss das schon direkt ins Thema integriert werden (oder über einen Hook).
Beste Grüße!
Hallo Timo,
danke. ich hab es schon befürchtet, dass es am Theme liegt, dass ich die Blog Seite nicht bearbeiten kann.
Leider kenne ich mich zu wenig aus um zu wissen, was genau ein Hook ist. Aber das würde hier jetzt vermutlich zu weit führen und das Thema sprengen.
Ich werde mich mal bezüglich Hooks schlau machen.
Frank
Hey!
Vielen vielen Dank.
Hast du vielleicht eine Idee, wie man das so adaptieren kann, dass es bestimmte Inhalte auf der gesamten Homepage nur für eingeloggte/ausgeloggte User anzeigt?
Wie bspw. einen Produktpreis nur für eingeloggte User?
Beste Grüße
Rames
Hi Rames, du kannst die wichtigen Überprüfungen (ob der User eingeloggt ist) natürlich auch direkt in Templates, Hooks oder Filtern verwenden.
Wenn du Zugriff auf das Template hast, ist es dort am einfachsten. Wenn nicht, musst du den Umweg über Hooks/Filter gehen. Das ist etwas komplexer aber deutlich eleganter. 🙂
Hi,
erstmal Danke!
Wenn ich den Shortcode direkt in einem Feld verwende, a la [os_content type=“logged_in“] Ich bin eingeloggt [/os_content], funktioniert es einwandfrei.
Sofern ich jedoch ganze „Widgets“ (mit Elementor erstellt) entsprechend umschließen will, funktioniert es nicht, wenn ich vor das Widget [os_content type=“logged_in“] und hinter das Widget [/os_content] schreibe … Schade, oder mache ich was falsch?
Grüße
Hi Chris, ich weiß leider nicht, was Elementor für Code erzeugt. Shortcodes sollten innerhalb des os_content funktionieren.
Mehr kann ich so nicht sagen, sorry.
Unfassbar! Cool! DANKE!!!
Vielen Dank für die Funktion dazu, ein weiteres Plugin gespart.
FG
Viktor
Dein Code funktioniert bei mir ausgezeichnet. Genau so habe ich mir das vorgstellt und kann nun individuell Content für die verschiedenen Gegebenheiten ein- bzw. ausblenden! Top!! Vielen Dank!
Perfekt, das freut mich! Danke für die Rückmeldung. 🙂
Nachtrag: Leider funktioniert es doch nicht. Habe mich eben ausgeloggt und sehe den Inhalt, den eigentlich alle Gäste sehen sollten, nicht. Bei mir läuft auch die neuste Version und Deinen Code habe ich ans Ende der functions.php gesetzt.
Ich habe den Code nochmal woanders getestet und einen potentiellen Fehler gefunden. In meinem Snippet waren einfache und doppelte Anführungszeichen gemischt, was scheinbar dazu geführt hat, dass die Anführungszeichen im Shortcode mit übergeben wurden.
Nachdem ich im Snippet komplett auf einfache Anführungszeichen gewechselt habe, funktionierte es wieder. Komischerweise scheint der Fehler nicht überall aufzutauchen… probiere es jetzt am besten nochmal mit dem neuen Code-Snippet oben.
Also mit diesem Shortcode “ [os_content type=’logged_out‘] “ klappt es 100%! Also tatsächlich einfache Anführungszeichen. Danke Dir!!
Gerne. Jetzt sollte es im Shortcode auch mit normalen Anführungszeichen funktionieren. Ich habe den Code oben zwischenzeitlich aktualisiert. 🙂
Jetzt funktioniert es! Vielen Dank für die Problemlösung. Ist wirklich eine tolle, einfache Lösung!
Sehr schön!
Sehr schöner Beitrag – als ich das gelesen habe, dachte ich sofort das ist die perfekte Lösung für meinen Blog. Ich will auf meiner Seite im Prinzip nur 2 Textzeilen ausblenden. Eingeloggte Nutzer sollen sehen welche anderen Nutzer sich für eine Veranstaltung (Spieleabend) angemeldet haben. Nicht eingeloggte Nutzer eben nicht.
Leider funktioniert deine Lösung – so schön sie auch klingt – bei mir nicht. Egal was ich zwischen die Shortcodes eintrage – es ist weder für eingeloggte noch für ausgeloggte User zu sehen. Gilt sowohl für [os_content type=“logged_out“] … [/os_content], als auch für [os_content type=“logged_in“] … [/os_content]. Eine Idee woran das liegen könnte? Brauche ich eine bestimmte WordPress-Version? Vermutlich bin ich einfach zu blöd.
Moin, danke! Also ich habe die Shortcodes genau so im Einsatz. In der aktuellen WP Version.
Schau am besten nochmal, ob du alles korrekt eingebaut hast. 🙂