サポート » 使い方全般 » archieve.phpにおける3階層カテゴリの時のカテゴリ表示

  • 解決済 rakeemrakeem2

    (@rakeemrakeem2)


    現在BizVectorを使ってWordpressでサイトを構築中です。
    今回、3階層となるカテゴリ階層を考えており、その場合のarchieve.phpの記述について質問させてください。

    カテゴリ階層としては以下のような構造です。
     大カテゴリ: 大陸名
     中カテゴリ: 国名
     小カテゴリ: 都市名

    大カテゴリおよび中カテゴリのarchieveページを開いた際は、その子カテゴリ名が表示され、
    小カテゴリのarchieveページの場合は投稿が表示される、ということを実現させたいです。

    自分でBizVectorのテンプレをいじった程度だと、小カテゴリのページにおいて、投稿が一切表示されません。

    お手数ですがどのような条件分岐にすればいいか教えていただければ幸いです。なお、可能であればcateogory.phpは使わずに、archieve.phpの中で完結したいと思っております。また、今後万が一階層が増減することを考え、該当カテゴリの直下にカテゴリが無い時のみ投稿を表示する、などはできますでしょうか?

    どうぞよろしくお願いいたします。

         <?php
    $category = get_queried_object();
    $cat_id = $category->cat_ID;
    if ($category->category_parent=>0 ) :
        echo '<ul>'.PHP_EOL;
        wp_list_categories('depth=1&title_li=&child_of='.$cat_id);
        echo '</ul>'.PHP_EOL;
    else :
        if (have_posts()) :
            echo '<ul>'.PHP_EOL;
            while (have_posts()) : the_post();
    ?>
                <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php
            endwhile;
            echo '</ul>'.PHP_EOL;
        else :
            echo 'ポストが見つかりません。';
        endif;
    endif;
    ?>
6件の返信を表示中 - 1 - 6件目 (全6件中)
  • http://codex.wordpress.org/Function_Reference/get_the_category
    を読むと category_parent がゼロなら親カテゴリー無しだそうです。

    category_parent
        string ‘0’ – the category id of the current category’s parent. ‘0’ for no parents. (also stored as ‘parent’)

    ですので

    if ($category->category_parent > 0 ) :

    のようにゼロを除外するとよいと思います。

    トピック投稿者 rakeemrakeem2

    (@rakeemrakeem2)

    ghvstさま

    ご回答ありがとうございます。
    残念ながらいただいた案で試してみましたが、うまくいきませんでした。結果としては

    大カテゴリページ: 該当大カテゴリの配下にある孫カテゴリの「投稿」が表示
    中カテゴリページ: 小カテゴリのリンクが表示 → 望んでいる状況
    小カテゴリページ: 「カテゴリーなし」と恐らくwp_list_categoriesのエラー

    よって、中カテゴリページは望んでいる状況ですが、大カテゴリと小カテゴリのページがやはりまだうまくいきません。大カテゴリページは中カテゴリへのリンクを表示したく、小カテゴリページは投稿へのリンクを表示したいと思っています。

    引き続きどうぞよろしくお願いいたします。

    失礼しました。大・中・小の3レベルなのを盛り込んでいませんでした。
    大は親カテゴリー無し、中と小は親カテゴリー有りなので、下記のように判定すればよさそうですね。

    1. category_parentがゼロなら大カテゴリー。
    2. そうではなくて(親がある)、親カテゴリーのcategory_parentがゼロ(親が大カテゴリー)なら中カテゴリー。
    3. そうではなくて(親の親がある)、親の親カテゴリーのcategory_parentがゼロ(親の親が大カテゴリー)なら小カテゴリー。
    トピック投稿者 rakeemrakeem2

    (@rakeemrakeem2)

    ghvstさま

    アドバイスありがとうございます。
    ちょっと試したのですが、3つ目の分岐である小カテゴリだけうまくいきません。

    大、中とはきちんと最初と2番目の分岐に入っていくのですが、小カテゴリも2番目の分岐で処理されてしまい、結果「カテゴリなし」となってしまいます。どのような記述が必要でしょうか?

    よろしくお願いいたします。

         <?php
    $category = get_queried_object();
    $cat_id = $category->cat_ID;
    if ($category->category_parent == 0) :  // 大カテゴリー
        echo '<ul>'.PHP_EOL;
        wp_list_categories('show_count=1&depth=1&title_li=&child_of='.$cat_id);
        echo '</ul>'.PHP_EOL;
    
    elseif ($parent_cats->category_parent >= 0) :  // 中カテゴリー
        echo '<ul>'.PHP_EOL;
        wp_list_categories('show_count=1&depth=1&title_li=&child_of='.$cat_id);
        echo '</ul>'.PHP_EOL;
    
    else :                                // 小カテゴリー
        if (have_posts()) :
            echo '<ul>'.PHP_EOL;
            while (have_posts()) : the_post();
    ?>
                <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php
            endwhile;
            echo '</ul>'.PHP_EOL;
        else :
            echo 'ポストが見つかりません。';
        endif;
    endif;
    ?>

    中カテゴリーの判定が違っていませんか。下記のようになると思います。

    <?php
    $category = get_queried_object();
    $cat_id = $category->cat_ID;
    $parent_id = $category->category_parent;
    if ($parent_id == 0) :	// 大カテゴリー
    	echo '<ul>'.PHP_EOL;
    	wp_list_categories('show_count=1&depth=1&title_li=&child_of='.$cat_id);
    	echo '</ul>'.PHP_EOL;
    else :
    	$parent_id = get_category($parent_id)->category_parent;
    	if ($parent_id == 0) :  // 中カテゴリー
    		echo '<ul>'.PHP_EOL;
    		wp_list_categories('show_count=1&depth=1&title_li=&child_of='.$cat_id);
    		echo '</ul>'.PHP_EOL;
    	else :	// 小カテゴリー
    		if (have_posts()) :
    			echo '<ul>'.PHP_EOL;
    			while (have_posts()) : the_post();
    ?>
    				<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php
    			endwhile;
    			echo '</ul>'.PHP_EOL;
    		else :
    			echo 'ポストが見つかりません。';
    		endif;
    	endif;
    endif;
    ?>

    トピック投稿者 rakeemrakeem2

    (@rakeemrakeem2)

    ghvstさま

    ありがとうございます!
    こちら、無事にやりたいことが実現できました!

    こうやってparent_idを引き回すんですね、参考になります。

    実はカテゴリに応じて深度が異なることもありえそうなので、この構文を参考に$childcatなどを使って頑張ってみます。

    本当に助かりました!

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「archieve.phpにおける3階層カテゴリの時のカテゴリ表示」には新たに返信することはできません。