web-dev-qa-db-ja.com

複数のパスワードでパスワード保護ページ

こんにちは私のクライアントはワードプレスでパスワード保護ページを追加する必要があります。だから私はパスワード保護としてページの可視性を作り、それは正しく働いています。しかし、クライアントは一連のパスワードを与えています。彼は2314から2335までのパスワードを与えられています。パスワードは2314から2335までの間の任意の数です。これを解決するための方法や呼び出しはありますか?何かフックはありますか?

5
ron r

これは、これが可能かどうかを確認するための楽しみのためのデモテストです。

デモ

まず、投稿のパスワードを設定します。これは通常の方法です。

password 

次に、カンマ区切りのパスワードを使用するwpse_extra_passwordsという カスタムフィールド を作成します。

extra passwords 

これらはその投稿のための追加のパスワードです。

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;
}

それからthe_password_formフィルタにフックし、メインループ内の単一のpostオブジェクトをターゲットにします。

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

うまくいけば、あなたはそれをテストし、それをさらに楽しむことができます。

ノート

2314のようなパスワードについて言及しました。そのような単純なパスワードを推測できるプログラムを書くのはとても簡単です。そのため、このデモではもう少し強力なパスワードを使用しました。

9
birgire

そのためにプラグインを使うこともできます。 https://wordpress.org/plugins/multiple-post-passwords/ /

そして、そうです、パスワードとして一連の数字を持つことは悪い考えです;)

0
am_