Elementor Loop Grid: perché duplica i post (e come risolverlo)

Jacopo Giorgini
Illustrazione flat di un bug che genera contenuti duplicati in una griglia Elementor, con ingranaggio di correzione accanto

Scorri la pagina, parte l’infinite scroll, e in fondo ritrovi gli stessi post che avevi già visto in alto, oppure clicchi su “Carica altri” e il Loop Grid ricarica sempre la prima pagina. L’ho visto succedere su directory e archivi WooCommerce costruiti con Elementor Pro, e le cause reali sono poche, sempre le stesse, ognuna con una correzione precisa.

Importante: i tre frammenti di codice di questo articolo intervengono su query e redirect a livello di sito. Testali su una copia di staging, fai un backup di functions.php prima di modificarlo in produzione, e leggi cosa fa ogni riga: se il sito ha già altri plugin o hook che agganciano le stesse query, l’effetto può sommarsi in modi che vale la pena controllare prima.

Perché il Loop Grid duplica i post quando cambi pagina?

Nella maggior parte dei casi il problema non è un errore nel codice di Elementor, ma di MySQL, il database che WordPress usa per salvare e leggere i contenuti, che non sa in che ordine restituire righe con lo stesso valore di ordinamento. Succede spesso con articoli importati in blocco, che condividono tutti la stessa data al secondo, oppure con menu_order mai impostato, che resta a 0 per ogni post.

Il resto delle cause riguarda invece la paginazione che si perde per strada, tra un plugin che resetta la query, un reindirizzamento che riporta all’inizio e un carosello che clona le slide per riempire lo spazio: le vedi qui sotto, in ordine di frequenza reale.

Come stabilizzo l’ordinamento del database?

Nella mia esperienza funziona quasi sempre. Aggiungi l’ID del post come criterio di ordinamento secondario, così che a parità di data o di menu_order il database usi sempre lo stesso valore per decidere chi viene prima:

  1. apri il pannello “Query” del widget e assegna un Query ID univoco, ad esempio fallback_sort;
  2. aggiungi questo frammento di codice in un plugin come Code Snippets o nel functions.php del tema child;
  3. verifica caricando la seconda pagina via URL diretto o via richiesta asincrona, e controlla che i post non coincidano con quelli già mostrati in apertura.
add_action('elementor/query/fallback_sort', function($query) {
    $query->set('orderby', [
        'date' => 'DESC',
        'ID'   => 'ASC',
    ]);
});

Consiglio: questo fallback non serve se l’ordinamento è impostato su “Random”: in quel caso la duplicazione è strutturale, perché ogni richiesta rimescola l’intero set di dati. Se ti serve varietà senza duplicati, un ordinamento fisso funziona meglio di uno casuale.

Perché non vedo il campo “Query ID”?

Da Elementor Pro 3.29.0, se imposti il template su “Product”, quel campo scompare dal pannello e non puoi più agganciare il codice di prima: è un bug noto, non una scelta di design, e la soluzione alternativa è semplice.

Imposta temporaneamente “Layout” su “Post” e “Query Source” su “Products”: il campo torna visibile, la query continua a interrogare i prodotti, e puoi inserire il tuo identificativo come al punto precedente.

Perché la paginazione torna sempre all’inizio?

Il sospetto numero due, quando il fallback sort è già attivo e il problema persiste, è un hook pre_get_posts di un altro plugin che sovrascrive gli argomenti della query senza controllare se è quella giusta: il sintomo è specifico, perché l’infinite scroll parte, ma ogni richiesta restituisce di nuovo gli stessi risultati. Aggancia il fix sullo stesso Query ID già assegnato al widget (qui riuso fallback_sort, non un nome fisso) per forzare il parametro paged:

add_action('elementor/query/fallback_sort', function($query) {
    if (!$query->is_main_query()) {
        $query->set('paged', get_query_var('paged') ?: 1);
    }
});

Quando invece il widget sta in una pagina statica e la paginazione numerica ti rimanda sempre alla home, il problema è diverso: WordPress considera l’indirizzo della seconda pagina un errore 404, perché una pagina statica non ha, di norma, sotto-pagine. Il filtro pre_handle_404 evita il reindirizzamento indesiderato:

add_filter('pre_handle_404', function($preempt, $wp_query) {
    return isset($wp_query->query['page']) && $wp_query->query['page'] ? true : $preempt;
}, 10, 2);

Questo filtro disattiva il controllo del 404 per qualunque richiesta con un parametro page, non solo per il tuo widget: se usi anche la paginazione nativa di WordPress dentro gli articoli (il tag <!--nextpage-->), verifica che il comportamento resti quello atteso prima di lasciarlo in produzione.

Perché il carosello duplica le slide?

Nel Loop Carousel la duplicazione visibile ha quasi sempre una causa diversa: Swiper.js, la libreria che gestisce lo scorrimento, clona le slide agli estremi per simulare il ciclo infinito. Se imposti “Slides Per View” a 3 ma la query carica solo 4 post, non ha materiale sufficiente e duplica le ultime slide per riempire lo spazio.

La regola pratica è semplice: il numero di post caricati deve essere almeno il doppio delle slide visibili sulla risoluzione più larga, altrimenti conviene disattivare “Infinite Loop” nelle impostazioni.

Attenzione: “Evita duplicati”, nel pannello Query, non risolve nessuno dei problemi visti sopra. Coordina solo widget diversi sulla stessa pagina che mostrano gli stessi contenuti, non le richieste successive dello stesso widget in paginazione, ed è del tutto inattivo durante le chiamate asincrone: ogni richiesta parte da una sessione server nuova, senza memoria della precedente.

Una causa in più, meno frequente: la cache. Se il widget usa il caricamento asincrono e il tuo plugin di caching, WP Rocket o LiteSpeed Cache, memorizza anche le risposte del file admin-ajax.php, ogni scroll restituirà lo stesso frammento HTML salvato alla prima chiamata. Escludi quel file dalla cache, e disattiva anche l’”Element Caching” di Elementor sui widget con contenuti dinamici.

Dopo questi controlli, se il bug resta, il sospetto si sposta su un’incompatibilità specifica con un plugin di filtri come JetSmartFilters o FacetWP, e in quel caso conviene disattivare la paginazione nativa di Elementor e usare il widget di paginazione del plugin di filtri stesso.

Conclusione

Nella maggior parte dei casi la causa è una sola, ed è la prima che hai visto: un ordinamento secondario stabile sull’ID del post. Le altre quattro coprono il resto (bug di Elementor, paginazione che si resetta, carosello mal dimensionato, cache troppo aggressiva), e vanno controllate in ordine prima di sospettare qualcosa di più complesso.

Se vuoi che controlli direttamente la tua configurazione, dall’identificativo della query agli hook attivi fino ai plugin installati, scrivimi e guardiamo insieme cosa sta succedendo sul tuo sito, passo dopo passo.

Leggi anche…

Contattami

Non perdere tempo prezioso, contattami oggi stesso per discutere delle tue esigenze e richiedere un preventivo.