WordPress Inhalte nur für registrierte User sichtbar machen

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).

Premium-Inhalte durch Plugins oder Themes

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].

Nur für ausgeloggte User

Inhalte, die nur für eingeloggte User sichtbar sein sollen, kommen zwischen [os_content type=“logged_in“] und [/os_content].

Nur für eingeloggte User

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!

43 Gedanken zu „WordPress Inhalte nur für registrierte User sichtbar machen“

  1. 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]

    Antworten
  2. 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?

    Antworten
  3. 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

    Antworten
  4. 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

    Antworten
  5. 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… :/

    Antworten
  6. 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 🙂

    Antworten
    • 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.

      Antworten
    • 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

      Antworten
    • 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

      Antworten
    • 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]

      Antworten
  7. 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

    Antworten
  8. 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.

    Antworten
    • 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!

      Antworten
      • 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

        Antworten
  9. 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

    Antworten
    • 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. 🙂

      Antworten
  10. 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

    Antworten
  11. 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!

    Antworten
    • 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.

      Antworten
      • 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.

        Antworten
  12. 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.

    Antworten

Schreibe einen Kommentar

Impulse

Kreative Impulse direkt in dein Postfach! Sichere dir unseren kostenlosen Newsletter und erwecke die Künstlerin oder den Künstler in dir. ❤️

Jederzeit abbestellbar, mehr siehe Datenschutzerklärung.