J'ai un tableau d'identifiants dans un ordre spécifique. J'utilise post__in
dans ma requête pour obtenir des publications de ce tableau. J'ai plusieurs ID de publication en double que je dois montrer deux fois dans la page, mais la requête semble les ignorer. Disons que le tableau est comme suit
array values = 1,2,3,4,2,5
Lorsque je passe ce tableau à post__in
, il ne prend pas la valeur '2'
deux fois, comme je l’ai spécifié dans le tableau. Y at-il une solution de contournement pour cela?
Un tableau comme array( 1,2,3,4,2,5 )
sera lu comme suit:
Array(
0 => 1
,1 => 2
,2 => 3
,3 => 4
,4 => 2
,5 => 5
) [length = 6 ]
ce qui semble bien. Mais lorsque vous examinez l'objet WP_Query
, la partie suivante est ajoutée à la chaîne de requête:
" AND {$wpdb->posts}.ID IN ($post__in)"
Cela signifie que chaque message sera récupéré une fois.
Ainsi, à moins que vous ne modifiiez la requête pour inclure la publication à plusieurs reprises, il ne vous restera plus qu'une option pour le faire au moment de l'exécution.
Chaque boucle de base ressemble à ceci:
if ( have_posts() )
{
while( have_posts )
{
the_post();
// do stuff
}
}
Désormais, le global $post
fait référence à ce qui est configuré via the_post()
. C'est fondamentalement un wrapper pour $GLOBALS['wp_query']->the_post();
. Et quand vous regardez la méthode WP_Query::the_post()
, vous trouvez des choses assez intéressantes:
function the_post() {
global $post;
$this->in_the_loop = true;
if ( $this->current_post == -1 ) // loop has just started
do_action_ref_array('loop_start', array(&$this));
$post = $this->next_post();
setup_postdata($post);
}
Là, vous voyez $this->next_post();
appelé. Et celui-ci ressemble de l'intérieur à ce qui suit:
function next_post() {
$this->current_post++;
$this->post = $this->posts[$this->current_post];
return $this->post;
}
Vous voyez donc que le principal objet de la boucle est le compteur current_post
. Celui-ci est également accessible depuis le front-end/un template. Simplement utiliser
$GLOBALS['wp_query']->current_post
pour "sauter" entre les posts. Donc, si vous avez besoin de répéter une publication après la publication X, alors vérifiez-la, basculez pour un tour, puis revenez en arrière.
Vous pouvez mettre en boucle vos identifiants et appeler get_post
et setup_postdata
:
global $post;
foreach ($ids as $id) :
$post = get_post($id);
setup_postdata( $post );
the_title();
endforeach;