私のブログの下部に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
はあまり普及しているので検索では無視したいのですが、それらの結果を隠すことはしません。
たとえば、この投稿はカテゴリ2
と3
にあります。私はカテゴリ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
) );
あなたの質問から私が集めることができるのは、
関連する投稿クエリで1つのカテゴリを無視したい場合があります。
ただし、実際にそのカテゴリから投稿を除外したくはありません(投稿がそのカテゴリに属しているが、探したい別のカテゴリにも属している場合)。
上記の仮定に基づいて、次のコードを使用することができます(コメント内のコード内に説明があります)。
// 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()
関数も使用できます。
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
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 }
$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
) );