ホーム > タグ > タイトル

タイトル

複数のカテゴリーに属している記事のタイトルに複数のアイコンをつけたい【WordPress】

複数のカテゴリーに属している記事のタイトルに複数のアイコンをつけたい。
ということを実現するのにかなり時間を費やしてしまった…
あーもっと検索上手にならなくっちゃ。
ってその前に、もっと勉強しなきゃ…

下記、迷える人がいたら参考になればと…
ただ、もっといい方法があれば是非おしえてください。

さて、今回、アイコン表示は以下のようなルールにしたいと思ってとりかかったわけで…

カテゴリA (ID=1)
カテゴリAの子
カテゴリAの子の子
カテゴリB (ID=2)
カテゴリBの子
カテゴリBの子の子

があったとする。

カテゴリA、カテゴリAの子、カテゴリAの子の子 の記事はAのアイコン
カテゴリB、カテゴリBの子、カテゴリBの子の子 の記事はBのアイコン
カテゴリA、カテゴリBの子の二つに属する場合はAのアイコンとBのアイコン

といった具合にしたかった。

まず試したのが下記の方法

<?php
  $post_cats = get_the_category();
  if ( $post_cats[0]->cat_ID == 1 || $post_cats[0]->category_parent == 1 || cat_is_ancestor_of( 1, (int)$post_cats[0]->category_parent ) ) {
  echo 'Aアイコン';
 } else {
  echo 'Bアイコン';
 ?>

これだと、複数のカテゴリに属する場合、1つ目しか読み込まない。
よって、カテゴリA、カテゴリBの子の二つに属する場合はAのアイコンしか表示されなくなってしまう。

やりたいことはこれじゃない!

そして彷徨ってようやく見つけたのは
フォーラム【特定のカテゴリ記事へのアイコン表記 】
この記事で下記のような方法を発見
下記引用

テーマのディレクトリー直下に category-SLUG.png を作っておけば、それを表示するというサンプルです (SLUG の部分は実際のカテゴリースラッグに差し替えてください)。

<?php
$ClassAddCategory = '';
$cats = wp_get_post_categories(get_the_ID());
if( is_array( $cats)){
  foreach( $cats as $cat){
    $cobj = get_category( $cat);
    $icon_file =  '/category-' . $cobj->slug . '.png';
    if (file_exists(get_template_directory() . $icon_file)) {
        echo '<img src="' . get_template_directory_uri() . $icon_file . '" alt="' . $cobj->name . '" />';
    }
  }
}
?>

ほぉー…
しかしこれでは子孫のところがうまくいかない。
すべての子孫カテゴリーの画像も用意すればいいのかもしれないが、同じ画像がいくつもあるのはスマートじゃない!しかもカテゴリーが増えるたびに画像も…。それは大変だー。

さらに旅を続けること数時間…

見つけたー!!これ!!

post_is_in_descendant_category 関数!!

下記で定義する post_is_in_descendant_category 関数(呼び出す前にテンプレート、プラグイン、またはテーマ関数にコードをコピーする必要がある)を使用することで実現可能!

post_is_in_descendant_category 関数

<?php
/**
 * Tests if any of a post's assigned categories are descendants of target categories
 *
 * @param int|array $cats The target categories. Integer ID or array of integer IDs
 * @param int|object $_post The post. Omit to test the current post in the Loop or main query
 * @return bool True if at least 1 of the post's categories is a descendant of any of the target categories
 * @see get_term_by() You can get a category by name or slug, then pass ID to this function
 * @uses get_term_children() Passes $cats
 * @uses in_category() Passes $_post (can be empty)
 * @version 2.7
 * @link http://codex.wordpress.org/Function_Reference/in_category#Testing_if_a_post_is_in_a_descendant_category
 */
function post_is_in_descendant_category( $cats, $_post = null )
{
 foreach ( (array) $cats as $cat ) {
  // get_term_children() accepts integer ID only
  $descendants = get_term_children( (int) $cat, 'category');
  if ( $descendants && in_category( $descendants, $_post ) )
   return true;
 }
 return false;
}
?>

私はこれをfunction.phpにコピーして、テンプレは下記のように…

<?php
 if ( in_category(1) || post_is_in_descendant_category(1) ) {
  echo 'Aアイコン';
 }
 if ( in_category(2) || post_is_in_descendant_category(2) ) {
  echo 'Bアイコン';
 }
?>

これでやりたかったことが実現。

まぁ、親カテゴリーが増えると増やさなくてはいけなのであんまりスマートじゃないかな…?
でも子孫が増える分には問題なし!
今回は親カテゴリはほぼ増えないのでよしとする!
上記2つの方法をうまく組み合わせてカテゴリーが増えてもいいようにできそうだが、
とりあえず今日は力尽きたのでここまで。
とりあえず実現できたということで。

ふぅー長かった~

Home > タグ > タイトル

want

Return to page top