web-dev-qa-db-ja.com

親カテゴリではなくサブカテゴリ別に関連記事を表示する方法

現在の投稿のサブカテゴリに基づいて、特定の親カテゴリのサブカテゴリにある関連する投稿を表示する方法を見つけようとしています。現在の投稿を複数の親カテゴリに割り当てることができますが、親カテゴリのサブカテゴリの1つの関連投稿のみを表示したいのですが。

たとえば、投稿をカテゴリA、B、Cに割り当てることができますが、現在の投稿のBサブカテゴリに基づいて関連する投稿を表示し、 all のどちらの投稿も表示しないようにします。 A、BまたはC申し訳ありませんが、この質問/問題の説明は困難です。

このコードを使用してカテゴリ名と投稿を表示していますが、親カテゴリを除外する方法がわからないため、サブカテゴリの投稿のみが表示されます。

More in 
    <?php $category = get_the_category(); 
        if ( in_category(52) || in_category(56) || in_category(57) || in_category(99) || in_category(28) ) {
            echo $category[1]->cat_name; 
        } else {echo $category[0]->cat_name;}
    ?>

<?php if (have_posts() && !(in_category('32'))) : ?>    
    <?php $i = 1; while (have_posts() && $i <= 1) : the_post(); ?>
        <?php $related = get_posts(array('category__in' => wp_get_post_categories($post->ID), 'numberposts' => 1, 'post__not_in' => array($post->ID)));
if($related) foreach( $related as $post) {
        setup_postdata($post); ?>
        <?php the_post_thumbnail('medium'); ?>
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                <a href="<?php the_permalink(); ?>"><?php the_excerpt(''); ?></a>
                <?php the_author(); ?></div>    
            <?php } wp_reset_postdata(); ?>
    <?php $i++; endwhile; ?>
<?php endif; ?>

ありがとうございます。

1
Sean Henderson

もっと簡単な方法があります。

まず、子カテゴリを取得するには、各カテゴリの親の値を確認するだけです。それがトップレベルのカテゴリであれば、親は0になります。そのため、子カテゴリはテストif( 0 != $category->parent )に合格します。

$categories = get_the_category();
foreach( $categories as $category ){
    if( 0 != $category->parent )
        $child_cat = $category;
}

そのカテゴリIDをcat引数として使用して、投稿をクエリします。最初の投稿のサムネイルのみを出力するには、クエリオブジェクトのcurrent_postが0かどうかを確認します。その番号は、ループ内の投稿ごとに0から始まり、自動的に増加します。

if( isset( $child_cat ) ){  
    echo 'More in ' . $child_cat->name;
    $args = array(
        'cat' => $child_cat->term_id,
        'post__not_in' => array( get_the_ID() )
    );
    $related = new WP_Query( $args );
    if( $related->have_posts() ){
        while( $related->have_posts() ){
            $related->the_post();
            if( 0 == $related->current_post ){
                the_post_thumbnail('medium');
            }
            // your template tags, etc..
            the_title();
        }
        wp_reset_postdata();
    }
}

また、グローバルな$wp_queryを上書きしない限りwp_reset_query()を使う必要はありません。これはここでは起こりません。

2
Milo

だからここに私が思い付いたものです。これがこれをコーディングするのに理想的な方法であるとは思いませんが、必要なことを正確に行っています。

これにより、親カテゴリを除外してサイドバーの関連アイテムのサブカテゴリセクションのラベルを取得できます。

More in 
    <?php 
        $category = get_the_category();
        $catname = $category[0]->cat_name;
        if ($catname == 'News' || $catname == 'Featured' || $catname == 'Nav Bar News') {
            $catname = $category[1]->cat_name;
                if ($catname == 'News' || $catname == 'Featured' || $catname == 'Nav Bar News') {
                    $catname = $category[2]->cat_name;
                    if ($catname == 'News' || $catname == 'Featured' || $catname == 'Nav Bar News') {
                        $catname = $category[3]->cat_name;
                    }
                }
            } else {
                $catname = $category[0]->cat_name;
            }
            echo $catname;
        ?>

これは少し面倒になるところですが、コードは私が達成するために必要なもののために動作します。親カテゴリを除外してから、ループを使用して関連サブカテゴリからの投稿を表示しました。

        wp_reset_query();
        $this_post = $post->ID;
        $category = get_the_category($post->ID);
        $category = $category[0]->cat_ID;
        if ($category == '30' || $category == '28' || $category == '99') {
            $category = $category[1]->cat_ID;
            if ($category == '30' || $category == '28' || $category == '99') {
                $category = $category[2]->cat_ID;
                if ($category == '30' || $category == '28' || $category == '99') {
                    $category = $category[3]->cat_ID;
                } 
            }
        } 
        $args = array(
            'category__in' => array($category),
            'post__not_in' => array($this_post)
        );
        $the_query = new WP_Query($args);

        if ( $the_query->have_posts() && !(in_category('32'))) {
            $i = 0; while ( $the_query->have_posts() && $i < 1) {
                $the_query->the_post(); ?>
                        <?php the_post_thumbnail('medium'); ?>
                        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                            <a href="<?php the_permalink(); ?>"><?php echo excerpt(30); ?></a>
                            <?php the_author(); ?>
            <?php $i++; } 
        } else {
            //echo 'no posts';
        }
        wp_reset_postdata();

        wp_reset_query();
        $this_post = $post->ID;
        $category = get_the_category($post->ID);
        $category = $category[0]->cat_ID;
        if ($category == '30' || $category == '28' || $category == '99') {
            $category = $category[1]->cat_ID;
            if ($category == '30' || $category == '28' || $category == '99') {
                $category = $category[2]->cat_ID;
                if ($category == '30' || $category == '28' || $category == '99') {
                    $category = $category[3]->cat_ID;
                } 
            }
        } 
        $args = array(
            'category__in' => array($category),
            'post__not_in' => array($this_post),
            'offset' => 1
        );
        $the_query = new WP_Query($args);

        if ( $the_query->have_posts() && !(in_category('32'))) {
            $i = 0; while ( $the_query->have_posts() && $i < 3) {
                $the_query->the_post(); ?>
                        <a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a>
                    <?php if ($i < 2) { ?>
                        <hr style="width: 92%;">
                    <?php } ?>
            <?php $i++; } 
        } else {
            //echo 'no posts';
        }
        wp_reset_postdata();

これをすべて1回のループで実行しようとしましたが、最初の投稿についてのみおすすめの画像を表示してから、その投稿を再び表示することから除外することはできませんでした。誰かがこれを書くためのよりきれいな方法を持っているならば、私に知らせてください。

0
Sean Henderson