web-dev-qa-db-fra.com

Mot de passe protéger la page avec plusieurs mots de passe

Bonjour, mon client a besoin d’ajouter un mot de passe pour protéger la page dans wordpress. Donc, je fais de la visibilité de la page comme mot de passe protéger et cela fonctionne correctement. Mais le client donne une série de mots de passe. On lui donne le mot de passe 2314 à 2335. Ainsi, le mot de passe est un nombre quelconque compris entre 2314 et 2335. Maintenant ce que je fais? Existe-t-il une méthode ou un appel pour résoudre ce problème? Un crochet est là?

5
ron r

Voici juste un test de démonstration pour le plaisir, juste pour voir si cela pourrait être possible:

Démo

Nous définissons d'abord le mot de passe de la publication, de la manière habituelle:

 password 

Ensuite, nous créons un champ personnalisé appelé wpse_extra_passwords qui prend des mots de passe séparés par des virgules:

 extra passwords 

Ce sont les mots de passe supplémentaires pour cette publication.

Définissons la fonction d'assistance suivante, basée sur la fonction principale 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;
}

Ensuite, nous accrochons dans le filtre the_password_form et ciblons l'objet post unique dans la boucle principale:

/**
 * 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;
} );

J'espère que vous pourrez le tester et continuer à jouer avec.

Remarques

Vous avez mentionné des mots de passe tels que 2314. Il est très facile d'écrire un programme capable de deviner des mots de passe simples comme ceux-là. J'ai donc utilisé des mots de passe un peu plus forts dans cette démo.

9
birgire

Vous pouvez également utiliser un plugin pour cela: https://wordpress.org/plugins/multiple-post-passwords/

Et oui, avoir une série de chiffres comme mots de passe est une mauvaise idée;)

0
am_