WordPress

【WordPress】特定カテゴリとその子カテゴリの記事でパスワード認証画面表示

概要

特定のカテゴリーまたはその子カテゴリーに属する記事を開こうとするとパスワード入力フォームに遷移する機能をご紹介します。

会員の方にだけパスワードを教えて記事が見られるようにする…といった利用方法を想定しています。

今回使うファイルはfunction.phpとフォーム用の小さいphpファイルのみ。

環境

各種バージョン

WordPress: 6.3.2
PHP: 8.0.30
MySQL: 5.7

検証テーマ

Cocoon

今回使用するファイル

  • funciton.php:認証の実行、cookieの登録(ログイン有効期限設定)などを行います。
  • path_to_password_form.php:表示する認証画面です。自作するファイルで、ファイル名は任意です。function.phpと同じ場所に置きます。

カテゴリーと記事を用意

制御対象のカテゴリーを仮に「会員専用」として作成します。

その子カテゴリーを「イベント情報」「限定商品」などと作成します。

それぞれにテスト用の記事を用意しましょう。

function.phpとフォーム用phpの作成

function.php

まず、function.phpにパスワード制御の関数を追加・セットします。

function get_protected_category_ids() {
    $protected_category_slug = '会員専用';
    $parent_id = get_term_by('slug', $protected_category_slug, 'category')->term_id;
    $child_ids = get_term_children($parent_id, 'category');

    return array_merge(array($parent_id), $child_ids);
}
function check_category_password() {

    $pw = 'testpw';  //パスワード
    $expiration = time() + (30 * 24 * 60 * 60); //ログイン有効期間
    $form_filename = 'path_to_password_form.php'; //フォーム用phpのファイル名
    

    if (is_single() && array_intersect(get_protected_category_ids(), wp_get_post_categories(get_the_ID()))) {
        if (isset($_POST['category_password'])) {
            if ($_POST['category_password'] == $pw) { 
                setcookie('category_password_verified', 'true', $expiration, COOKIEPATH, COOKIE_DOMAIN, is_ssl());
            } else {
                // パスワードが間違っていた場合の処理
                wp_die('パスワードが間違っています。');
            }
        } elseif (!isset($_COOKIE['category_password_verified']) || $_COOKIE['category_password_verified'] != 'true') {
            require_once($form_filename);
            exit;
        }
    }
}
add_action('template_redirect', 'check_category_password');

フォーム用php

今回はpath_to_password_form.phpという名前にしています。function.phpの横に置きましょう。

中身は次のようにします。

<form action="" method="post">
    <label for="category_password">パスワードを入力してください:</label>
    <input type="password" name="category_password" id="category_password">
    <input type="submit" value="送信">
</form>

フォーム用にファイルを切り出しているので、個別に編集がしやすくなります。

たとえば、次のような要素をお好みで追加してください。

<div>
  <a href="#" target="_blank">入会ご希望の方はこちら</a>
</div>

これで完了です。

補足

親カテゴリーや子カテゴリーのついた記事にアクセスしてテストする際に、一度ログインしてしてしまうとcookieが残っていて再ログインして試せないということがあると思います。

ここでは補足としてcookieの削除方法をご紹介します。

まず、ページ内のどこかそこらへんを右クリックして「検証」を選びます。

検証

「アプリケーション」または「Application」を選び、 アプリケーション

「Cookies」の中に保存されているクッキーの中から、 Cookies

「category_password_verified」を右クリックして削除すると、目的のクッキーが削除できます。 削除

これで再度アクセスすると、認証画面が表示されるはずです。

Profile

yusukeフリーのwebエンジニア