wp 認証コードでログインしてもらう場合のコード

2024年5月25日

特定の人にのみページ閲覧が可能な仕様にしたいという案件。
会員登録してもらう方法は閲覧者に負担がかかるため、認証コードを持っていれば誰でも閲覧できるようにしたい。

トップページに認証コード入力フォームを設置して、コードを入力したら目的のページに遷移するという感じ。

最初にACFで認証が必要なページに認証コードを入力できるカスタムフィールドを追加して、コードが一致した場合のみ閲覧できるという方法にした。
今案件の場合はfront-pageにはauth_code、認証が必要なページにはauth_passというフィールドを作成した。
すべての認証コードは同一にする。
トップページのauth_codeに入れたコードが保持され、認証が必要なページのauth_passとの確認が行われる。
正しい場合はページを表示し、間違っていた場合はトップページに戻る。

では設定方法を。
まずfunctions.phpに以下のコードを追加。

// セッションの開始
function start_session() {
    if (!session_id()) {
        session_start();
    }
}
add_action('init', 'start_session');

// 認証フォームの表示関数
function display_auth_form() {
    ?>
    <form method="post" action="<?php echo esc_url(home_url()); ?>">
    <dl>
        <div>
		<dt>
        <label for="auth_pass"><p>認証コード</p></label></dt><dd>
        <input type="text" name="auth_pass" id="auth_pass" required></dd>
</div>
</dl>
<?php
    if (isset($_SESSION['auth_error']) && $_SESSION['auth_error']) {
        echo '<div class="c-error"><p>認証コードが間違っています。</p></div>';
        unset($_SESSION['auth_error']);
    }
    ?>
        <button type="submit">確 認</button>
    </form>
    <?php
}
?> 

次にトップページに認証フォームを追加するコードをfront-page.phpに追加。

<?php
// セッションを開始
if(!isset($_SESSION)){
    session_start();
}

// フォームが送信されたときの処理
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['auth_pass'])) {
    // 入力された認証コード
    $input_auth_code = sanitize_text_field($_POST['auth_pass']);
    
    // 正しい認証コードを取得(例としてトップページに設定されたACFのフィールドを使用)
    $correct_auth_code = get_field('auth_code');
    
    // 認証コードの確認
    if ($input_auth_code === $correct_auth_code) {
        // 正しい認証コードの場合、セッションに保存
        $_SESSION['auth_pass'] = $input_auth_code;
        // リダイレクトしてフォームの再送信を防止
        wp_redirect(home_url('/scene/'));
        exit;
    } else {
        // 誤った認証コードの場合、エラーメッセージをセッションに保存
        $_SESSION['auth_error'] = true;
    }
}
?>

sessionコードは<?php get_header(); ?>より前に入れること。

次に認証コードが必要なページにコード確認のためのコードを追加。

<?php
// セッションを開始
if(!isset($_SESSION)){
    session_start();
}
?>
<?php get_header(); ?>
<!-- page scene ballet -->
<?php

// 現在のページの認証コードを取得
$required_auth_code = get_field('auth_pass');

// 認証コードが設定されている場合の確認処理
if ($required_auth_code) {
    // セッションに保存された認証コードが一致しない場合
    if (!isset($_SESSION['auth_pass']) || $_SESSION['auth_pass'] !== $required_auth_code) {
        // 認証失敗メッセージを設定
        $_SESSION['auth_error'] = true;
        // トップページにリダイレクト
        wp_redirect(home_url());
            exit;
        }
}
?>

この場合はコードが間違っていた場合はトップページへリダイレクトする。

PAGE TOP