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!

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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
    • 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.

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

      Antworten

Schreibe einen Kommentar

Werde als erstes informiert

Trage dich jetzt in die Warteliste ein, um als erstes informiert zu werden, wenn der Kurs geöffnet ist. Die Anmeldung zur Masterclass wird nur wenige Tage möglich sein. Eine nachträgliche Anmeldung ist ausgeschlossen.