Как случайным образом выводить связанные записи по тегам?

7 апр. 2015 г., 21:16:58
Просмотры: 14.2K
Голосов: 2

Подскажите, какой код нужно добавить, чтобы связанные записи по тегам выводились в случайном порядке? Я нашел этот код в интернете.

<?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(); ?>

Есть решение? Спасибо!

3
Комментарии

Мне просто нужно знать, как исключить один тег

Moreentje Moreentje
31 мар. 2022 г. 12:32:07

Связано: https://wordpress.stackexchange.com/questions/98024/related-posts-by-multiple-tags

Jesse Nickles Jesse Nickles
27 янв. 2024 г. 11:41:36

Связано: https://stackoverflow.com/questions/29395419/display-related-post-based-on-tag

Jesse Nickles Jesse Nickles
27 янв. 2024 г. 12:57:50
Все ответы на вопрос 1
5
17

Некоторый код в оригинальном посте устарел и не рекомендуется к использованию, например 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-->';
}
?>
7 апр. 2015 г. 21:47:36
Комментарии

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

Jornes Jornes
8 апр. 2015 г. 06:12:38

Всегда пожалуйста, наслаждайтесь :-)

Pieter Goosen Pieter Goosen
8 апр. 2015 г. 08:49:21

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

Fatih Toprak Fatih Toprak
12 окт. 2016 г. 05:03:35

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

Jesse Nickles Jesse Nickles
27 янв. 2024 г. 11:39:46

Сейчас не могу редактировать, но оставляю здесь заметку, что фрагмент rel="nofollow" следует удалить из этого ответа.

Jesse Nickles Jesse Nickles
29 янв. 2024 г. 09:27:17