Simple Membership(正式名称:Simple WP Membership)は、WordPressサイトに会員機能を追加できる無料プラグインです。

主な機能は次のとおりです。

  • 会員登録・ログイン・プロフィール編集・パスワードリセット用の固定ページを自動生成
  • 会員レベル(ランク)を複数作成して、レベルごとにコンテンツの閲覧可否を制御
  • 投稿・固定ページ・カスタム投稿タイプ・カテゴリー単位でのコンテンツ保護
  • PayPal・Stripeとの決済連携(有料会員サイトにも対応)
  • 登録・完了・パスワードリセット等のメール自動送信

課金機能が不要な「社員専用ページ」「読者限定コンテンツ」などのシンプルな用途であれば、無料の範囲で十分に実装できます。


    2. インストールと初期ページの整理

    インストール

    WordPressの管理画面から プラグイン → 新規追加 で「Simple Membership」を検索し、インストール・有効化します。

    自動生成されるページ

    有効化すると、固定ページに以下のページが自動生成されます。

    自動生成されたURL 役割
    /membership-login/ ログインページ
    /membership-join/membership-registration/ 会員登録ページ
    /membership-join/ 会員案内ページ
    /membership-login/membership-profile/ プロフィール編集
    /membership-login/password-reset/ パスワードリセット
    /thank-you/ サンクスページ

    デフォルトのURLはやや分かりにくい階層構造になっているため、用途に合わせて整理することを強くおすすめします。

    URLを整理する(推奨手順)

    /membership/ を親として、すべてをその配下に統一します。

    Step 1|親ページ membership を新規作成

    項目
    タイトル Membership(任意)
    スラッグ membership
    公開状態 非公開(直接アクセスさせない)

    Step 2|各固定ページのスラッグと親ページを変更

    変更前ページ 新スラッグ 親ページ
    メンバーログイン login membership
    登録 registration membership
    Join Us join membership
    プロフィール profile membership
    パスワードのリセット password-reset membership
    Thank You thanks membership

    Step 3|Simple Membership のページ設定URLを更新

    WP Membership → 設定 → ページ設定 から各URLを書き換えます。

    ログインページ URL           → /membership/login/
    登録ページ URL               → /membership/registration/
    会員登録案内ページ URL        → /membership/join/
    プロフィール編集ページ URL    → /membership/profile/
    パスワードリセットページ URL  → /membership/password-reset/
    Thank You Page URL          → /membership/thanks/
    

    Step 4|パーマリンクを更新

    設定 → パーマリンク を開いて変更なしで「変更を保存」。リライトルールをフラッシュします。

    注意: membership 親ページを非公開にしておかないと /membership/ に直接アクセスされてしまいます。


    3. 会員レベルの設計と作成

    会員レベルとは

    Simple Membershipにおける「会員レベル」は、閲覧権限のランク区分です。各ページ・投稿に対して「このレベル以上のユーザーなら閲覧可」という設定ができます。

    会員レベルの作成

    WP Membership → 会員レベル → レベルの追加 から作成します。

    設定項目 説明
    会員レベル名 管理・表示用の名前(例:memberLv-regular)
    WordPressのデフォルトユーザー権限 閲覧のみなら「購読者」、記事投稿が必要なら「投稿者」以上
    アクセス有効期限 無期限 or 日付・期間指定

    会員レベルの設計例

    今回の「社員専用ページ」を例にすると、将来的なランク拡張を見越して以下のように設計しました。

    ID レベル名 権限 用途
    2 memberLv-admin Administrator 管理者
    3 memberLv-regular Subscriber 一般社員(読み取り専用)
    4 memberLv-silver Editor 将来的なランク拡張用
    5 memberLv-gold Editor
    6 memberLv-platinum Editor
    7 memberLv-centurion Editor
    8 memberLv-palladium Editor

    ポイント: 管理者用レベルを作成しておかないと、管理者WPアカウントでもSMの保護ページを閲覧できなくなる場合があります(current_user_can('administrator') チェックで回避もできます)。


    4. 一般設定・詳細設定

    一般設定

    WP Membership → 設定 → 一般設定

    項目 推奨設定
    無料会員を有効にします
    無料会員レベルID デフォルトで自動付与したいレベルのIDを入力
    管理バーを表示 ❌(フロントに管理バーを出したくない場合)
    WPダッシュボードへのアクセスを無効にする ✅(一般会員にダッシュボードを見せたくない場合)

    詳細設定

    WP Membership → 設定 → 詳細設定

    項目 推奨設定
    登録後の転送先URL /membership/(ログイン後のトップページ)
    ログアウト後のリダイレクトURL /(サイトトップ)
    同時ログイン制限を有効化 ✅(同一アカウントの多重ログイン防止)
    Maximum Active Logins 3(端末数の上限)
    ログイン失敗回数制限を有効化 ✅(ブルートフォース対策)
    ログイン失敗の最大数 3
    ロックアウト期間(分) 3

    5. メール設定を日本語にする

    WP Membership → 設定 → メール設定 から各メールを日本語に変更します。デフォルトはすべて英語です。

    以下は実用的なテンプレートです。会社情報部分は適宜変更してください。

    送信元メールアドレス

    会社名 <info@example.jp>
    

    登録完了のお知らせ(本登録案内メール)

    件名: 【〇〇会社】本登録を完了してください

    {last_name}{first_name} 様
    
    会員登録ありがとうございます。
    
    以下のURLをクリックして、本登録を完了してください。
    {reg_link}
    
    会員登録日: {member_since}
    ――――――――――――――――――――――――――――
    このEメールは配信専用です。返信しないようお願いいたします。
    〒000-0000 ○○市○○町0丁目0番0号
    TEL:000-000-0000
    

    登録完了メール

    件名: 【〇〇会社】会員登録が完了いたしました

    {last_name}{first_name} 様
    
    会員登録が完了いたしました。
    以下のリンクから、ログインしてください。
    
    登録情報
    Username: {user_name}
    Password: {password}
    メンバーログインURL:{login_link}
    
    会員登録日: {member_since}
    ――――――――――――――――――――――――――――
    このEメールは配信専用です。返信しないようお願いいたします。
    

    パスワードリセットメール

    件名: 【〇〇会社】パスワードリセット

    {last_name}{first_name} 様
    
    パスワードリセットのご依頼を受け付けました。
    以下のリンクからパスワードを再設定してください。
    
    {password_reset_link}
    
    ※このリンクは一定時間で無効になります。
    ※身に覚えのない場合は、このメールを無視してください。
    

    管理者通知メール

    件名: 【〇〇会社】新しい会員登録のお知らせ

    新しい会員登録のお知らせです。
    
    Username: {user_name}
    
    管理画面よりユーザーの詳細を確認できます。
    

    会員一括有効化の通知

    件名: 【〇〇会社】会員登録完了のお知らせ

    {last_name}{first_name} 様
    
    会員登録のお知らせです。
    
    登録情報
    Username: {user_name}
    Password: {password}
    メンバーログインURL:{login_link}
    

    利用できる変数: {first_name} {last_name} {user_name} {password} {login_link} {reg_link} {activation_link} {password_reset_link} {member_since}


    6. 翻訳ファイルを修正して日本語を完成させる

    Simple Membershipにはほぼ日本語訳が同梱されていますが、いくつか翻訳漏れや誤訳があります。

    翻訳ファイルの場所

    /wp-content/languages/plugins/simple-membership-ja.po
    /wp-content/languages/plugins/simple-membership-ja.mo
    

    注意: プラグインフォルダ内ではなく languages/plugins/ 配下です。

    修正が必要な箇所

    1. 「Not a Member?」の誤訳

    種別 内容
    msgid Not a Member?
    修正前 msgstr あなたは会員ですか ?(意味が逆)
    修正後 msgstr まだ会員ではありませんか?

    2. ログインエラーメッセージの統一(セキュリティ対策)

    デフォルトだと「ユーザー名が間違っています」「パスワードが間違っています」と個別に表示されます。どちらが間違っているか分からないように統一しましょう。

    msgid "No user found with that username or email."
    msgstr "ユーザー名またはパスワードが正しくありません。"
    
    msgid "Password Empty or Invalid."
    msgstr "ユーザー名またはパスワードが正しくありません。"
    

    moファイルへの変換

    .po ファイルを修正したら .mo ファイルに変換して差し替えます。変換には Poedit を使うか、コマンドラインで次のように実行します。

    msgfmt simple-membership-ja.po -o simple-membership-ja.mo
    

    7. コンテンツ保護の設定方法

    個別ページ・投稿への保護設定

    各投稿・ページの編集画面に「Simple WP Membership プロテクション」パネルが表示されます。

    1. 「はい、コンテンツを保護します」 を選択
    2. 閲覧を許可する会員レベルにチェック
    3. 保存・更新

    保護されたコンテンツに未ログインでアクセスすると、「このコンテンツは限定公開です」のメッセージが表示されます。

    カテゴリー単位での一括保護(推奨)

    カテゴリー保護を使うと、カテゴリーに属する主要な投稿を自動で保護できます。

    1. WP Membership → 会員レベル → カテゴリー保護 タブを開く
    2. ドロップダウンから保護に使う会員レベルを選択
    3. 保護したいカテゴリーにチェック
    4. 「更新」をクリック

    カテゴリー保護のメリット:

    • 新規投稿時に毎回手動設定が不要
    • カテゴリーを付与するだけで自動的に保護される
    • 管理者やクライアントの操作ミスを防ぎやすい

    8. カスタム投稿タイプへの自動保護を実装する

    カスタム投稿タイプを使っている場合、投稿時に自動でカテゴリーを付与し、カテゴリー保護を適用するのが最もシンプルで確実な方法です。

    手順

    Step 1|保護用カテゴリーを作成

    通常の投稿カテゴリーに「メンバー限定」などの名称でカテゴリーを作成します。作成後、カテゴリーIDをメモしておきます。

    Step 2|カテゴリー保護を設定

    上記の手順でこのカテゴリーに対して会員レベル保護を設定します。

    Step 3|functions.php に自動付与コードを追加

    /**
     * カスタム投稿タイプ「bulletin」の保存時に
     * 「メンバー限定」カテゴリーを自動付与する
     */
    add_action('save_post_bulletin', function ($post_id) {
    
        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
        if (wp_is_post_revision($post_id)) return;
    
        // 「メンバー限定」カテゴリーのID(作成後に確認して変更)
        $membership_cat_id = 27; // ← 実際のIDに変更
    
        // 既存のカテゴリーを取得して追加(他のカテゴリーを消さない)
        $current_terms = wp_get_post_terms($post_id, 'category', ['fields' => 'ids']);
        if (!in_array($membership_cat_id, $current_terms)) {
            $current_terms[] = $membership_cat_id;
            wp_set_post_terms($post_id, $current_terms, 'category');
        }
    
    }, 10);
    

    なぜ wp_after_insert_postsave_post(999) ではなく save_post_{post_type} なのか

    Simple MembershipはGutenbergのREST API経由の保存に対して独自のフックで動作するため、save_post でメタ(swpm_protect_post)を上書きしようとしても、新規投稿時にSM側に打ち消されることがあります。カテゴリー保護はこのメカニズムに依存しないため、上記の方法が最もシンプルで安定しています。


    9. ログイン後・ログアウト後のリダイレクト設定

    ログアウト後のリダイレクト

    Simple Membershipの詳細設定から設定できます。

    ログアウト後のリダイレクトURL → /
    

    ログイン後のリダイレクト

    Simple Membershipにはログイン後の転送設定がありません。テーマの head.php(または functions.php)にPHPで制御を追加します。

    以下は swpm-customize.php としてパーツファイルに切り出す実装例です。

    <!-- ログイン状況に応じた、分岐・転送処理 -->
    <?php if (current_user_can('administrator')) : ?>
        <!-- 管理者の場合は何もしない -->
    
    <?php elseif (class_exists('SwpmMemberUtils')
        && !SwpmMemberUtils::is_member_logged_in()
        && !is_page(array('login', 'registration', 'membership', 'profile', 'reset'))) : ?>
        <!-- 未ログインの場合はLoginページに転送 -->
        <script>
            setTimeout(function () {
                var paramstr = document.location.search;
                location.href = "<?php echo esc_js(home_url('')); ?>/membership/login/" + paramstr;
            }, 0);
        </script>
    
    <?php elseif (class_exists('SwpmMemberUtils')
        && SwpmMemberUtils::is_member_logged_in()
        && is_page(array('login', 'registration', 'profile', 'reset'))) : ?>
        <!-- ログイン中にログイン/登録ページに来た場合、会員トップに転送 -->
        <script>
            setTimeout(function () {
                var paramstr = document.location.search;
                location.href = "<?php echo esc_js(home_url()); ?>/membership/" + paramstr;
            }, 0);
        </script>
    
    <?php endif; ?>
    

    このファイルを head.php</head> の後、<body> タグの前に読み込みます。

    <!-- ★Simple Membership カスタマイズ -->
    <?php include(get_theme_file_path() . '/parts/swpm-customize.php'); ?>
    
    <body id="..." <?php body_class($body_addclass); ?>>
    

    ポイント: is_page(array('login', ...)) の配列にはページのスラッグを指定します。整理後のスラッグに合わせて変更してください。


    10. テーマとの連携:bodyクラスでレベル別制御

    ログイン状態・会員レベルをbodyクラスに付与

    ログイン中かどうか、どのレベルかをbodyクラスに付与しておくと、CSSだけでUI要素の表示・非表示を制御できて便利です。

    swpm-customize.php に以下を追加します($body_addclasshead.php で事前に定義されている前提)。

    <?php
    if (class_exists('SwpmMemberUtils') && SwpmMemberUtils::is_member_logged_in()) {
    
        $body_addclass .= ' swpm-loggedIn';
    
        $level_map = [
            '2' => 'swpm-memberLv-admin',
            '3' => 'swpm-memberLv-regular',
            '4' => 'swpm-memberLv-silver',
            '5' => 'swpm-memberLv-gold',
            '6' => 'swpm-memberLv-platinum',
            '7' => 'swpm-memberLv-centurion',
            '8' => 'swpm-memberLv-palladium',
        ];
    
        $member_level = SwpmMemberUtils::get_logged_in_members_level();
        if (isset($level_map[$member_level])) {
            $body_addclass .= ' ' . $level_map[$member_level];
        }
    }
    ?>
    

    CSSでの制御例:ナビゲーションの出し分け

    /* ログインボタン:ログイン中は非表示 */
    :is(.swpm-memberLv-admin,
        .swpm-memberLv-palladium,
        .swpm-memberLv-centurion,
        .swpm-memberLv-platinum,
        .swpm-memberLv-gold,
        .swpm-memberLv-silver,
        .swpm-memberLv-regular) .item-login {
        display: none;
    }
    
    /* 投稿ボタン:ログイン中のみ表示 */
    .item-postNew {
        display: none;
    }
    :is(.swpm-memberLv-admin,
        .swpm-memberLv-silver) .item-postNew {
        display: block; /* silverレベル以上のみ表示 */
    }
    

    レベル別にリンクの有効・無効を制御する

    /* 対象のリンクをデフォルト無効化 */
    .swpm-disabled-silver > a {
        pointer-events: none;
        opacity: 0.3;
    }
    
    /* silverレベル以上なら有効化 */
    :is(.swpm-memberLv-admin,
        .swpm-memberLv-palladium,
        .swpm-memberLv-centurion,
        .swpm-memberLv-platinum,
        .swpm-memberLv-gold,
        .swpm-memberLv-silver) .swpm-disabled-silver > a {
        pointer-events: auto;
        opacity: 1;
    }
    

    11. 動作確認のチェックリスト

    実装後は以下を確認してください。

    未ログイン状態

    • 保護されているページに直接アクセスすると /membership/login/ に転送される
    • ログインページ・登録ページ・会員案内ページには未ログインでもアクセスできる

    ログイン状態

    • ログイン後、/membership/ に転送される
    • 保護コンテンツが正しく表示される
    • ログインページ・登録ページにアクセスすると /membership/ に転送される(二重ログイン防止)
    • ログアウト後、サイトトップ(/)に転送される

    管理者

    • 管理者アカウントはリダイレクトが発動しない
    • 主要な保護コンテンツを閲覧できる

    メール

    • 登録完了メールが日本語で届く
    • パスワードリセットメールが届く

    カスタム投稿タイプ(自動保護)

    • 新規投稿時に「メンバー限定」カテゴリーが自動付与される
    • 未ログインで個別ページにアクセスするとログインページに転送される
    • 既存の通常投稿・固定ページは保護されない

    まとめ

    Simple Membershipは「導入してすぐ使える」プラグインではなく、URL整理・翻訳修正・リダイレクト実装・カスタム投稿の保護設定など、いくつかの追加作業をして初めて本番運用に耐える状態になります。

    特に躓きやすいポイントをまとめると:

    • ログイン後の転送設定がない → テーマ側でPHP/JSで制御する必要がある
    • 翻訳漏れ・誤訳がある.po/.mo ファイルの修正が必要
    • カスタム投稿タイプの保護はメタ操作が不安定 → カテゴリー保護 + 自動付与が最も確実

    これらを押さえて設定すれば、社員専用ページや読者限定コンテンツなど、シンプルな会員制サイトをWordPressで安定して運用できます。