サポート » 使い方全般 » タクソノミーで親子関係がある記事をすべて一覧表示したい

  • 解決済 sakakazu

    (@sakakazu)


    カスタム投稿でページテンプレートにタクソノミーの親子関係がある記事をすべて一覧表示したい場合の処理で悩んでいます。

    ■親Aカテゴリータイトル
      ○子Aカテゴリータイトル
         ・記事タイトル
         ・記事タイトル
         ・記事タイトル
      ○子Bカテゴリータイトル
         ・記事タイトル
         ・記事タイトル
    ■親Bカテゴリータイトル
      ○子Cカテゴリータイトル
         ・記事タイトル

    1Pで完結するようなCMSになります。
    制作したソースは以下です。

    <?php
    $categories = get_terms('samplecat','orderby=description&order=ASC');
    foreach ( $categories as $cat ) {
    	$oya = $cat->parent;
    	if($oya == 0){
    		echo '<h1>' . esc_html($cat->name) . '</h1>';
    	} else {
    		echo '<h2>' . esc_html($cat->name) . '</h2>';
    	$catslug = $cat->slug;
    	$myquery = 'post_type=sample&samplecat=' . $catslug . '&showposts=-1';
    	?>
    <ul>
    <?php query_posts($myquery); ?>
    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    <li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
    <?php endwhile; endif; ?>
    <ul>
     <?php  } } ?>

    無理矢理に並べ替え順番で親子関係を実現しているので、
    効率的な方法はないでしょうか?
    カテゴリーの並べ替えは「説明」に数字を入力して制御しています。
    並び替えプラグインなどで対応可能でしたら助かるのですが・・・
    なるべくクライアントに使いやすいものにしたいので、
    みなさんはどのように処理されているのかお願いします。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • プラグイン
    http://wordpress.org/extend/plugins/ps-taxonomy-expander/
    管理パネル Term order で並べ替え。

    コード

    $categories = get_terms('samplecat','orderby=order&order=ASC');

    ご返答ありがとうございます。
    ps-taxonomy-expanderで試したところ
    get_termsで指定すると親Aの中の子は正確に出力できるのですが、
    親Bを新規でつくり記事をいれると並び順は指定どうりになりません。
    wp_list_categoriesで指定するとまともに出力できるのですが
    wp_list_categoriesからカテゴリーを配列にいれる方法はありませんか?

    カテゴリーが必ず[親-子]という構造なら、カテゴリー(ターム)のネストレベルごとに処理をしてみてはいかかでしょうか。

    コードは確認していませんが、こんな感じです。

    <?php
    $categories = get_terms('samplecat','orderby=order&order=ASC&parent=0');
    foreach ( $categories as $cat ) {
    	echo '<h1>' . esc_html($cat->name) . '</h1>';
    	$children = get_terms('samplecat','hierarchical=0&orderby=order&order=ASC&child_of='.$cat->term_id);
    
    	foreach ( $children as $child ) {
    		echo '<h2>' . esc_html($child->name) . '</h2>';
    		$catslug = $child->slug;
    		$myquery = 'post_type=sample&samplecat=' . $catslug . '&showposts=-1';
    	?>
    		<ul>
    		<?php query_posts($myquery); ?>
    		<?php if(have_posts()): while(have_posts()): the_post(); ?>
    		<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
    		<?php endwhile; endif; ?>
    		<ul>
    	<?php }?>
    <?php }?>

    ご教授ありがとうございます。
    うまくいきませんでした。試しに以下でためしてみたところ

    $categories = get_terms('samplecat','orderby=order&order=ASC&parent=0');
    print_r($categories);

    Array ( ) が表示されました。
    「parent」に親のterm_idを入力すると子が表示されました。
    parent=0で親を取得するのではないみたいですね・・・
    おしいです。

    エラーが出ていたので、修正後のコードです。私がテストする分には、正しそうに動いています。

    >Array ( ) が表示されました。
    $categories は、タームオブジェクト(の参照)の配列です。

    ———————————
    カスタム投稿タイプ:sample
    タクソノミー:samplecat
    samplecat のターム:
    親A
     子A
     子B
    親B
     子C
    ——————————-

    最初の get_terms(‘parent=0’) で親A,親Bを拾ってくるはずです。

    $categories = get_terms('samplecat','orderby=order&order=ASC&parent=0');
    foreach ( $categories as $cat ) {
    	echo '<h1>' . esc_html($cat->name) . '</h1>';
    	$children = get_terms('samplecat','hierarchical=0&orderby=order&order=ASC&child_of='.$cat->term_id);
    
    	foreach ( $children as $child ) {
    		echo '<h2>' . esc_html($child->name) . '</h2>';
    		$catslug = $child->slug;
    		$myquery = 'post_type=sample&samplecat=' . $catslug . '&showposts=-1';
    	?>
    		<ul>
    		<?php query_posts($myquery); ?>
    		<?php if(have_posts()): while(have_posts()): the_post(); ?>
    		<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
    		<?php endwhile; endif; ?>
    		</ul>
    <?php
    	}
    }
    ?>

    pluto1234様、テストまでしていただき申しわけございません。
    おかげさまで解決することができました。
    いろいろやってみたのですが、
    私の記事の投稿するとき子カテゴリーのみチェックしていたのが問題でした。
    申しわけございません。
    ネストレベルごとに処理する方法はいろいろ使えそうですね。
    本当にありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「タクソノミーで親子関係がある記事をすべて一覧表示したい」には新たに返信することはできません。