web-dev-qa-db-ja.com

カテゴリ別に関連する投稿を表示しますが、1つのカテゴリは無視します

私のブログの下部に4つの関連記事(プラグインなし)を表示したいです。ただし、特定のカテゴリを除外したいです。

たとえば、自分のブログ投稿がカテゴリ2および3にある場合、カテゴリ2を無視してカテゴリ3のブログ投稿のみを検索します。これはsingle.phpの関連部分です:

注: 以下のコードは現在機能していません。

$related = get_posts( array(
    'category__in'  => wp_get_post_categories( $post->ID ),
    'numberposts'   => 4,
    'orderby'       => 'date',
    'post__not_in'  => array( $post->ID ),
    'cat'           => '-2'
) );

if( $related ) { 
    foreach( $related as $post ) {
        setup_postdata($post);
         /** .. **/
    }
}

更新: カテゴリ2はあまり普及しているので検索では無視したいのですが、それらの結果を隠すことはしません。

たとえば、この投稿はカテゴリ23にあります。私はカテゴリ3を持つ他の投稿を見つけたい、そしておそらくそれらはカテゴリ2を持っていますが、私はカテゴリ3で検索したいだけです。

アップデート2: 私は以下のコードを持っていますが、現在正しく機能していると思います。

$cat_ids = get_the_category();
if( ! empty( $cat_ids ) ) {
    $post_cat_ids = array();
    foreach( $cat_ids as $cat_id ) {
        if( $cat_id->cat_ID != 2 ) {
            $post_cat_ids[] = $cat_id->cat_ID;
        }
    }
}

$related = get_posts( array(
    'category__in' => wp_get_post_categories( $post->ID ),
    'numberposts' => 4,
    'orderby' => 'date',
    'exclude' => array( $post->ID ),
    'category' => $post_cat_ids
    ) );
4
Austin

あなたの質問から私が集めることができるのは、

  1. 関連する投稿クエリで1つのカテゴリを無視したい場合があります。

  2. ただし、実際にそのカテゴリから投稿を除外したくはありません(投稿がそのカテゴリに属しているが、探したい別のカテゴリにも属している場合)。

上記の仮定に基づいて、次のコードを使用することができます(コメント内のコード内に説明があります)。

    // set the category ID (or multiple category IDs)
    // you want to ignore in the following array
    $cats_to_ignore = array( 2 );
    $categories = wp_get_post_categories( get_the_ID() );
    $category_in = array_diff( $categories, $cats_to_ignore );
    // ignore only if we have any category left after ignoring
    if( count( $category_in ) == 0 ) {
        $category_in = $categories;
    }
    $cat_args = array(
        'category__in'   => $category_in,
        'posts_per_page' => 4,
        'orderby'        => 'date',
        'post__not_in'   => array( get_the_ID() )
        );
    $cat_query = new WP_Query( $cat_args );
    while ( $cat_query->have_posts() ) : $cat_query->the_post();
        /* just example markup for related posts */
        echo '<h2><a href="' . get_the_permalink() . '">' . get_the_title() . '</a></h2>';
    endwhile;
    // reset $post after custom loop ends (if you need the main loop after this point)
    wp_reset_postdata();

'cat' => '-2'または'category__not_in' => array(2)を使用することはできません。これらの投稿に他のカテゴリがある場合でも、カテゴリ2を持つすべての投稿が除外されるためです。そのため、除外するのではなく、このコードを使用したクエリでカテゴリ2を無視しました:array_diff( $categories, $cats_to_ignore );

注: WP_Queryを使用した反復は元のループのように見えるため、get_posts()の代わりにWP_Queryを使用しました。しかし、もちろん内部的にWP_Queryを呼び出すので、get_posts()関数も使用できます。

2
Fayaz

category__not_inパラメータにアクセスしてください。

$related = get_posts( array(
    'numberposts'   => 4,
    'orderby'       => 'date',
    'category__in'  => wp_get_post_categories( $post->ID ),
    'category__not_in' => array(2);
) );

それはうまくいくはずです。

参照: https://codex.wordpress.org/Class_Reference/WP_Query#Category_Parameters

1
Rahul Arora
function custom_related_post()
{
    global $post;
    $related = get_posts(array('category__in' => wp_get_post_categories($post->ID), 'numberposts' => 2, 'post__not_in' => array($post->ID)));
    ?>
    <div class="related-post-content wow fadeInUp">
        <h5><?php esc_html_e('Related Posts', 'text-domain'); ?></h5>
        <div class="related-post d-flex">
            <?php
            if ($related) foreach ($related as $post) {
                setup_postdata($post);
                /* translators: used between list items, there is a space after the comma */

                ?>
                <div class="single-relatd-post">
                    <div class="img-overflow">
                        <a href="<?php the_title(); ?>"><?php the_post_thumbnail(); ?></a>
                    </div>
                    <h6><?php the_title(); ?></h6>
                    <p><?php the_author(); ?> <span>-</span> <?php echo get_the_date(); ?></p>
                </div>
                <?php wp_reset_postdata();
            }
            ?>
        </div>
    </div>

<?php }
0
Abdus Salam
$cat_ids = get_the_category();

if( ! empty( $cat_ids ) ) {
    $post_cat_ids = array();

    foreach( $cat_ids as $cat_id ) {
        if( 2 != $cat_id->cat_ID ) {
            $post_cat_ids[] = $cat_id->cat_ID;
        }
    }
}

$related = get_posts( array(
    'category__in'  => wp_get_post_categories( $post->ID ),
    'numberposts'   => 4,
    'orderby'       => 'date',
    'exclude'       => array( $post->ID ),
    'category'      => $post_cat_ids
) );
0
Austin