Как случайным образом выводить связанные записи по тегам?
Подскажите, какой код нужно добавить, чтобы связанные записи по тегам выводились в случайном порядке? Я нашел этот код в интернете.
<?php $orig_post = $post;
global $post;
$tags = wp_get_post_tags($post->ID);
if ($tags) {
$tag_ids = array();
foreach($tags as $individual_tag) $tag_ids[] = $individual_tag->term_id;
$args=array(
'tag__in' => $tag_ids,
'post__not_in' => array($post->ID),
'posts_per_page'=>5, // Количество выводимых связанных записей
'caller_get_posts'=>1,
'orderby' => 'rand' // Добавьте эту строку для случайного порядка
);
$my_query = new wp_query( $args );
if( $my_query->have_posts() ) {
echo '<div id="related"><h4>Похожие записи</h4>';
while( $my_query->have_posts() ) {
$my_query->the_post(); ?>
<div class="ncc">
<h5><a href="<? the_permalink()?>" rel="bookmark" title="<?php the_title(); ?>" rel="nofollow"><?php the_title(); ?></a></h5>
<?php the_excerpt(); ?>
</div><!--ncc-->
<? }
echo '</div><!--related-->';
}
}
$post = $orig_post;
wp_reset_query(); ?>
Есть решение? Спасибо!
Некоторый код в оригинальном посте устарел и не рекомендуется к использованию, например caller_get_posts
, который был объявлен устаревшим несколько лет назад. Правильный параметр для использования сейчас — ignore_sticky_posts
. Ваш запрос также довольно неэффективен и плохо влияет на производительность.
Вот как я бы решал эту задачу:
Используйте
get_queried_object_id()
для получения ID текущей записи вместо менее надежного метода с глобальной переменной$post
Используйте
wp_get_post_terms()
для получения всех ID меток, связанных с записью. Судя по всему, нам нужны только ID, а не полные объекты метокИспользуйте правильный
tax_query
для получения всех записей, имеющих любую из этих меток. Это скорее вопрос предпочтений, так как это легко адаптировать для разных таксономий, и, судя по исходному коду, параметры меток используютtax_query
Используйте
rand
в качестве значения для параметраorderby
вWP_Query
Короче говоря, вот как это выглядит в коде: (Не тестировалось, требует PHP 5.4+)
<?php
$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,
'ignore_sticky_posts' => 1,
'orderby' => 'rand',
'tax_query' => [
[
'taxonomy' => 'post_tag',
'terms' => $tags
]
]
];
$my_query = new wp_query( $args );
if( $my_query->have_posts() ) {
echo '<div id="related"><h4>Похожие записи</h4>';
while( $my_query->have_posts() ) {
$my_query->the_post(); ?>
<div class="ncc">
<h5><a href="<?php the_permalink()?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></h5>
<?php the_excerpt(); ?>
</div><!--ncc-->
<?php }
wp_reset_postdata();
echo '</div><!--related-->';
}
?>

Привет, Peter Goosen, потрясающе! Твой код отлично работает! Большое спасибо! :)

Вау, выглядит отлично. Ещё один вопрос: как мы можем исключить самые популярные посты из этого запроса? Просмотры постов хранятся в произвольном поле с названием (pageView)? Это возможно?

По-прежнему отлично работает в PHP 8... это фирменное качество Гусена ;)
