Afisare aleatorie a postărilor conexe care se potrivesc cu oricare dintre tagurile existente?

7 apr. 2015, 21:16:58
Vizualizări: 14.2K
Voturi: 2

Aș dori să întreb ce cod ar trebui să adaug pentru a face ca postările mele conexe după tag-uri să fie afișate aleatoriu? Am obținut acest cod de undeva.

<?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, // Numărul de postări conexe care vor fi afișate.
'caller_get_posts'=>1,
'orderby' => 'rand' // Adaugă această linie pentru ordonare aleatorie
);
$my_query = new wp_query( $args );
if( $my_query->have_posts() ) {
echo '<div id="related"><h4>Postări conexe</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(); ?>

O soluție? Mulțumesc!

3
Comentarii

Trebuie doar să știu cum să exclud un singur tag

Moreentje Moreentje
31 mar. 2022 12:32:07
Toate răspunsurile la întrebare 1
5
17

O parte din codul din OP este puțin învechit și depreciat, cum ar fi caller_get_posts care a fost depreciat acum ani de zile. Parametrul corect de utilizat acum este ignore_sticky_posts. Interogarea ta este, de asemenea, foarte ineficientă și nu este bună pentru performanță.

Iată cum aș aborda eu această problemă

  • Utilizează get_queried_object_id() pentru a obține ID-ul postării curente în loc de metoda mai puțin fiabilă folosind globalul $post

  • Utilizează wp_get_post_terms() pentru a returna toate ID-urile de etichete atribuite postării. Din câte înțeleg, avem nevoie doar de ID-uri, nu și de obiectele complete de etichete

  • Utilizează un tax_query adecvat pentru a obține toate postările care au oricare dintre aceste etichete atașate. Aceasta este mai mult o preferință personală, deoarece este ușor de schimbat între taxonomii și, de asemenea, uitându-ne la codul sursă, parametrii de etichetă folosesc un tax_query

  • Utilizează rand ca valoare pentru parametrul orderby în WP_Query

Pe scurt, punând toate acestea în cod: (Netestat, necesită 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>Postări Asemănătoare</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 apr. 2015 21:47:36
Comentarii

Salut Peter Goosen, uimitor! Codul tău funcționează perfect! Îți mulțumesc foarte mult! :)

Jornes Jornes
8 apr. 2015 06:12:38

Cu plăcere, spor la utilizare :-)

Pieter Goosen Pieter Goosen
8 apr. 2015 08:49:21

wow arată minunat. altă întrebare: cum putem exclude cele mai populare postări din această interogare? Vizualizările postărilor sunt stocate într-un câmp personalizat numit (pageView)? este posibil?

Fatih Toprak Fatih Toprak
12 oct. 2016 05:03:35

Încă funcționează perfect în PHP 8... asta e calitatea Goosen ;)

Jesse Nickles Jesse Nickles
27 ian. 2024 11:39:46

Nu pot edita acum, dar las aici o notă că fragmentul rel="nofollow" ar trebui șters din acest răspuns.

Jesse Nickles Jesse Nickles
29 ian. 2024 09:27:17