【ワードプレス】特定カテゴリだけサイト内検索、記事一覧から除外

製作 プログラム

2016/09/03(土)

ワードプレスで特定カテゴリだけ記事一覧から除外

ブログの記事一覧ページやサイト内検索の結果に毎日投稿している日記タイプの記事がたくさん表示されてしまい、サイトを見てくれている方の目当ての記事を探す邪魔になってはいないでしょうか?ワードプレスでは記事一覧ページにすべての記事が表示され、また検索もすべての記事を対象に検索をしてしまいます。

今回はワードプレスで特定カテゴリのみ記事一覧やサイト内検索から除外する方法について紹介します。

特にブログにいろいろなカテゴリを作っており、役に立つ情報から日々のつぶやきまで扱っているサイトで大事な設定です。

特定カテゴリを記事一覧と検索から除外する

functions.php

function customize_main_query($query) {
	if ( is_admin() ||  !$query->is_main_query() ){
		return;
	}
	if($query->is_home() 
	|| $query->is_search() ){
		$query->set( 'cat', '-40' );
   }
}
add_action( 'pre_get_posts', 'customize_main_query' );

pre_get_postsフックを使ってクエリの変更を行っています。上記をfunctions.phpにコピペして使用くださいね。

7行目の-40の数字を除外したいカテゴリIDにしてください。このコードではトップページ(is_home)の場合と検索の場合(is_search)のみ特定カテゴリ(例の場合だとカテゴリID40の記事)を除外します。

pre_get_postsとは

フックについてはカンタンにですがコチラ(フックでデフォルト画像を設定)を参考にしてください。

pre_get_postsフックはワードプレスが記事情報をデータベースから取ってくるときに毎回呼ばれるフックです。気をつけないといけないのはメインクエリ(記事本文)以外の記事情報をデータベースから取るときもこのフックが呼ばれる点です。

例えばサイドバーに新着記事を表示する場合もこのフックが呼ばれるので、新着記事一覧からも先ほど指定したカテゴリIDの記事が省かれることになります。

なので先頭4行のおまじないは必ずつけておいてください。管理画面の場合とメインクエリじゃない場合はなにもしないよ!と書かれています。

function customize_main_query($query) {
	if ( is_admin() ||  !$query->is_main_query() ){
		return;
	}

さらに特定の記事カテゴリページからも除外する

例えば、TOP→親カテゴリ→子カテゴリのようにカテゴリが階層になっている場合、親カテゴリの一覧ページからも子カテゴリの記事を除外したい場合があります。

functions.php

function customize_main_query($query) {
	if ( is_admin() ||  !$query->is_main_query() ){
		return;
	}
	if($query->is_home() 
	|| $query->is_search()
	|| $query->is_category('ai') ){
		$query->set( 'cat', '-40' );
   }
}
add_action( 'pre_get_posts', 'customize_main_query' );

7行目が新しく増えています。ここの’ai’の部分を’-40’の記事を除外したいカテゴリスラッグ名に変えてください。

例の場合だと記事一覧ページとaiという親カテゴリページの場合に、子カテゴリであるID40番のカテゴリの記事全てが表示されなくなります。

pre_get_postsで記事の除外が簡単に出来る!

今回は特定カテゴリに含まれる記事全てをサイト内検索や記事一覧から除外する方法について紹介しました。

そしてその設定にはfunctions.phpにpre_get_postsの設定をすればできるのでした。今回pre_get_postsで記事一覧やサイト内検索、そして親カテゴリの場合の設定をしましたが、このpre_get_postsは他にもいろいろな条件で記事の除外や並び順の変更ができます。こちらのサイトが詳しく紹介してくれていました。

自身の使いやすいようにカスタマイズしてみてくださいね。