特定のカテゴリを表示するにはpre_get_postsを使おう

シゴトクリエイターの大橋です。
今回は運営するサービスwebサービス集めましたで、Wordpressで特定のカテゴリを表示しない場合どうすればいいという調べたネタです。
もちろん出来たのですが、はまった部分もあるのでそのあたりも含めて備忘録代わりにしてみます。
目次
query_postsを使えば良さそう(結果はNG)
これは結論的には出来ませんでした。簡単にいえばquery_postsってWordpressメインのデータベースのポインタ、または配列変数であんまいじらないほうが良さそうという理解です。
特定カテゴリの表示や表示件数を制御するquery_postsの使い方|WordPressでくビジネスサイトをつくろう【第13回】
上の記事はquery_postsで特定のカテゴリを入れればいいよねーという説明があります。例えば最初に実装したのは、category_nameにWeb集めでいえば、Webサービスとアプリのみ表示するということをしたかったので、それでいけるだろうと思ったら、出来ませんでした。
実際に処理としては、query_postsで取ってくるものを特定のカテゴリーのものとすると、次の処理であるcontentsを呼び出した先のphpファイルでうまく分岐されてなかったんです。簡単にいえば、is_home()関数の結果が異なってしまう、つまり本来分岐するところへいかないという結果になっていました。
つまり、単に自分の環境ではquery_postsでカテゴリ指定してもうまく表示されないという結果でした。よって、is_home()あたりを調べてなぜうまくいかないかを調べました。ちなみに、is_home()で本来の分岐にいかないと、生成するHTMLタグとして、idやclassが付いたタグもあるので、CSSが反映されてないように見えました。これは素人目だけで画面を見ると「CSSが反映されてない」と思うのですが、実際はCSSの前のHTML出力コードがそもそも出てないということで分かりました。
多分ここでつまづいた場合、諦めてしまうことも多いので、僕も諦めるかと思いつつチャレンジしていました。
is_home()あたりの記事を発見!これはいけるか?
wordpressで「if(is_home()):」などの条件分岐タグが効かないときの対処法!query_postsをリセット
is_hone()で調べていたら上の記事が。ありがたいことです。しかも条件分岐とあるのでこれかなーと。
ただこれは結果的にいうと、query_posts()のリセットがおかしいという場合なんですかね。
例えば使う文脈としては、サイドバーのパーツにあるウィジェットとかで何かしら処理をする時にトップページに表示を反映させたいという意味でのis_home関数かなあと。ちなみに、トップとHOMEあたりの違いは理解してないので、このあたりは各自調べて下さい。
まあ、このquery_postsをwp_reset_query()でクリアするのもやってみましたが、そもそも取得する配列をクリアしたら渡すデータがないので今度は表示データが何もなくなるのでこれも駄目でした。
諦めるしかないのかなーと思って、そういえば・・・。
teratailで投げてみて聞いてみるかと思って探した
teratailというサイトは要は技術的なプログラミングとか、Wordpressもありますよ、の質問を出来るサイトです。もちろん答えることもできますが、僕のような人は聞くだけが多そうです(笑)
こういう時に使ってみようかしらんということで使ってみて、まずは同じ質問がないかなということで調べる。
という形で出てきたら、お、これ近いんじゃないすか?
というものがありました。この投稿話題自体とは微妙にずれますが、回答されている方からヒントが!
そちらのコメントに詳細は譲りますが、そもそもquery_posts()自体は触ることはないと。そこで、pre_get_postsというものを使えと。これ自体は面白くて、どこでトリガーというか発生するかというと、functions.phpに書いて呼び出す(というか呼ばれる)感じでやります。
ここでの知見は、そもそもquery_postsをいじるって発想では全く駄目だったのに、違うやり方があるという知見ですよね。しかもそちらのほうが作法としてはグッドっぽいというところです。
pre_get_postsの使い方
実際には、以下の記事などを参考に入れてみました。参考になるのでぜひよんでみて下さい。
要はfunctions.phpにコードを書いて、カテゴリのどこを出すか、そして条件としてはトップページだけいいとかそういう感じです。
これらのサイトが参考になりました。ありがとうございます!
functionsに書くので、実際に今まで入れようとしていたindex.phpとかターゲットとするphpに入れるとかは不要です。慣れないと気持ち悪い感じもしますが、まあWordpressの仕様というか動きとして合理的なんでしょうね。このあたりは理解はあまりできていません。
wordpressがデータベースとしてMySQLですか、そちらにデータを取りに行く動きを常に表示が変わる時とかにしているわけですよね、きっと。それらについてフィルターをかけて動きを抑制するというか、そんな感じで理解しています。
そもそもなんでこの改造をしようとしたか?
実際に、Web集めでやろうとしたのは、まとめ記事やサービスピックアップみたいな記事作成です。それをそのまま記事投稿すると、普通にトップページに出てきてしまうんですね。要はWebサービスなどしかトップには出したくない。まとめ記事などコンテンツは表示しないということをしたかったわけです。
今のWeb集めは、サービスだけがトップで見えます。追加したのはまだコンテンツは出来ていませんが、「サービス紹介」というカテゴリを作りました。正確にはWordpressのメニューに追加、そのメニューコンテンツが新規カテゴリで作った「サービス紹介」というものを表示するということです。よって、サービス紹介という記事を投稿するわけですが、そうするとトップには表示されないわけです。しかし、このメニューを押せば見える。
まさにこれがやりたかったことです!
こういった小さな改造をやろうとしても調べるとか、ある程度基礎的なことが分からないと途中で諦めてしまいがちです。今回はteratailで聞こうとして実際に聞く前に有用な情報があり、それで解決できたという話でした。とはいえ、teratailは無料ですし、聞くのもいいですが、wordpress以外の言語もありますし、勉強になりそうです。そういう意味で一つ困ったらteratailを眺めるという選択肢もありかなと思います。
[adrotate banner=”3″]
おわりに
今回はWordpress改造において、とくに結構よくありそうな特定のカテゴリの非表示(または特定のカテゴリ表示)というネタでした。pre_get_postsではもちろんカテゴリ以外に投稿表示数とかも選べますし色々自由度が高そうです。あとquery_postsよりも内部からいってるのでスピードが早いそうです。これは嬉しいです。
もし似たような症状ではまったらぜひ参考になれば幸いです!
またWordpressまわりのネタをアウトプットしたいところですね。
ビジネスアイデア相談
「もっとアイデアがほしい」「個別に企画の相談に乗って欲しい」「この施策をどう考えるか」という方は、ぜひお気軽にお問い合わせフォームからご連絡ください。