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
Amid
(@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
Amid
(@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
Amid
(@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.