it-swarm.com.de

So leiten Sie auf der Grundlage des im Anmeldebildschirm eingegebenen Kennworts zu einer kennwortgeschützten Seite weiter

Ich suche also nach etwas wie peters Login-Weiterleitung , aber etwas anders. Ich möchte ein Kundenportal für eine Fotografie-Website erstellen. Am besten füge ich einen benutzerdefinierten Beitragstyp für Kunden hinzu und verwende erweiterte benutzerdefinierte Felder, um alle zusätzlichen Funktionen hinzuzufügen, die für das CPT erforderlich sind. Wenn ein neuer Client hinzugefügt wird, wird eine neue URL für die Zugriffsseite des Clients erstellt. Scheint einfach.

Dann können wir einfach jede Seite mit einem Passwort schützen und das Passwort an den Client senden. Das ist alles großartig, aber ich möchte dies auch mit einem "Login" -Button in der Hauptnavigation der Site begleiten. Wenn jemand auf diese Schaltfläche klickt, soll ihm ein Kennwortformular angezeigt werden, in dem er das Kennwort eingeben kann, das er in der E-Mail erhalten hat. Basierend auf dem von ihnen eingegebenen Passwort werden sie auf die entsprechende CPT-Seite umgeleitet. Hat jemand eine Idee, wie ich das anstellen kann? Ich nahm an, dass ich irgendwie eine Abfrage ausführen könnte, um Beiträge basierend auf dem Kennwort abzurufen, aber ich bin nicht sicher, ob die in der Datenbank verwendete Verschlüsselung dies zulassen würde. Jede Einsicht wäre sehr dankbar.

Ich habe meine eigene Frage beantwortet. Hier ist ein Plugin, das fast genau das tut, was ich brauchte, aber ich brauchte die gleiche Funktionalität für benutzerdefinierte Beitragstypen:

Intelligente passwortgeschützte Seiten

Ich habe gerade das Plugin modifiziert und es für den persönlichen Gebrauch erstellt.

Bearbeitung zum Nutzen:

Dieses Plugin enthält nur eine PHP Datei. In dieser Datei befindet sich eine einzelne Klasse mit dem Namen "smartPWPages", die 3 Funktionen enthält. Innerhalb der Funktion "process_form" wird die Funktion get_pages aufgerufen. In Version 3.8.1 funktionierte das Plugin nicht sofort, daher habe ich die Argumente "child_of" und "parent" aus dem Aufruf von get_pages entfernt. Nach dem Entfernen dieser Argumente funktioniert das Plugin, jedoch nur für Seiten. Damit es für einen benutzerdefinierten Beitragstyp funktioniert, können Sie einfach das Argument "post_type" in Ihren benutzerdefinierten Beitragstyp anstelle von "page" ändern.

Diese geringfügigen Änderungen ermöglichten es mir, ein Kundenportal mit einem benutzerdefinierten Beitragstyp einzurichten, der über eine einzige Anmeldeseite verfügt, auf der Benutzer auf der Grundlage des eingegebenen Kennworts in den entsprechenden Bereich umgeleitet werden. Ich konnte viele Verwendungszwecke für Elemente wie Projektmanagementsysteme und dergleichen erkennen. Auf jeden Fall ein nützliches Plugin.

Hier ist die Lösung, die ich mir ausgedacht habe und die sich auf die Informationen stützt, die bereits in der Datenbank vorhanden sind.

Hintergrund

Jeder kennwortgeschützte Beitrag speichert das Kennwort im Klartext in der Tabelle wp_posts (in der Spalte post_password). Wir können das benutzen, um die Datenbank nach Beiträgen abzufragen, denen dieses Passwort zugewiesen wurde, und die darauf basierenden Beitragsinformationen zu erhalten. Von dort können wir auf den passwortgeschützten Beitrag weiterleiten.

Annahmen/Einschränkungen

Das OP gab an, dass ein benutzerdefiniertes Anmeldeformular für Kunden verwendet werden würde, um ihr spezielles Passwort einzugeben. Ich gehe davon aus, dass das Formular erstellt wurde und mithilfe einer GET-Anforderung das Kennwort gesendet werden kann, da es sich bereits um einen Klartext handelt.

Das OP gab auch an, dass jedes Passwort, das den Beitrag/die Seite schützt, eindeutig sein würde. Ich gehe davon aus, dass ein eindeutiges Passwort getrennt von dieser Antwort generiert wird.

Wie es funktioniert

Eine Abfragezeichenfolge von client_key wird gesendet (entweder über das GET des Formulars oder über einen Link) und mit get_query_var() überprüft. Wenn es vorhanden ist, überprüfen Sie die Tabelle wp_posts auf den ersten Beitrag, für den ein Kennwort festgelegt wurde, das dem client_key entspricht, und geben Sie die Zeile als Objekt zurück.

Sanity Check: Wenn ein Objekt erstellt wurde, erstellen Sie einige Variablen, die in unserer JavaScript-Funktion verwendet werden sollen.

Geben Sie ein script -Element in das DOM ein, das eine POST -Funktion für wp-login.php ausführt. Dies ahmt die Formularversendung nach, die normalerweise beim ersten Aufrufen einer kennwortgeschützten Seite erfolgt. Dort wird der Client aufgefordert, das Kennwort einzugeben, um den Inhalt des Beitrags anzuzeigen, und sobald er erhalten wurde, wird ein Cookie erstellt, um den zukünftigen Zugriff auf den Inhalt zu ermöglichen. Diese Funktion erledigt die gleiche Formularübermittlung hinter den Kulissen, die Weiterleitung an den entsprechenden Beitrag (basierend auf der GUID).

Führen Sie die Funktion schließlich nur im Front-End der Site aus, wenn wp_head ausgelöst wird (wenn jQuery [normalerweise] geladen ist).

Der Code

<?php
/**
 * Add our custom query string to the global query_vars.
 *
 * @param array $vars The global vars used throughout WP.
 *
 * @return array
 */
function wpse134962_add_query_vars_filter( $vars ) {
    $vars[] = 'client_key';

    return $vars;
}

add_filter( 'query_vars', 'wpse134962_add_query_vars_filter' );

/**
 * Redirect to a password-protected page based on the query string.
 *
 * If client_key is passed in the query string, check the database for a post that
 * has a password assigned that equals the client_key. If one is found, submit the
 * login form to create the cookie that allows entry, then redirect to the post.
 */
function wpse134962_password_redirect() {
    $client_key = get_query_var( 'client_key' ) ? get_query_var( 'client_key' ) : '';

    if ( ! empty( $client_key ) ) {
        /** @var wpdb $wpdb */
        global $wpdb;
        $query          = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_password = %s", $client_key );
        $password_posts = $wpdb->get_row( $query );

        if ( isset( $password_posts ) ) {
            $post_id   = $password_posts->ID;
            $login_url = site_url( 'wp-login.php' );

            echo <<<HTML
<script>
jQuery(function() {
var postURL = "$login_url?action=postpass",
    postData = {
        post_password: "$client_key"
    },
    postRedirect = function() {
        document.location = "{$password_posts->guid}";
    };
jQuery.post( postURL, postData, postRedirect() );
})();
</script>
HTML;

        }
    }

}

if ( ! is_admin() ) {
    /** Only fire on the front end of the site. */
    add_action( 'wp_head', 'wpse134962_password_redirect' );
}
2
Morgan Estes