カテゴリーを制限する
過去に何度も書いた「カテゴリー制限」の話、元はと言えば初期に書かれた「非公開」の記事が原因です。トップページやアーカイブさらには検索結果などに非公開の記事が表示されないようにするための制御です。最近は「カテゴリー制限」や「検索結果のカテゴリー制限」などに書いた手法でカテゴリー制限を実装しています。
今回は一歩踏み込んでコア関数を書き換えることで実現してみたいと思います。子テーマのfunctions.phpに手を入れます。
function fotografie_pre_get_posts($query) { if (is_admin() || !$query->is_main_query()){ return; } if ( !is_user_logged_in() ) { $query->set( 'cat', '公開' ); } } add_action( 'pre_get_posts', 'fotografie_pre_get_posts' );
pre_get_posts()に対してログインしていない場合には「WP_Query」の検索条件にカテゴリー制限(公開のみ)をかけます。本当は引数で「category__not_in」を使いたかったのですが、配列にして複数のカテゴリーIDを渡しても、先頭のカテゴリーIDにしか制御が掛けられなかったので、苦肉の策で「公開」カテゴリーのみ対象とする方法にしました。この変更により、かつての手法であった、index.phpやarchive.phpとsearch.phpへの個別修正が不要になりました。ページナビに関しては引き続きsingle.php内でログイン状態の判定を行い制御しています。
if ( is_user_logged_in() ): else : $args = wp_parse_args( $args, array( 'prev_text' => '%title', 'next_text' => '%title', 'in_same_term' => true, 'excluded_terms' => '除外カテゴリー', 'taxonomy' => __( 'post_tag' ), 'screen_reader_text' => __( 'Post navigation' ), ) ); the_post_navigation($args); endif;
the_post_navigation()の引数で「除外カテゴリー」を指定するとともに、前後のページは「タグ」に基づいて表示されるように変更しました。サイト全体のカテゴリー制限は引き続きプラグイン「Allow Categories」に頼っています。いつか卒業できたらいいなとは思いますが、とても便利なプラグインなのでまだまだ手放せません(笑)