サポート » 使い方全般 » 表示中の単一記事のカテゴリーIDとカテゴリー名の取得

  • 解決済 eijiy

    (@eijiy)


    表示中の単一記事のカテゴリーIDとカテゴリー名を取得して、サイドバーにカテゴリー名とその投稿一覧を表示させるにはどうしたらいいでしょうか。

    現在、以下のコードをサイドバーに記述していますが、カテゴリー名が表示されない上に、全ての投稿一覧がされてしまいます。

    <?php if (is_single()) : ?>
        <?php
            $catname= single_cat_title();
    	$cat=get_cat_ID($catname);
    	echo '<div id="toggler-1" class="opened" title="' . $catname . ' の投稿一覧"><div>';
            $single_posts = get_posts("order=asc&category=$cat&numberposts=-1");
        ?>
        <ul>
            <?php foreach ($single_posts as $post) : ?>
                <li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
            <?php endforeach; ?>
        </ul>
        </div>
        </div>
    <?php endif; ?>

    ご教授下さい。

    宜しくお願い致します。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • eijiy さん、こんばんは。

    投稿は複数のカテゴリーを持つことがあるので、get_the_category() でカテゴリーオブジェクトの配列を取得してループさせればいいと思います。

    <?php
    if ( is_single() ) :
        $categories = get_the_category( $post->ID );
        // カテゴリー ID 順に並べ替える場合は下の行をアンコメント
        // if ( !empty( $categories ) ) usort( $categories, '_usort_terms_by_ID' );
        foreach ( $categories as $cnt => $cat ) :
    ?>
    	<div id="toggler-<?php echo $cnt+1; ?>" class="opened" title="<?php echo esc_attr( $cat->name ); ?> の投稿一覧">
    		<div>
    			<ul>
    <?php
            $single_posts = get_posts( "numberposts=-1&category=$cat->term_ID&order=asc" );
            foreach ( $single_posts as $post ) :
    ?>
    				<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
    <?php
            endforeach; // single_posts
    ?>
    			</ul>
    		</div>
    	</div>
    <?php
        endforeach; // categories
    endif; // is_single
    ?>

    動作は未確認ですがこんな感じでしょうか。

    # $cat->term_ID は $cat->cat_ID 、 $cat->name は $cat->cat_name でもいいと思います。

    トピック投稿者 eijiy

    (@eijiy)

    mizubeさん、返信ありがとうございます。

    紹介していただいたコードでも同じように、全ての投稿一覧が表示されてしまいます。
    カテゴリー名は表示されるようになりましたが、どのカテゴリーに属する記事であっても親カテゴリーABCDの内Dしか表示されません。尚、Dのみ子カテゴリーがありません。

    解説サイトで、get_the_categoryではIDが正しく取得できないことがあるとか書いてありましたが、どうなんでしょうか。

    eijiy さん

    紹介していただいたコードでも同じように、全ての投稿一覧が表示されてしまいます。

    ごめんなさい、これの原因は私のミスです。
    $cat->term_ID となっているところは、正しくは $cat->term_id でした。
    大変申し訳ありません。正しくは

    <?php
    if ( is_single() ) :
        $categories = get_the_category( $post->ID );
        // カテゴリー ID 順に並べ替える場合は下の行をアンコメント
        // if ( !empty( $categories ) ) usort( $categories, '_usort_terms_by_ID' );
        foreach ( $categories as $cnt => $cat ) :
    ?>
    	<div id="toggler-<?php echo $cnt+1; ?>" class="opened" title="<?php echo esc_attr( $cat->name ); ?> の投稿一覧">
    		<div>
    			<ul>
    <?php
            $single_posts = get_posts( "numberposts=-1&category=$cat->term_id&order=asc" );
            foreach ( $single_posts as $post ) :
    ?>
    				<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
    <?php
            endforeach; // single_posts
    ?>
    			</ul>
    		</div>
    	</div>
    <?php
        endforeach; // categories
    endif; // is_single
    ?>

    です。これでもう一度お試しください。

    カテゴリー名は表示されるようになりましたが、どのカテゴリーに属する記事であっても親カテゴリーABCDの内Dしか表示されません。尚、Dのみ子カテゴリーがありません。

    これについては現象をよく理解できませんでした。
    が、もしかすると上記の修正で解決することかもしれません。

    トピック投稿者 eijiy

    (@eijiy)

    以下のコードAとコードBを試している最中、不思議な事に両方とも記述するとコードBが思い通りに動き、コードAを外すとコードBが思い通りに動きません。

    コードA

    <?php
    if ( is_single() ) :
        $categories = get_the_category( $post->ID );
        // カテゴリー ID 順に並べ替える場合は下の行をアンコメント
        // if ( !empty( $categories ) ) usort( $categories, '_usort_terms_by_ID' );
        foreach ( $categories as $cnt => $cat ) :
    ?>
    	<div id="toggler-<?php echo $cnt+1; ?>" class="closed" title="<?php echo esc_attr( $cat->name ); ?> の投稿一覧">
    		<div>
    			<ul>
    <?php
            $single_posts = get_posts( "numberposts=-1&category=$cat->term_ID&order=asc" );
            foreach ( $single_posts as $post ) :
    ?>
    				<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
    <?php
            endforeach; // single_posts
    ?>
    			</ul>
    		</div>
    	</div>
    <?php
        endforeach; // categories
    endif; // is_single
    ?>

    コードB

    <?php if (is_single()) : ?>
    <ul>
    <?php
    $cat = get_the_category(); $cat = $cat[0];
    //子孫が要る時
    remove_filter( 'pre_option_category_children', 'my_category_children' );
    //子孫が要らない時
    //add_filter( 'pre_option_category_children', 'my_category_children' );
    //
    $myposts = get_posts('category='. $cat->cat_ID);
    //$myposts = get_posts('category='. $cat->category_parent);
    foreach($myposts as $post) :
    ?>
    <li><a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></li>
    <?php endforeach; ?>
    </ul>
    <?php endif; ?>

    ここで言う思い通りの動きとは、単一記事表示中は同一カテゴリーの投稿一覧をサイドバーに表示させたいという事ですが、どうしてコードAを外すとコードBが機能しなくなるのでしょうか。

    どなたかご教授頂けないでしょうか。

    尚、コードBの子孫が要る時と要らない時は、自作テーマのfunctions.phpに以下のコードを記述(フォーラムから引用)しています。

    function my_category_children( $return ) {
      return array();
    }
    add_filter( 'pre_option_category_children', 'my_category_children' );

    宜しくお願い致します。

    トピック投稿者 eijiy

    (@eijiy)

    mizubeさんのコードで試した結果、どのカテゴリーに属する記事であっても親A,B,C,Dカテゴリーの内、子カテゴリーを持たないカテゴリーDの名前と投稿一覧がされました。

    うーん、ごめんなさい。もしかすると私ではお役に立てないかもしれません。

    実は、修正後の私のコードですが、WP Multibyte Patch のみを有効化した WP3.0.1 で TwentyTen テーマの sidebar.php に追加したところ、きちんと動作していることを確認しました(つまり、本当は単一記事が属するすべてのカテゴリーの投稿一覧が表示されるはずなんです)。

    もしかすると eijiy さんの追加した別のコードに起因している現象かもしれません。

    このコードより前に $post の値が書き換わるような処理を行うコードを single.php または sidebar.php に記述していませんか? その場合は、意味があるかどうか怪しいですが、私の提示したコードの先頭を

    <?php if ( is_single() ) : ?>

    から

    <?php if ( is_single() ) : wp_reset_query(); ?>

    に変更してみてください。

    トピック投稿者 eijiy

    (@eijiy)

    mizubeさん、wp_reset_query()を追加する事で思い通りになりました。

    <?php
    if ( is_single() ) : wp_reset_query();
        $categories = get_the_category( $post->ID );
        // カテゴリー ID 順に並べ替える場合は下の行をアンコメント
        // if ( !empty( $categories ) ) usort( $categories, '_usort_terms_by_ID' );
        foreach ( $categories as $cnt => $cat ) :
    ?>
    	<div id="toggler-<?php echo $cnt+1; ?>" class="opened" title="<?php echo esc_attr( $cat->cat_name ); ?> の投稿一覧">
    		<div>
    			<ul>
    <?php
    //子孫が要る時
    //remove_filter( 'pre_option_category_children', 'my_category_children' );
    //子孫が要らない時
    add_filter( 'pre_option_category_children', 'my_category_children' );
    //
    $single_posts = get_posts( "numberposts=-1&category=$cat->cat_ID&order=asc" ); //$cat->term_idでもいい
            foreach ( $single_posts as $post ) :
    ?>
    				<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
    <?php
            endforeach; // single_posts
    ?>
    			</ul>
    		</div>
    	</div>
    <?php
        endforeach; // categories
    endif; // is_single
    ?>

    ちょっと追加してますが、お陰で完成しました。
    ありがとうございました。

    また機会があれば宜しくお願い致します。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「表示中の単一記事のカテゴリーIDとカテゴリー名の取得」には新たに返信することはできません。