Antworten:
Eine Möglichkeit:
$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();
}
Referenz:
Antwort neu geschrieben basierend auf 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();
}
setup_postdata()
mit etwas anderem als beispielsweise $post
nicht die richtige Ausgabe the_title()
. wp_reset_postdata()
sollte theoretisch dafür sorgen, dass $ post zurückgesetzt wird.
setup_postdata()
selbst $post
als global verweist . Anstatt zu verwenden get_posts()
, sollten Sie eine benutzerdefinierte Instanz von definierenWP_Query
und diese verwenden, um Ihre Beiträge abzurufen. Es wird die Post-Daten für Sie einrichten und the_title()
et al. So arbeiten lassen, wie sie es sollen.
Diese Antwort stellt sicher, dass verwandte Beiträge nach der Anzahl der übereinstimmenden Tags sortiert sind.
Wenn ein Artikel beispielsweise 3 Tags enthält und es einen anderen Artikel mit genau denselben 3 Tags gibt, sollte er oben in der Liste angezeigt werden. Die sekundäre Sortierung sollte nach dem Post-Datum erfolgen, damit neuere Inhalte bevorzugt werden.
/**
* 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;
}
Die innere Abfrage besteht hier darin, den Inhalt mit den am besten passenden Tags auszuwählen, und die äußere Abfrage wird nur verwendet, um die sekundäre Sortierung nach dem Veröffentlichungsdatum anzuwenden.
Beachten Sie, dass diese Abfrage für SQL Server geschrieben wurde, sodass einige Syntax möglicherweise aktualisiert werden muss (z. B. TOP vs LIMIT).
Hier noch eine saubere und sehr flexible Option:
Fügen Sie diesen Code in Ihre Datei functions.php ein
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;
}
Jetzt können Sie die Funktion einfach überall auf Ihrer Site aufrufen, indem Sie:
<?php example_cats_related_post() ?>
Möglicherweise möchten Sie die Listenelemente entfernen oder nach Bedarf formatieren.
* Bearbeiten - Sie können dies ändern: post_not_in zu diesem post__not_in in Ihrer Abfrage
Mit diesem Code können Sie verwandte Beiträge aus derselben Kategorie abrufen
$args = array(
'category__in' => wp_get_post_categories( get_queried_object_id() ),
'posts_per_page' => 5,
'orderby' => 'rand',
'post__not_in' => array( get_queried_object_id() )
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) : ?>
<ul class="">
<!-- the loop -->
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<li>
<h6>
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
<?php the_title(); ?>
</a>
</h6>
</li>
<?php endwhile; ?>
<!-- end of the loop -->
</ul>
<?php wp_reset_postdata(); ?>
<?php endif; ?>
und verwenden Sie diesen Code, um verwandte Beiträge von denselben Tags abzurufen
$tags = wp_get_post_terms( get_queried_object_id(), 'post_tag', ['fields' => 'ids'] );
$args = [
'post__not_in' => array( get_queried_object_id() ),
'posts_per_page' => 5,
'orderby' => 'rand',
'tax_query' => [
[
'taxonomy' => 'post_tag',
'terms' => $tags
]
]
];
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) : ?>
<ul class="">
<!-- the loop -->
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<li>
<h6>
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
<?php the_title(); ?>
</a>
</h6>
</li>
<?php endwhile; ?>
<!-- end of the loop -->
</ul>
<?php wp_reset_postdata(); ?>
<?php endif; ?>
$post
Element, um Ihre Abfrage auszuführen, und definieren es dann$post
im selben Kontext innerhalb Ihrerforeach
Schleife neu.