web-dev-qa-db-fra.com

Doublons avec boucle WP_Query

Je montre sur ma page d'accueil uniquement les messages avec l'image sélectionnée. Mon problème est que, à chaque chargement de page suivante, je reçois les mêmes résultats, c'est-à-dire l'obtention de doublons. J'utilise la commande par champ personnalisé. Toutes les directions/idées pouvant mener à ce problème sont les bienvenues. Ci-dessous ma boucle principale

// Layout
if(is_category())
{
    $post_layout = blt_get_option('category_post_layout', 'normal');
}
elseif(is_author())
{
    $post_layout = blt_get_option('author_post_layout', 'normal');
}
elseif(is_archive())
{
    $post_layout = blt_get_option('archive_post_layout', 'normal');
}
else
{
    $post_layout = blt_get_option('home_post_layout', 'normal');
}


$i = 1;
if(have_posts()){ 

    while(have_posts()){ 

        the_post();
        get_template_part( 'inc/template-parts/content', $post_layout );


        // Ad spot #4
        if($ad_spot_between_posts = blt_get_option('spot_between_posts', 'none') != 'none'){

            $ad_posts_frequency = blt_get_option('spot_between_posts_frequency', 3);

            // take into account ad frequency
            if(($i % (int) $ad_posts_frequency) == 0){
                blt_get_ad_spot( 'spot_between_posts' );
            }

        }
        $i++;

    }

}else{

    $has_posts = false;

}

Et voici mon index:

  <?php get_header(); ?>


<div id="site-content" class="clearfix">

    <?php

        // Front Page - Top of container
        if(is_front_page() and is_active_sidebar('front-top_of_container')){
            dynamic_sidebar('front-top_of_container');
        }

    ?>
    <div id="site-content-column"><?php

        if(is_archive()){
            blt_get_title();        
        }


        if(have_posts()){ 

            echo '<div class="row">';
            include(get_template_directory().'/loop.php');
            echo '</div>';


            // Previous/next page navigation.
            if(!blt_get_option('enable_infinite_scrolling')){

                the_posts_pagination(array(
                    'prev_text'          => '<i class="fa fa-chevron-left"></i>',
                    'next_text'          => '<i class="fa fa-chevron-right"></i>',
                    'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Page', 'blue' ) . ' </span>',
                ));

            }           

        }else{ 

            get_template_part( 'inc/template-parts/content', 'none' );

        } ?> 

    </div><?php

    #   
    #   SIDEBAR
    #   ========================================================================================
    #   Load the sidebar if needed
    #   ========================================================================================
    #       
    if(in_array(blt_get_option('sidebar_layout', 'right'), array('left', 'right'), true)){
        get_sidebar();
    } ?>

</div>

<?php get_footer(); ?>

Edit: fonction de défilement infini

function blt_infinitepaginate(){ 

    $has_posts      = true;
    $type           = isset($_POST['type']) ? $_POST['type'] : false;
    $loopFile       = $_POST['loop_file'];
    $paged          = $_POST['page_no'];
    $posts_per_page = get_option('posts_per_page');
    $post_id        = isset($_POST['post_id']) ? $_POST['post_id'] : false;

    # Load the posts
    if($post_id){

        include(get_template_directory().'/loop-hottest.php');

    }else{

        query_posts( array( 'paged' => $paged+1, 'post_status' => 'publish', 'post__not_in' => get_option('sticky_posts') ) );
        include(get_template_directory().'/loop.php');

    }

    if(!$has_posts){
        return false;
    }

    exit;

}

function blt_change_main_loop( $query ) {

    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( is_home() and isset($_GET['page'])) {
        $query->set( 'posts_per_page', $_GET['page'] * get_option('posts_per_page') );
        return;
    }

}
add_action( 'pre_get_posts', 'blt_change_main_loop', 1 );


}
2
tslid

Il est assez difficile de répondre correctement à votre question avec la quantité de contexte dans votre question, mais je vais essayer d'utiliser le contexte de votre question précédente

Ayant un peu plus de contexte ici sur le modèle, et si je lis ceci correctement, cela se trouve sur votre index.php, je crois toujours et je maintiens mon point que pre_get_posts est votre réponse. Abordez ce problème comme suit (uniquement s'il ne s'agit pas d'une page de garde statique, car ce qui suit ne fonctionnera pas)

  • Supprimez votre requête personnalisée. Revenez à votre configuration par défaut où vous obtenez tous les messages normalement

  • Ensuite, utilisez pre_get_posts pour modifier la requête principale sur votre page d'accueil afin d'afficher uniquement les publications avec des vignettes. Cela devrait résoudre votre problème avec la pagination

Ajoutez les éléments suivants dans votre fichier functions.php: ( requiert au moins PHP 5.3 )

add_action( 'pre_get_posts', function ( $q ) 
{
    if (     $q->is_home() // Target the home page only
          && $q->is_main_query() // Target only the main query
    ) {
        $meta_query = array(
            array(
                'key' => '_thumbnail_id'
            )
        );
        $q->set( 'meta_query', $meta_query );
    }
});

Si cela ne résout pas votre problème, vous devez vraiment publier plus de contexte.

MODIFIER

Je ne vais pas entrer dans les détails concernant query_posts et à quel point c'est vraiment grave, je l'ai couvert dans ma réponse précédente à votre question précédente. Comme vous n'avez probablement pas codé cela, je contacterais le développeur à ce sujet.

Quoi qu'il en soit, pour résoudre rapidement votre problème avec le défilement infini, vous devez ajouter ce qui suit à vos arguments query_posts.

'meta_query' => array( array( 'key' => '_thumbnail_id' ) ),

Juste une note, je préférerais réécrire la fonction de défilement infini complète avec WP_Query comme décrit dans votre question précédente.

2
Pieter Goosen