So schützen Sie Seiten mit doppelter Authentifizierung: Passwort + E-Mail (im benutzerdefinierten Feld)

Ich möchte den WordPress-Passwortschutz von Beiträgen erweitern, indem ich ein zusätzliches Eingabefeld für Benutzer-E-Mails hinzufüge.

Um den Inhalt sehen zu können, muss der Benutzer also das Passwort und die zuvor angegebene E-Mail, die im benutzerdefinierten Meta-Feld des geschützten Posts gespeichert sind, kennen.

Ich habe versucht, einen guten Haken zu finden, der dieses zusätzliche Feld überprüft, aber ohne Erfolg. Könntest du mir ein paar Ideen geben, wie man es macht? Ich möchte keine Benutzerkonten für diese Art von functionen erstellen.

Solutions Collecting From Web of "So schützen Sie Seiten mit doppelter Authentifizierung: Passwort + E-Mail (im benutzerdefinierten Feld)"

Wenn Sie einen Beitrag als passwortgeschützt get_the_content() , erfolgt der Schutz bei der function get_the_content() . Dort prüft WordPress nach einem Post-Passwort-Cookie, und wenn nicht gesetzt, nicht gültig oder abgelaufen, dann zeige das Passwort-Formular.

Dieses Passwort-Formular wird an wp-login.php , dort wird ein Cookie gesetzt, entsprechend dem im Formular geschriebenen Passwort, dann wird die Anfrage erneut auf den Beitrag umgeleitet.

Der process kann wie folgt beschrieben werden:

  1. Gehe zur Seite
  2. rufe the_content () auf
  3. überprüfe den Cookie
  4. Falls nicht, zeigen Sie das Passwort-Formular an
  5. Formular an wp_login.php senden
  6. wp_login.php
  7. Setzen Sie den Cookie basierend auf pwd gesendet und redirect auf Post-Seite
  8. Beginnen Sie erneut mit dem Formular # 1

Was wir tun können:

  • Bei Punkt # 4 benutze den Hook 'the_password_form' , um die Ausgabe des Formulars zu bearbeiten, ein Feld für die E-Mail und ein verstecktes Feld mit der Post-ID (an dieser Stelle befinden wir uns innerhalb der function get_the_content , so dass wir Zugriff auf die globale Post-Variable haben)
  • Unglücklicherweise können wir bei Punkt # 3 das Ergebnis der Cookie-Überprüfung nicht ändern (oder zumindest nicht auf einfache und zuverlässige Weise). Aber an Punkt # 7 hat WordPress einen Filter-Hook, mit dem man den Cookie-Ablauf festlegen kann: Wenn wir diese Zeit auf einen vergangenen Zeitstempel setzen, wird der Cookie nicht gesetzt (und wenn er existiert, wird er gelöscht) und die validation wird fehlschlagen . So können wir diesen Haken verwenden, um die über das Formular übermittelte E-Mail zu überprüfen, und dank der Post-ID im versteckten Feld können wir sie mit den E-Mails im Meta vergleichen. Wenn die E-Mail nicht angegeben ist oder falsch ist, geben wir einen vergangenen Zeitstempel zurück.

Erster Schritt:

 /** * Customize the form, adding a field for email and a hidden field with the post id */ add_filter( 'the_password_form', function( $output ) { unset( $GLOBALS['the_password_form'] ); global $post; $submit = ''; $hidden = ''; $email = '

'; return str_replace( $submit, $hidden . $email . $submit, $output ); }, 0 );

Und der zweite:

 /** * Set the post password cookie expire time based on the email */ add_filter( 'post_password_expires', function( $valid ) { $postid = filter_input( INPUT_POST, 'email_res_postid', FILTER_SANITIZE_NUMBER_INT ); $email = filter_input( INPUT_POST, 'email_res', FILTER_SANITIZE_STRING ); // a timestamp in the past $expired = time() - 10 * DAY_IN_SECONDS; if ( empty( $postid ) || ! is_numeric( $postid ) ) { // empty or bad post id, return past timestamp return $expired; } if ( empty($email) || ! filter_var($email, FILTER_VALIDATE_EMAIL) ) { // empty or bad email id, return past timestamp return $expired; } // get the allowed emails $allowed = array_filter( (array)get_post_meta( $postid, 'allow_email' ), function( $e ) { if ( filter_var( $e, FILTER_VALIDATE_EMAIL) ) return $e; }); if ( ! empty( $allowed ) ) { // some emails are setted, let's check it // if the emails posted is good return the original expire time // otherwise return past timestamp return in_array( $email, $allowed ) ? $valid : $expired; } // no emails are setted, return the original expire time return $valid; }, 0 ); 

Wir sind fertig.

Erstellen Sie jetzt einen Beitrag, speichern Sie ihn als passwortgeschützt und setzen Sie einige erlaubte E-Mails in benutzerdefinierten Feldern mit dem Schlüssel 'allow_email' . Es gibt keine Begrenzung für die Anzahl der E-Mails, die Sie hinzufügen können …


Die Einstellungen:

Benutzerdefinierte Felder für den Schutz von E-Mail-Posts


Postschutz über Passwort


Ergebnis (TwentyThirteen ohne zusätzliches Styling):

Ergebnis in TwentyThirteen ohne zusätzliches Styling