WordPressは基本的にアクセスした人全員が見えるコンテンツを作るためのホームページ作成ツール(CMS)。そこにベーシック認証をかけたり、ログインしていないと閲覧できないサイトにする方法はいろいろあり、検索すると容易に尋ね当たります。
この方法では会員制サイトなどで、ログインしたユーザー以外はサイトの中を表示できないものの、基本的にはログインしたユーザーであればサイト内の記事はすべて表示されてしまいます。
例えばユーザーサポートサイトなどを作って、ユーザーからの質問投稿に対してその後はカスタマイズしたコメント欄を使ってやり取りするという方法が一番なのですが、それだとログインユーザーには質問もやり取りもすべて見えてしまって具合が悪いですよね??
これを解消しようとすると、次に浮かぶのがユーザーと直接やり取りする方法としては問い合わせフォームを作り、あとはメールでのやりとりをするという方法。まあ多分一番それが無難なのかも知れないですけど、質問(問い合わせ)をもらった後のやり取りはすべてメール対応となる(サイトから離れてしまう)ので、やり取りが少ないうちはいいのですが、増えてくると特に管理者側は何が何だか分からない状況にもなりかねません。
何かいい方法はないの??と検索してみましたが、日本語での検索ではなかなかそれらしいものはありませんでした。そこでこうなったらWorld Wideに頼ろう!!ということで英語圏のサイトも含めて探したところ、簡単なコードで実現できることが発覚!!
コード自体は後述するサイトのコードの関数名を変えただけのほぼコピペになってしまいますが、方法を探している方にとっては非常に有用な情報であり、私のサイト制作の幅を広げる意味でも重要な情報でしたので、コードを含めて紹介したいと思います。
このコードを使用する際の前提事項
後で簡単に解説しますが、コード自体はログインした前提で出力に制限をかけるものになりますから、ログインしていないユーザーについてはすべての記事が見えてしまうことになります。
従って、コードを改造して非ログインユーザーにも表示しないようにするか、
などを使ってサイトへのアクセスに対してログインを必須にするという措置が必要となります。
投稿を管理者と作者(投稿した人)だけが表示できるようにするコード
コード元は
WordPress Limit Post Display to Post Authors
ですので、詳しい解説はそちらをご覧ください。
/********** 管理者と投稿したユーザーのみ表示可能にするコード **********/
function habt_set_only_author($query) {
global $current_user;
if (!current_user_can('manage_options')) {
$query->set('author', $current_user->ID);
}
}
add_action('pre_get_posts', 'habt_set_only_author');
コード内容を簡単に説明するとpre_get_postsというフックを使って、投稿が表示される前に投稿者IDをチェックして、そのIDと合致するユーザーと、サイト管理者(厳密には「manage_options」権限を持つユーザー=管理者権限を持つユーザー)にだけ投稿を表示するというコードになります。
ユーザー権限についてはユーザーの種類と権限(公式コーデックス)に一覧がありますので、編集者まで、投稿者まで・・・など別の動きをさせる場合には変更するといいでしょう。
このコードをテーマのfunctions.phpへ追記するだけで機能します。
functions.php??というレベルの方は何か起きた時に対処ができない可能性がありますのでこの方法はおすすめしません
複数のユーザーを作り、それぞれから投稿が見えるかどうか?管理者だったらどうか?など私のテスト環境で行った試行ではうまく動作しましたが、実際のサイトへ使用する際にはよくチェックを行ってから導入するようにしてください(不具合や不都合が生じても一切責任は負いませんのでご了承ください)。