• 解決済 echizenya

    (@echizenya)


    いつもお世話になっております。
    下記の質問についてご存知の方がいらっしゃいましたら、ご教示を願います。

    【質問の主旨】

    サイドバーの「最新記事」において子カテゴリーが表示されない場合があります。

    1.
    なぜこのような現象が発生するのでしょうか?

    2.
    また、必ず子カテゴリーを表示させるためにはWordPressの設定をどのように変えればよろしいでしょうか?

    【質問の補足】

    1.
    【質問の主旨】について、例を用いて2点の補足説明をします。

    http://takaiba.net/wp-forum/wpforum20180627_1.png

    上記の画像は6月27日現在、サイドバーにある最新記事一覧です。
    6月25日から6月27日にかけての記事は、親カテゴリーに対する子カテゴリーが表示されています。

    6月25日 JavaScript(親カテゴリー: Webサービス)
    6月25日 PayPal(親カテゴリー: Webサービス)
    6月26日 JavaScript(親カテゴリー: Webサービス)
    6月27日 JavaScript(親カテゴリー: Webサービス)

    一方、6月24日は自分の意図通りの表示になっていません。

    6月24日 あれこれ(親カテゴリー: あれこれ)
    ↓
    6月24日 大河ドラマ(親カテゴリー: あれこれ)

    「親カテゴリー: あれこれ」の下に「大河ドラマ」という子カテゴリーを表示できるようにしたいと考えています。

    2.

    http://takaiba.net/wp-forum/wpforum20180627_2.png

    上記の画像の通り、6月24日の記事には親カテゴリーに「あれこれ」、子カテゴリーに「大河ドラマ」を設定しています。

    以上、よろしくお願い申し上げます。

    ヘルプの必要なページ: [リンクを見るにはログイン]

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • こんにちは

    get_the_category() は名前順で返すため「あれこれ」が表示されるのだと思います。

    下記を functions.php に記述して、get_the_category() の代わりに get_the_category_descendants() を使用してみてください。
    get_the_category_descendants() は、現在の投稿が属するカテゴリーのうち最下層のみのカテゴリー(オブジェクト)の配列を返す関数となります。

    function get_the_term_descendants( $id, $taxonomy ) {
    	$terms = get_the_terms( $id, $taxonomy );
    	if ( ! is_array( $terms ) )
    		return array();
    	$descendants = $terms;
    	foreach( $terms as $key => $term ) {
    		foreach( $terms as $sub_term ) {
    			if ( $term->term_id == $sub_term->parent ) {
    				unset( $descendants[$key] );
    				break;
    			}
    		}
    	}
    	return array_values( $descendants );
    }
    
    function get_the_category_descendants( $id = false ) {
    	return get_the_term_descendants( $id, 'category' );
    }
    トピック投稿者 echizenya

    (@echizenya)

    @ishitaka さん。
    いつもコメントありがとうございます。

    下記を functions.php に記述して、get_the_category() の代わりに get_the_category_descendants() を使用してみてください。

    get_the_category_descendants関数をfunctions.phpに定義して、
    sidebr.phpでget_the_category関数の代わりに使用すると、自分が意図している通りの表示ができました。

    追加の質問で恐れ入ります。
    教えていただいたコードで2箇所教えてほしいことがあります。

    1. 「大河ドラマ」という表示について

    「大河ドラマ」というサブメニューの表示は、実質的に条件文の中で行われていると推測しています。
    $term->term_id$sub_term->parentの値(int(146))が等しいと、
    なぜサブメニューが表示されるのでしょうか?

    if ( $term->term_id == $sub_term->parent ) {
        unset( $descendants[$key] );
        break;
    }

    2. get_the_category_descendants()関数の仮引数について

    $id = falseとなるのはなぜでしょうか?

    たびたびの質問となり誠に恐れ入ります。
    お手すきの時にでもご教示いただければ幸いです。
    以上、よろしくお願い申し上げます。

    1. 「大河ドラマ」という表示について

    下記のようなカテゴリー構成を例として説明します。

    +あれこれ(ID=1, parent=0)
     +大河ドラマ(ID=10, parent=1)

    ※ parent は親の ID。0 の場合は親なし。

    この場合、「あれこれ」の ID である 1 は、「大河ドラマ」の親(parent)と一致するので、「あれこれ」は子を持つことになるので除外(unset)している訳です。

    説明下手で申し訳ない・・・。

    2. get_the_category_descendants()関数の仮引数について
    $id = falseとなるのはなぜでしょうか?

    これは、get_the_category() と同じですね。get_the_category() で $id を false にすると、$id は $post->ID(現在の投稿の ID)が初期値として使われます。

    トピック投稿者 echizenya

    (@echizenya)

    @ishitaka さん。
    再度のアドバイスありがとうございます。
    1、2ともに分かりやすい説明で理解することができました。
    今後ともどうぞよろしくお願いします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「サイドバーで子カテゴリーが表示されないのはなぜでしょうか?」には新たに返信することはできません。