Afisare aleatorie a postărilor conexe care se potrivesc cu oricare dintre tagurile existente?
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!
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 eticheteUtilizează 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 untax_query
Utilizează
rand
ca valoare pentru parametrulorderby
înWP_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-->';
}
?>

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

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?

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