2026年5月29日
2026年5月29日
WordPressで会員限定コンテンツを作る方法(ログイン必須・権限別表示・プラグイン)
WordPress は、公開した投稿を誰でも読める状態にします。一部の記事をログインした会員だけに見せるには、コードで表示を切り替えるか、会員サイト用のプラグインを使います。
会員の登録・決済・有効期限まで管理したい場合はプラグインが向いています。すでに会員(ユーザー)がいて、「ログインしている人だけに本文を見せたい」だけなら、数十行のコードで足ります。
この記事のコードは、2026年11月時点の WordPress 7.1(PHP 8.3)で動作を確かめました。
先に知っておきたい「漏れ道」
本文を隠すときに見落としやすいのが、記事のページ以外から本文が読めてしまうことです。WordPress は、投稿の本文を次の場所にも出します。
- RSS フィード(
/feed/) - REST API(
/wp-json/wp/v2/posts) - アーカイブや検索結果の抜粋
テンプレートの中で is_user_logged_in() を使って表示を分けるだけでは、記事のページには効いても、フィードや REST API からは本文がそのまま読めます。このあとのコードは、本文を the_content フィルターで差し替えます。WordPress はフィードと REST API の本文(content.rendered)にもこのフィルターを通すので、同じ処理で3か所をまとめて隠せます。
方法1: カテゴリーで会員限定にする
カテゴリー「会員限定」(スラッグ members-only)に入れた投稿を、ログインしていない人には案内文に差し替えます。
- 「投稿」→「カテゴリー」で、スラッグが
members-onlyのカテゴリーを作ります。 - 次のコードを
wp-content/mu-plugins/members-only.phpとして保存します(mu-pluginsフォルダーが無ければ作ります)。このフォルダーのファイルは、有効化しなくても読み込まれます。 - 会員限定にしたい投稿に、カテゴリー「会員限定」を付けます。
<?php
/**
* Plugin Name: 会員限定コンテンツ
*/
// 会員限定の投稿かどうか(カテゴリー「members-only」か、チェックボックスが付いている)
function my_is_members_only( $post = null ) {
$post = get_post( $post );
if ( ! $post ) {
return false;
}
if ( '1' === get_post_meta( $post->ID, '_my_members_only', true ) ) {
return true;
}
return has_category( 'members-only', $post );
}
// 閲覧できる人かどうか(ここではログインしていれば可)
function my_can_view_members_content() {
return is_user_logged_in();
}
// 1. 本文を案内文に差し替える(画面・RSS フィード・REST API に効く)
add_filter( 'the_content', function ( $content ) {
if ( my_can_view_members_content() || ! my_is_members_only() ) {
return $content;
}
$login_url = wp_login_url( get_permalink() );
return '<p>この記事は会員限定です。<a href="' . esc_url( $login_url ) . '">ログイン</a>すると全文を読めます。</p>';
}, 1 );
// 2. 抜粋も差し替える(一覧ページ・検索結果・REST API の excerpt)
add_filter( 'get_the_excerpt', function ( $excerpt, $post ) {
if ( my_can_view_members_content() || ! my_is_members_only( $post ) ) {
return $excerpt;
}
return 'この記事は会員限定です。';
}, 20, 2 );
ログインしていない状態で記事のページ、/feed/、/wp-json/wp/v2/posts を開き、本文が案内文になっていることを確かめてください。ログインすると全文が表示されます。案内文のリンクからログインすると、元の記事に戻ります。
題名は隠れません。会員限定の記事があること自体を一覧に出したくない場合は、方法3のプラグインを検討してください。
方法2: 記事のページごとログイン画面へ送る
案内文を出す代わりに、記事を開いた時点でログイン画面へ移動させることもできます。方法1のコードに加えて、次のファイルを wp-content/mu-plugins/members-redirect.php として保存します(方法1の関数を使います)。
<?php
/**
* Plugin Name: 会員限定ページのログイン必須化
*/
// 会員限定の投稿を、ログインしていない人が開いたらログイン画面へ送る
add_action( 'template_redirect', function () {
if ( is_singular() && my_is_members_only( get_queried_object() ) && ! my_can_view_members_content() ) {
wp_safe_redirect( wp_login_url( get_permalink( get_queried_object() ) ) );
exit;
}
} );
template_redirect は記事のページを表示するときだけ動くので、フィードや REST API には効きません。方法1の the_content フィルターと組み合わせて使ってください。
ログインしていない人や検索エンジンには 302 のリダイレクトが返るので、会員限定の記事は検索結果に載らなくなります。
有料会員だけに見せる(独自の権限を使う)
方法1では、ログインしていれば誰でも読めます。無料登録の会員(購読者)と有料会員を分けたい場合は、有料会員だけが持つ権限を作り、それで判定します。
方法1のコードの my_can_view_members_content() を、次のコードに置き換えます。
<?php
// 「有料会員」の権限グループと、会員限定記事を読む権限を作る(一度作るとデータベースに残る)
add_action( 'init', function () {
if ( get_role( 'premium_member' ) ) {
return;
}
add_role( 'premium_member', '有料会員', array(
'read' => true,
'read_members_content' => true,
) );
$admin = get_role( 'administrator' );
if ( $admin ) {
$admin->add_cap( 'read_members_content' );
}
} );
// 閲覧できる人かどうか(権限 read_members_content を持つ人だけ)
function my_can_view_members_content() {
return current_user_can( 'read_members_content' );
}
これで「ユーザー」→ 各ユーザーの編集画面の「権限グループ」に「有料会員」が加わります。有料会員と管理者は全文を読め、購読者には案内文が表示されます。権限グループの名前ではなく権限(read_members_content)で判定しているので、あとで別の権限グループに同じ権限を足すだけで、読める人を増やせます。
add_role() で作った権限グループはデータベースに保存されるため、コードを削除しても残ります。不要になったら、該当するユーザーを別の権限グループに移してから、remove_role( 'premium_member' ) を一度だけ実行して削除します。
投稿ごとにチェックボックスで指定する
カテゴリーを使わず、投稿の編集画面で1件ずつ会員限定にしたい場合は、チェックボックスを追加します。方法1のコードは、カスタムフィールド _my_members_only が 1 の投稿も会員限定として扱うので、次のファイルを足すだけで動きます。wp-content/mu-plugins/members-metabox.php として保存します。
<?php
/**
* Plugin Name: 会員限定チェックボックス
*/
// 投稿の編集画面にチェックボックスを出す
add_action( 'add_meta_boxes', function () {
add_meta_box( 'my_members_only', '会員限定', function ( $post ) {
wp_nonce_field( 'my_members_only_save', 'my_members_only_nonce' );
$checked = '1' === get_post_meta( $post->ID, '_my_members_only', true );
echo '<label><input type="checkbox" name="my_members_only" value="1"' . checked( $checked, true, false ) . '> この投稿を会員限定にする</label>';
}, 'post', 'side' );
} );
// 保存する
add_action( 'save_post_post', function ( $post_id ) {
if ( ! isset( $_POST['my_members_only_nonce'] )
|| ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['my_members_only_nonce'] ) ), 'my_members_only_save' ) ) {
return;
}
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
if ( ! empty( $_POST['my_members_only'] ) ) {
update_post_meta( $post_id, '_my_members_only', '1' );
} else {
delete_post_meta( $post_id, '_my_members_only' );
}
} );
保存の処理では、nonce(なりすまし防止の合言葉)・自動保存・編集権限の3つを確かめてから値を書き込みます。どれかを省くと、ほかのユーザーが細工したリクエストで値を書き換えられるおそれがあります。
ブロックエディターでは、このチェックボックスは右側の設定パネルの下の方に表示されます。
方法3: 会員サイト用のプラグインを使う
会員登録のフォーム、会費の決済、有効期限、会員レベルごとの公開範囲まで必要なら、プラグインを使う方が早く、保守も楽です。wordpress.org で配布されている主なものは次のとおりです(2026年11月時点)。
| プラグイン | スラッグ | 向いている用途 |
|---|---|---|
| Members | members |
権限グループと権限の編集、投稿ごとの閲覧制限 |
| Simple Membership | simple-membership |
会員レベル、無料・有料の会員登録、投稿や固定ページの保護 |
| Ultimate Member | ultimate-member |
会員登録・プロフィール・会員名簿と閲覧制限 |
| Kadence Memberships | restrict-content |
会員レベル・定期課金と閲覧制限(旧 Restrict Content) |
どれも管理画面の「プラグイン」→「プラグインを追加」で名前を検索して入れられます。WP-CLI なら wp plugin install simple-membership --activate のようにスラッグを指定します。MemberPress や WooCommerce Memberships は wordpress.org に無い有料プラグインで、それぞれの公式サイトから購入して、ZIP ファイルをアップロードして入れます。
注意点
- 画像や PDF は守られない。 この記事の方法は投稿の本文を隠すものです。メディアライブラリにアップロードしたファイルは、URL を知っていれば誰でも開けます。会員限定の資料を配る場合は、ファイルの保護に対応したプラグインや、ダウンロード用の仕組みを別に用意します。
- キャッシュに注意する。 ページキャッシュのプラグインを使っていると、ログインしている人に表示した全文がキャッシュされ、ほかの人に表示されることがあります。多くのキャッシュプラグインはログイン中のユーザーにキャッシュを使わない設定になっていますが、会員限定の記事を作ったら、ログアウトした状態の別のブラウザーで本文が隠れているか確かめてください。
- 検索結果には題名が出る。 WordPress のサイト内検索は本文の文字も検索するため、本文に含まれる言葉で検索すると、会員限定の記事の題名が結果に出ます(本文は表示されません)。
- パスワード保護との違い。 投稿ごとに設定できるパスワード保護は、ユーザー登録なしで1つのパスワードを共有する仕組みです。会員ごとに読める人を管理したい場合は、この記事の方法を使います。