0
0

More than 3 years have passed since last update.

【WordPress】カスタム投稿やアーカイブに一括で共通のパスワードをつける。

Posted at

要件

・パスワード認証画面は別途固定ページで作成する。

・閲覧ページ(パスワードをかけるページ)と認証ページのURLを関連づける。

・閲覧ページにアクセスしたとき、
 パスワード未認証なら関連づけられた固定ページに自動で飛ばす。

・パスワード認証後、関連づけられた閲覧ページに自動で飛ばす。
 (認証済みで認証用固定ページにアクセスした場合も同様。)

・認証済み情報をユーザーIDで管理。
 (今回のサイトが会員制サイトだったため)

・管理画面にパスワード管理ページを追加する。

パスワード管理ページの構築

管理画面にパスワード管理用のページを追加します。

function.php
<?php
//パスワード管理
add_action( 'admin_menu', 'register_password_page' );
function register_password_page(){
    add_menu_page( 'パスワード管理', 'パスワード管理','manage_options', 'password_manager', 'password_page', '', 6 );
}
function password_page(){
    include '../wp-load.php';
    global $wpdb;
    if($_POST){
        echo "<h2>パスワード管理</h2>";
        echo "Loading...";
        if($_POST["del"]){
            //データベースの削除
            $where = array( 'seq' => $_POST["del"] );
            $wpdb->delete("wp_passwords", $where);
        }
        else{
            $datas = $wpdb->get_results("SELECT * FROM wp_passwords WHERE type = 'pageurl'");
            $datas = json_decode(json_encode($datas), true);
            foreach( $_POST as $key => $post ){
                $type = preg_replace( "/[0-9]/i", "",  $key);
                $no = preg_replace( "/[^0-9]/i", "",  $key);
                if( $type == "pageurl" ){
                    $exist = false;
                    foreach( $datas as $data ){
                        if( $type ==  $data["type"] && $no == $data["seq"] ){
                            $exist = true;
                            break;
                        }
                    }
                    $values = array('value' => $post , 'type' => $type );
                    $where = array('seq' => $no , 'type' => $type );
                    if( $exist ){
                        //データベースの更新
                        $wpdb->update("wp_passwords", $values, $where);
                    }
                    else{
                        //データベースの追加
                        $values +=array('seq' => $no );
                        $wpdb->insert("wp_passwords", $values);
                    }
                }
                else{
                    $where = array('seq' => $no , 'type' => $type );
                    $wpdb->delete("wp_passwords", $where);
                    $pwdurls = explode( "n" , $post);
                    foreach( $pwdurls as $pwdurl ){
                        if( trim($pwdurl) == "" ){
                            continue;
                        }
                        //データベースの追加
                        $values = array('value' => $pwdurl , 'type' => $type , 'seq' => $no );
                        $wpdb->insert("wp_passwords", $values);
                    }
                }
            }
        }
    }
    $pwdurls = $wpdb->get_results("SELECT * FROM wp_passwords WHERE type = 'pwdurls' ORDER BY seq");
    $pwdurls = json_decode(json_encode($pwdurls), true);
    $pageurl = $wpdb->get_results("SELECT * FROM wp_passwords WHERE type = 'pageurl' ORDER BY seq");
    $pageurl = json_decode(json_encode($pageurl), true);
    echo "<div class='pwdpage'>";
    echo "<h2>パスワード管理</h2>"; 
    echo "<br>";
    echo "<form action='' method='post'>";
    echo "<table id='sets_table'>";
        echo "<tr><th>パスワード認証用の固定ページURL</th><th>カスタム投稿タイプ名</th><th class='del'>削除</th></tr>";
        foreach( $pageurl as $pu ){
            $urls = "";
            foreach( $pwdurls as $pwdurl ){
                if( $pwdurl["seq"] == $pu["seq"] ){
                    $urls .= $pwdurl["value"]."n";
                }
            }
            echo "<tr><td><input type='text' name='pageurl{$pu["seq"]}' value='{$pu["value"]}'></td>";
            echo "<td><textarea name='pwdurls{$pu["seq"]}'>{$urls}</textarea></td>";
            echo "<td class='del'><button type='button' id='{$pu["seq"]}' onclick='delRow(this);'>削除</button></td></tr>";
        }
    echo "</table>";
    echo "<button type='button' onclick='addSet();'>行を追加する</button>";
    echo "<button class='save' type='submit'>全て保存する</button>";
    echo "</form>";
    echo "</div>";
}?>

パスワード認証時の判定

パスワード認証を行ったときの処理を書きます。

今回のシステムとは関係ない投稿や固定ページでの認証の場合は除外し、
初認証の場合は、ユーザーIDをデーターベースに追加します。

function.php
function custom_auth_save() {
    include 'wp-load.php';
    global $wpdb;
    //パスワードの一致確認
    $postid = url_to_postid( wp_get_referer() );
    $pwds = $wpdb->get_results("SELECT * FROM wp_posts WHERE ID = '".$postid."'");
    //一致する場合、認証済み判定を行う
    if( $pwds[0]->post_password == $_POST['post_password'] ){
        $datas = $wpdb->get_results("SELECT * FROM wp_passwords ORDER BY seq");
        $seq = false;
        //今回のシステムでパスワードをかけたページかどうか判別
        foreach( $datas as $data ){
            if( $data->type == "pageurl" && strpos( $data->value , wp_get_referer() )  !==false ){
                $seq = $data->seq;
                break;
            }
        }
        //すでに認証済みか確認
        if( $seq ){
            foreach( $datas as $data ){
                $cu = wp_get_current_user();
                if( $data->type == "userauth" && $data->seq == $seq && $data->value == $cu->ID ){
                    $seq = false;
                    break;
                }
            }
        }
        //未認証ならユーザーIDを追加保存する。
        if( $seq ){
            //保存
            $values =array( 'seq' => $seq , 'type' => "userauth" , 'value' => $cu->ID );
            $wpdb->insert("wp_passwords", $values);
        }
    }
}
add_action( 'login_form_postpass', 'custom_auth_save' );

パスワード未認証時のページ自動遷移

閲覧ページにアクセスしたときに、
パスワード未認証なら、認証ページに飛ばす処理を書きます。

以下のコードを header.php の頭に追加します。

header.php
<?php
    //パスワード管理(コンテンツにパスワードをかけて、未認証の場合、パスワードページに飛ばす)
    $datas = $wpdb->get_results("SELECT * FROM wp_passwords");
    $seq = false;
    //一致確認
    foreach( $datas as $data ){
        //データベースの閲覧ページURLを調整
        $dataurl = str_replace( "http://" , "" , $data->value );
        $dataurl = str_replace( "https://" , "" , $dataurl );
        $dataurl = trim($dataurl);
        //現在アクセスしているのURLを調整
        $pageurl = $_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
        if( $data->type == "pwdurls" && strpos( urldecode($pageurl) , $dataurl ) !==false ){
            $seq = $data->seq;
            break;
        }
    }
    //認証済みかどうか確認する。
    if( $seq ){
        foreach( $datas as $data ){
            $cu = wp_get_current_user();
            if( $data->type == "userauth" && $data->seq == $seq && $data->value == $cu->ID ){
                $seq = false;
                break;
            }
        }
    }
    //未認証ならパスワード認証ページに飛ばす。
    if( $seq ){
        foreach( $datas as $data ){
            if( $data->type == "pageurl" && $data->seq == $seq){
                wp_redirect( $data->value );
                exit;
            }
        }
    }
?>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0