webentwicklung-frage-antwort-db.com.de

Passwortschutzseite mit mehreren Passwörtern

Hallo mein Klient muss Kennwortschutzseite in WordPress hinzufügen. So mache ich die Sichtbarkeit der Seite als Passwortschutz und es funktioniert richtig. Aber der Kunde gibt eine Reihe von Passwörtern. Er erhält die Passwörter 2314 bis 2335. Das Passwort ist also eine beliebige Zahl zwischen 2314 und 2335. Was mache ich jetzt? Gibt es eine Methode oder einen Aufruf, um dies zu lösen? Gibt es einen Haken?

5
ron r

Hier ist nur ein Demo-Test zum Spaß, nur um zu sehen, ob dies möglich sein könnte:

Demo

Zuerst setzen wir das Passwort des Posts wie gewohnt:

 password 

Dann erstellen wir ein benutzerdefiniertes Feld mit dem Namen wpse_extra_passwords, das durch Kommas getrennte Passwörter akzeptiert:

 extra passwords 

Dies sind die zusätzlichen Passwörter für diesen Beitrag.

Definieren wir die folgende Hilfsfunktion basierend auf der Kernfunktion post_password_required():

/**
 * Helper function, check password + extra passwords
 */
function wpse_post_password_required( $post = null ) 
{
        $post = get_post($post);

        if ( empty( $post->post_password ) )
                return false;

        if ( ! isset( $_COOKIE['wp-postpass_' . COOKIEHASH] ) )
                return true;

        require_once ABSPATH . WPINC . '/class-phpass.php';
        $hasher = new PasswordHash( 8, true );

        $hash = wp_unslash( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] );
        if ( 0 !== strpos( $hash, '$P$B' ) )
                return true;

        // Check the current password
        if( $hasher->CheckPassword( $post->post_password, $hash ) )
            return false;

        // Fetch extra passwords
        if( ! $extra_passwords = get_post_meta( $post->ID, 'wpse_extra_passwords', true ) )
            return true;

        // Check these extra passwords 
        $extra = explode( ',', $extra_passwords );      
        foreach( (array) $extra as $password )
        {
            $password = trim( $password );
            if( ! empty( $password ) && $hasher->CheckPassword( $password, $hash ) )
                return false;           
        }   
        return true;
}

Dann schließen wir uns dem the_password_form-Filter an und zielen auf das einzelne Post-Objekt in der Hauptschleife:

/**
 * Support extra post passwords for single posts in the main loop
 */
add_filter( 'the_password_form', function( $output )
{
    if( ! is_single() || ! in_the_loop() || did_action( 'the_password_form' ) )
        return $output;

    $post = get_post();

    // Display password form if none of the passwords matches:  
    if( wpse_post_password_required( $post ) )
        return $output;

    // Get the current password
    $password = $post->post_password;

    // Temporary remove it
    $post->post_password = '';

    // Fetch the content
    $content = get_the_content();

    // Set the password back
    $post->post_password = $password;

    return $content;
} );

Hoffentlich kannst du es testen und weiter damit spielen.

Anmerkungen

Sie haben Passwörter wie 2314 erwähnt. Es ist sehr einfach, ein Programm zu schreiben, das solche einfachen Passwörter errät. Deshalb habe ich in dieser Demo ein bisschen stärkere Passwörter verwendet.

9
birgire

Sie können dafür auch ein Plugin verwenden: https://wordpress.org/plugins/multiple-post-passwords/

Und ja, eine Reihe von Zahlen als Passwörter zu haben, ist eine schlechte Idee;)

0
am_