カスタム分類について

この記事は3年以上前の古い投稿記事です。古いことをご承知してお読み下さい。

実は困った困ったと言って、カスタム分類を思ったように表示できず、ツッカってしまいました。
正確に言うと、カスタム投稿のアーカイブを表示個数を指定したとおり一覧表示できたんですが、今度はカテゴリー毎、又はタグ毎に一覧表示ができなくてしまい困ってました。
何とかしようと、カスタム分類についてお勉強サイト「Web Design Leaves」をじっくり勉強することに。それでも分かりません。困った困ったとフラストレーションがたまる一方です。
この投稿記事は、1/16に下書き開始したのですが、公開できたのは2/25日。そうです解決したのであります。
今日は一気に解決したことが多くて気持ちはウキウキであります。

では、本題に戻りましょう。先ずどんな事が出来なかったのか?説明しなくてはね。
カスタム投稿タイプで”recipe”を作りました。そしてカスタム分類taxonomyで”recipecat”と”recipetag”を作りました。”recipecat”には中華、和食、イタリアン、韓国料理などなどのカテゴリーに分けられます。”recipetag”には豚肉、生しいたけ、イカ、トマトなどなどタグが付けられています。

設定 > 表示設定 の“1ページに表示する最大投稿数” で指定した投稿数ではなく、もっと多い投稿数24にしようとquery_postを使って、taxonomy.php を書きました。確かにtaxonomy.php で投稿数は24個に変更できました。…がしかしカテゴリーによる絞込みが出来ません。中華とか和食でtaxonomy.php 絞り込んで表示されす、全てのカテゴリーが表示されてしまうんです。

では、最初に試したnew WP_Query を使った方法。これはtaxonomy.php に書きました。
[php] ‘recipe’,
‘taxonomy’ => array( ‘recipecat’, ‘recipetag’),
‘posts_per_page’ => 24,
));

while ( $loop->have_posts() ) : $loop->the_post();
?>

// queryをリセット
[/php]もう一つ、query_posts を使ってやってみました。これもtaxonomy.php で
投稿数は24個に変更できました。…がしかしカテゴリーによる絞込みが出来ません。[php] ‘recipe’,
‘posts_per_page’ => 24,
));

while (have_posts()) :
the_post();

get_template_part(‘cont-recipe’); // cont-recipe.php を呼び込みます。
endwhile;

wp_reset_query(); // queryをリセット
?>
[/php]new WP_queryだのquery_postだの、あっちこっちさまよい歩きましたが、決め手はpre_get_posts でした。
参考にしたのは、query_postsを捨てよ、pre_get_postsを使おうというブログ記事です。チョット刺激的な記事ですね。分からないままにpre_get_posts を使ってみようと挑戦。

pre_get_posts 、これはfunctions.php に書き込むんですが、最初それも上手くいかなくて… トホホの世界でした。では上手く行った結果だけ書きましょう。[php] function change_posts_per_page($query) {
if ( is_admin() || ! $query->is_main_query() ) // 管理画面orメインクエリーでない場合、 ここで処理を中止してそれ以降のコードは実行されないようにします。(ここがミソだそうです)
return;

if ( $query -> is_tax( ‘recipecat’, // ‘recipe’ではダメ’recipecat’でOK。即ちpost-type ではなくTaxonomy名を書きます。
array(‘japanese’, ‘italian’, ‘spanish’, ‘chinese’, ‘europian’, ‘korean’) ) ) {
$query->set( ‘posts_per_page’, ’24’ );
}
}

add_action( ‘pre_get_posts’, ‘change_posts_per_page’ );
[/php]散々苦労して、やっと分かったことは、’recipe’ではダメで’recipecat’でないといけない。 すなわちここに書くのはpost-typeではなく’recipecat’ タクソノミーのカテゴリー名でないといけないんです。
functions.php に書くだけで、投稿表示数はチャント24になりますし、中華や和食といったカテゴリー毎の表示にも対応してくれます。functions.php に書くだけというのが良いですよね。もっといろんな事ができるようなんでアレコレ利用してみたいと欲が出てきますね。
taxonmy.php での一覧表示ループは、以下のようなお馴染みの方法です。
[php]

[/php]これなら’recipetag’でもOKなはずです。関数名をchange_posts_per_page_tag に変更したものを追加しました。果たして以下のように書いてみたらOKでした。
これでレシピタグの場合は投稿数は12になりました。よかったよかった。
[php] function change_posts_per_page_tag($query) {
if ( is_admin() || ! $query->is_main_query() ) // 管理画面、またはメインクエリーでない場合は、 ここで処理を中止してそれ以降のコードは実行されないようにします。
return;

if ( $query -> is_tax( ‘recipetag’, // ‘recipetag’, タクソノミーのカテゴリー名を追加します。
array(”) ) ) {
$query->set( ‘posts_per_page’, ’12’ );
}
}
add_action( ‘pre_get_posts’, ‘change_posts_per_page_tag’ );
[/php] こうして作ったサイトをご紹介します。男の料理教室です。サイドバーにある料理の分類(ジャンル)レシピ食材で選ぶレシピを選んでみてください。
taxonomy-recipecat.php とtaxonomy-recipetag.php でcategoryもtagも一覧表示されます。