web-dev-qa-db-fra.com

en utilisant post__in, permettez le duplicata post id

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?

2
KT.

La situation

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.

Conclusion

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.

Possibilités de configuration d'exécution et de radiographie des composants internes

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;
}

Solution

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.

2
kaiser

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;
1
Tolea Bivol