Support » Allgemeine Fragen » Teilbereich eines Posts mit Passwort schützen

  • Gelöst WordPress Entwickler

    (@aminteractiondesign)


    WP hat ja die Option, einen Post mit einem Passwort zu schützen.
    Allerdings will der Kunde, dass die Seite ein bisschen anders aussieht.
    Deswegen bräuchte ich einen Text, der angezeigt wird, auch wenn das PW noch nicht eingegeben wurde.

    Wie kann man das am besten lösen?

    Ein extra Page Template für passwortgeschützte Posts und ein Custom Field mit dem Text, der immer angezeigt werden soll?
    Würde das funktionieren?

    Eigentlich soll der einzige Unterschied auf der Seite der sein, dass nach Eingabe des richtigen PW anstatt dem PW-Formular ein Text und Bild mit Link zu einem Download angezeigt wird.

    Danke für Anregungen!

Ansicht von 6 Antworten - 1 bis 6 (von insgesamt 6)
  • WordPress bietet dafür das Conditional Tag post_password_required() an, das false zurückgibt, wenn kein Passwort benötigt wird oder das richtige Passwort bereits eingegeben wurde. Damit kannst du mit Änderungen in einem Child-Theme die Templates den gewünschten Text ausgeben. Idealerweise schreibst du dazu eine Funktion, die in den Template-Parts innerhalb der Loop eingefügt wird.

    <?php echo my_password_required(); ?>

    Die Funktion ruft das Custom Field _password_text ab und gibt es fallweise aus:

    function my_password_required() {
      // Custom Field _password_required abrufen
      $out = get_post_meta( $post->ID, '_password_text' );
    
      // Wird ein Passwort benötigt?
      $password_required = post_password_required();
      // wenn ja, gib den Text aus
      if( $password_required ) {
        //wurde das Custom Field ausgefüllt?
        if($out) {
          return $out;
        } else {
          return 'Ups, du benötigst ein Passwort.'
        }
      }
    }

    Thread-Starter WordPress Entwickler

    (@aminteractiondesign)

    Danke, aber entweder kapiere ich deinen code nicht, oder du hast einen Logikfehler drin.

    post_password_required() gibt false zurück, wenn kein PW festgelegt ist oder das richtige PW eingegeben wurde.

    In deinem Script würde bei false gar nichts ausgegeben werden, bei true aber der _password_text. Außer es ist kein _password_text vorhanden, dann kommt ‚Ups, du benötigst ein Passwort.‘

    Oder hab ich was grundsätzlich falsch verstanden?

    Wenn ich dich richtig verstanden habe, möchtest du doch dann Text ausgeben, wenn ein Passwort benötigt wird? („Deswegen bräuchte ich einen Text, der angezeigt wird, auch wenn das PW noch nicht eingegeben wurde.“)

    Die Funktion post_password_required() gibt true aus, wenn ein Passwort benötigt wird. Wird kein Passwort benötigt oder ist das Passwort bereits eingegeben, gibt die Funktion false aus. Der Wert wird der Variablen $password_required übergeben.

    Ist die Variable $password_required auf true gesetzt, wird ein Text ausgegeben. Anderenfalls passiert nichts.

    Im nächsten if-Statment wird geprüft, ob der zuvor ausgelesene Wert des Custom Field _password_text einen Inhalt hatte. In diesem Fall wird der Inhalt wiedergegeben, anderenfalls wird eine Standardformulierung ausgegeben.

    Mit _password_text ist ein Custom Field gemeint, in dem der Inhalt festgelegt wird, der ausgegeben werden soll, wenn ein Password benötigt wird. Also meinetwegen „Auch hier benötigst du wieder ein Passwort“ oder „Kennst du das Passwort“ oder … 

    Wenn du hingegen generell prüfen möchtest, ob ein Post überhaupt ein Passwort hat und dann unabhängig davon, ob das Passwort eingegeben wurde, einen Zusatztext ausgeben möchtest, kannst du hiermit arbeiten:

    if(!empty($post->post_password)){
       return 'Dieser Beitrag ist passwortgeschützt.';
    }

    Thread-Starter WordPress Entwickler

    (@aminteractiondesign)

    Ah ok, so hast du das gemeint.
    Danke, hat mir geholfen.
    Generell ist das ziemlich schwer anpassbar mit den passwortgeschützten posts.
    Man muss wohl auch mit den Filtern rumhantieren um auf das gewünschte Ergebnis zu kommen.

    Man muss wohl auch mit den Filtern rumhantieren um auf das gewünschte Ergebnis zu kommen.

    Was fehlt dir denn noch und welche Filter meinst du?

    Thread-Starter WordPress Entwickler

    (@aminteractiondesign)

    Naja, ich hab das vielleicht nicht ganz optimal formuliert vorher, aber ich wollte es so, dass der post komplett angezeigt wird, außer eben ein extra ausgezeichneter Bereich.
    Habs jetzt so gelöst:

    add_filter( 'the_password_form', 'im_password_form' );
    function im_password_form($form) {
        global $post;
    
        $content = $post->post_content;
    
        $content = str_replace("[password_form]", $form, $content);
    
        $html  = "";
    
        if (stripos($content, "[secret_content]" ) !== false && stripos($content, "[/secret_content]" ) !== false) {
            $tmp1 = explode("[secret_content]", $content);
            // content before secret content
            $contentBefore = $tmp1[0];
            // secret content
            $tmp2 = explode("[/secret_content]", $tmp1[1]) ;
            $secretContent = $tmp2[0];
            // content after secret content
            $contentAfter= $tmp2[1]; 
    
            $html .= $contentBefore.$contentAfter;
        } else {
            $html .= $content;
        }
    
        return $html;
    }
    
    add_filter( 'the_content', 'im_password_content_filter', 20 );
    function im_password_content_filter($content) {
    
        return str_replace(['[secret_content]', '[/secret_content]', '[password_form]'], "", $content);
    }
    
    // remove "Protected:" from title
    add_filter('protected_title_format', 'im_protected_title_format');
    function im_protected_title_format($title) {
           return '%s';
    }

    Müsste man noch optimieren, hatte da noch nen Denkfehler drin am Anfang.
    Etwas komisch, dass man es über ‚the_password_form‘ lösen muss, aber ne andere Möglichkeit hab ich nicht entdeckt, den Post Content zu ändern, wenn das PW noch nicht eingegeben ist.

Ansicht von 6 Antworten - 1 bis 6 (von insgesamt 6)
  • Das Thema „Teilbereich eines Posts mit Passwort schützen“ ist für neue Antworten geschlossen.