特定のカテゴリーまたはその子カテゴリーに属する記事を開こうとするとパスワード入力フォームに遷移する機能をご紹介します。
会員の方にだけパスワードを教えて記事が見られるようにする…といった利用方法を想定しています。
今回使うファイルはfunction.phpとフォーム用の小さいphpファイルのみ。
WordPress: 6.3.2
PHP: 8.0.30
MySQL: 5.7
制御対象のカテゴリーを仮に「会員専用」として作成します。
その子カテゴリーを「イベント情報」「限定商品」などと作成します。
それぞれにテスト用の記事を用意しましょう。
まず、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');
今回は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」の中に保存されているクッキーの中から、
「category_password_verified」を右クリックして削除すると、目的のクッキーが削除できます。
これで再度アクセスすると、認証画面が表示されるはずです。