WordPress默认有密码保护功能,但是默认的密码保护功能只是帮助用户隐藏后台编辑器中添加的内容。如果想要整页进行密码保护,可以简单的写一个利用php session的密码保护功能。

演示视频:

步骤:

1,首先在后台文章编辑页面创建一个可以添加密码的文本框。

<?php
function post_passCode()
{
    new passCode();
}

if (is_admin()) {
    add_action('load-post.php', 'post_passCode');
    add_action('load-post-new.php', 'post_passCode');
}

class passCode
{

    public function __construct()
    {
        add_action('add_meta_boxes', array($this, 'add_meta_box'));
        add_action('save_post', array($this, 'save'));
    }

    public function add_meta_box($post_type)
    {

        $post_types = array('post');

        if (in_array($post_type, $post_types)) {
            add_meta_box(
                'post_code',
                'Post PassCode',
                array($this, 'render_meta_box_passcode'),
                $post_type,
                'side',
                'high'
            );
        }
    }

    public function save($post_id)
    {

        if (!isset($_POST['pass_code_nonce'])) {
            return $post_id;
        }

        $nonce = $_POST['pass_code_nonce'];

        if (!wp_verify_nonce($nonce, 'pass_code')) {
            return $post_id;
        }

        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
            return $post_id;
        }

        if ('page' == $_POST['post_type']) {
            if (!current_user_can('edit_page', $post_id)) {
                return $post_id;
            }
        } else {
            if (!current_user_can('edit_post', $post_id)) {
                return $post_id;
            }
        }

        $pass_code = sanitize_text_field($_POST['pass_code']);

        update_post_meta($post_id, '_pass_code', $pass_code);
    }

    public function render_meta_box_passcode($post)
    {

        wp_nonce_field('pass_code', 'pass_code_nonce');
        $value = get_post_meta($post->ID, '_pass_code', true);
        ?>
<input type="text" name="pass_code" value="<?php echo esc_attr($value); ?>" size="25" />
<?php
}
}

2,在前台(本例中使用的是single.php模板)判断文章是否设置了密码,如果设置了,那么通过session来处理密码。如果输入的密码不匹配那么输出密码提示框。(如果输入密码了,设定session有效期为5分钟)

<?php
$post_id = get_queried_object_id();
$passcode = get_post_meta($post_id, '_pass_code', true);
if (!empty($passcode)) {
    session_start();
    $session_name = 'post_passcode_' . $post_id;
    $session_passcode = $_POST[$session_name];
    if (!empty($session_passcode)) {
        $_SESSION[$session_name] = $session_passcode;
        $_SESSION["passcode_time_stamp"] = time();        
    }
    if (time() - $_SESSION["passcode_time_stamp"] > 600) {
        session_unset();
        session_destroy();
    }
    $stored_session = $_SESSION[$session_name];
    if (!empty($stored_session) && ($passcode == $stored_session)) {
        require 'inc/content-single.php';
    } else {
        require 'inc/content-single-passcode.php';
    }
} else {
    require 'inc/content-single.php';
}
session_write_close();
get_footer();
上面代码中的content-single.php文件的代码:
<?php
get_header();
while (have_posts()) {
    the_post();
    ?>
<main>
    <h1><?php the_title();?></h1>
    <div class="post-author">Posted by <?php the_author();?></div>
    <div class="post-content"><?php the_content();?></div>
    <div class="post-date"><?php the_date();?></div>
</main>
<?php
}
content-single-passcode.php文件的代码:
<?php
get_header();
while (have_posts()) {
    the_post();
    ?>
<div class="note">Please enter the correct password</div>
<form action="" method="post">
    <input type="password" name="<?php echo $session_name; ?>">
    <input type="submit" value="Submit">
</form>
<?php
}

以上。