あるサイトで投稿を使ってメインコンテンツとニュースをカテゴリで分けて入力していました。トップページにはメインコンテンツだけ表示したいのですが、検索で見つけた方法ではなぜかトップページからあるカテゴリのコンテンツを除く方法が有効になりませんでした。
色々探して「これは汎用的じゃないかな?」と思ったやり方でなんとかうまくできたのでその方法について書きます。
検索した方法だとなぜかうまくできなかった例
index.phpなどで query_posts と書いてある箇所を見つけて
<?php query_posts(‘cat=-除きたいカテゴリーID′); ?>
のようにすればいい、ということで query_posts を全文検索してすべてにこの修正を施してもトップページから除外したいカテゴリーを消すことができませんでした。
まだよくは分かってませんが、おそらくこのテーマではそれ以外の方法でデータベースからpostを取得しているのではないかなーと思いました。
postsを取得した後にループして表示するところで特定のカテゴリーを除外することはできますがそうなると1ページ当たり10件とか取得してても除外した記事が見えなくなるので件数が合わなくなるので表示がおかしくなってしまいそうです。うーん。
WordPress Codex でトップページから特定のカテゴリを除外する方法を見つけました
検索…また検索をしてこのページを見つけました
プラグイン API/アクションフック一覧/pre get posts
pre_get_posts というアクションフックがありました。このアクションフックは、
このフックはクエリー変数オブジェクトの生成後、実際にクエリーが実行される前に呼び出されます。
とあるので、queryが実行される前に条件を追加できるためqueryを実行後にカテゴリーを除外するのではないため、1ページの件数の問題も起きないです。これがよさそう!
実例として、
メインページから特定のカテゴリーを除外する という項目がありました。この方法を使って、トップから特定のカテゴリーを除外したいと思います。
このようにトップページに表示されていたとします。カテゴリー 未分類 を除外したいと思います。
使っている子テーマの functions.php に
function exclude_category( $query ) { if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'cat', '-1' ); } } add_action( 'pre_get_posts', 'exclude_category' );
このようにコードを記述します。$query->set( ‘cat’, ‘-1’ ); でカテゴリーIDが1(未分類)のものを除外しています。ここでもし複数のカテゴリーを除外したいときは (‘cat’, ‘-1’, ‘-50’) のようにカンマで区切って記述すればいいようです。
2015/11/02追記:上記の方法でSimplicityとtwentyfourteenで確認していましたが、Bonesではこの書き方では有効になりませんでした。
if ( $query->is_home()) {
if文をこのように書き換えてBonesで対応できました。
この状態でトップページを再度読み込みすると、
このようにカテゴリーが未分類のものが表示されなくなりました。
この方法はTwentyfourteenだけでなく、他のテーマの子テーマでも試してみましたがうまくできました。アクションフックなので汎用的な方法だと思われます。
カテゴリーIDはどうやって調べるのか
カテゴリーIDはどうやって調べたらいいでしょうか。
ダッシュボード 投稿>カテゴリー をクリック
ここで一覧に探したいカテゴリーが表示されていないときは、例えば 未分類 という名前を検索して、
とすると一覧表示されます。
一覧に表示で、編集 をクリックします。遷移したページのURLが
http://ryuswp/wp-admin/edit-tags.php?action=edit&taxonomy=category&tag_ID=1&post_type=post
だとすると、 tag_ID=1 のところの 1 がカテゴリーIDです。tag_ID= の後に付いている数字がカテゴリーIDとなります。
まとめ:トップページの投稿一覧から特定のカテゴリーを除く方法
トップページの投稿一覧から特定のカテゴリーを除く方法をまとめると
1. 除きたいカテゴリーIDを調べる
2. 子テーマのfunctions.phpにコードを追加する
これだけです(^^)/
[amazon_searchlink search=”WordPressデザイン”]
コメント