WordPressには限定公開機能がない。パスワード保護することで、パスワードを知らない人は見れなくなるので実現できるのだが、限定公開の記事も一覧に表示されてしまう。
このイケてない仕様を修正する。
functions.phpを編集
WordPressのダッシュボードから「外観 -> テーマファイルエディター」を選択する。
画面右側で編集するファイルを選択できるので、「functions.php」を選択する。
functions.php に以下のコードを追記する。コピペでOK
function exclude_protected_posts($query) {
if (!is_single() && !is_admin()) {
$query->set('has_password', false);
}
return $query;
}
add_filter('pre_get_posts', 'exclude_protected_posts');
コード解説
ある程度プログラミングの知識があって、何をしてるか知りたい人向け。とりあえずパスワード保護された記事が表示され無くなれば良いわ!って人は見なくてOK。
exclude_protected_posts
という名前の関数を定義している。この関数は、パラメータとして$query
オブジェクトを受け取る。$queryオブジェクトはWordPressの投稿データを取得するオブジェクトで、フィルタリングとかページネーションを行う時はコレを使う。is_single
関数を使って、記事のページではないことを確認する。また、is_admin
関数を使って、閲覧しているユーザーが管理者ではないことを確認する。$query->set('has_password', false);
というコードで、queryオブジェクトに対してクエリパラメータを設定する。has_passwordがfalseのもの、つまりパスワード保護されていないものを取得する。add_filter('pre_get_posts', 'exclude_protected_posts');
で、pre_get_posts
フィルタにexclude_protected_posts
関数を追加する。これにより、WordPressが投稿を取得する前に、この関数が実行されるようになる。