web-dev-qa-db-ja.com

同じカテゴリの関連記事を表示する方法

現在の投稿と同じカテゴリの関連する投稿を表示することはできますか?

7
BBee

一つの可能​​性:

$related = get_posts( 
    array( 
        'category__in' => wp_get_post_categories( $post->ID ), 
        'numberposts'  => 5, 
        'post__not_in' => array( $post->ID ) 
    ) 
);

if( $related ) { 
    foreach( $related as $post ) {
        setup_postdata($post);
        /*whatever you want to output*/
    }
    wp_reset_postdata();
}

参照:

WP_Query()に基づいて書き直された答え:

$related = new WP_Query(
    array(
        'category__in'   => wp_get_post_categories( $post->ID ),
        'posts_per_page' => 5,
        'post__not_in'   => array( $post->ID )
    )
);

if( $related->have_posts() ) { 
    while( $related->have_posts() ) { 
        $related->the_post(); 
        /*whatever you want to output*/
    }
    wp_reset_postdata();
}
18
Michael

ここでもう一つの清潔で非常に柔軟なオプション:

このコードをあなたのfunctions.phpファイルに入れてください

function example_cats_related_post() {

    $post_id = get_the_ID();
    $cat_ids = array();
    $categories = get_the_category( $post_id );

    if(!empty($categories) && is_wp_error($categories)):
        foreach ($categories as $category):
            array_Push($cat_ids, $category->term_id);
        endforeach;
    endif;

    $current_post_type = get_post_type($post_id);
    $query_args = array( 

        'category__in'   => $cat_ids,
        'post_type'      => $current_post_type,
        'post__not_in'    => array($post_id),
        'posts_per_page'  => '3'


     );

    $related_cats_post = new WP_Query( $query_args );

    if($related_cats_post->have_posts()):
         while($related_cats_post->have_posts()): $related_cats_post->the_post(); ?>
            <ul>
                <li>
                    <a href="<?php the_permalink(); ?>">
                        <?php the_title(); ?>
                    </a>
                    <?php the_content(); ?>
                </li>
            </ul>
        <?php endwhile;

        // Restore original Post Data
        wp_reset_postdata();
     endif;

}

今、あなたは単にあなたのサイトのどこでもこの関数を呼び出すことができます:

<?php example_cats_related_post() ?>

必要に応じて、リスト要素を削除したりスタイルを設定したりできます。

*編集 - あなたはこれを変更することができます:あなたの照会のこのpost__not_inにpost_not_in

0
Lawrence Oputa

この回答では、関連する投稿がタグの一致数で並べられていることを確認します。

たとえば、記事に3つのタグがあり、まったく同じ3つのタグを持つ別の記事がある場合は、リストの一番上に表示されます。新しいコンテンツが優先されるように、2次ソートは投稿日順にする必要があります。

/**
 * Select content with common tags.
 * Sort so content with multiple matching tags are at the top.
 * Secondary sort on most recent content first.
 *
 * @param $post_id
 * @param int $limit
 * @return array
 */
function related_posts($post_id, $limit = 5) {

    global $wpdb;

    $query  = "SELECT TOP %d x.object_id as ID
FROM (
SELECT TOP 10 tr1.object_id, COUNT(tr1.term_taxonomy_id) AS common_tag_count
FROM {$wpdb->term_relationships} AS tr1
INNER JOIN {$wpdb->term_relationships} AS tr2 ON tr1.term_taxonomy_id = tr2.term_taxonomy_id
WHERE tr2.object_id = %d
GROUP BY tr1.object_id
HAVING tr1.object_id != %d
ORDER BY COUNT(tr1.term_taxonomy_id) DESC
) x
INNER JOIN {$wpdb->posts} p ON p.ID = x.object_id
ORDER BY common_tag_count DESC, p.post_date DESC;";

    $query = $wpdb->prepare($query, $limit, $post_id, $post_id);
    $ids = $wpdb->get_col($query);
    $posts = [];
    foreach($ids as $id)  {
        $posts[] = get_post($id);
    }

    return $posts;

}

ここでの内部クエリは最も一致するタグを持つコンテンツを選択することです。そして、外部クエリは単に投稿日による二次ソートを適用するために使用されます。

このクエリはSQL Server用に書かれているため、構文によっては更新が必要になる場合があります(たとえば、TOPとLIMIT)。

0
Felix Eve