Problema con WP_Query personalizzato non funzionante
OK,
Ho creato una WP_Query personalizzata che recupera il post_type post
e lo visualizza come una lista stilizzata. Funziona bene e mostra la lista stilizzata, ma sotto visualizza nuovamente tutti i post in un formato completamente diverso (senza stile).
<?php
// ottieni tutti i tipi di post
$args = array (
'post_type' => 'post',
'post_status' => 'publish',
'pagination' => true,
'paged' => (get_query_var('paged') ? get_query_var('paged') : 1),
'posts_per_page' => 20,
'order' => 'ASC',
'orderby' => 'date',
); ?>
<?php $wp_query = new WP_Query($args); ?>
<?php if ($wp_query->have_posts()): ?>
<?php while($wp_query->have_posts()): $wp_query->the_post() ?>
<div class="row">
<div class="col-md-5">
<a href="<?php the_permalink() ?>" class="fancybox">
<?php the_post_thumbnail('medium'); ?>
</a>
</div>
<div class="col-md-7">
<!-- titolo e estratto -->
<h5><?php the_title() ?></h5>
<?php the_excerpt() ?>
<!-- pulsanti del post -->
<a href="<?php the_permalink() ?>" class="btn btn-primary">Visualizza storia completa</a>
<?php if(get_field('comments_enable') !== false): ?>
<a href="<?php the_permalink() ?>#disqus_thread" class="btn btn-default"> Commenti</a>
<?php endif; ?>
</div>
</div>
<hr style="margin: 10px 0; border-style: dotted; border-color: #333" class="row">
<?php endwhile; ?>
<!-- riga -->
<div class="row">
<div class="col-xs-6">
<?php previous_posts_link('<i class="fa fa-arrow-left"></i> <span class="text">Pagina precedente</span>'); ?>
</div>
<div class="col-xs-6 text-right">
<?php next_posts_link('<span class="text">Pagina successiva</span> <i class="fa fa-arrow-right"></i>'); ?>
</div>
</div>
<?php else: ?>
<p class="text-muted">Nessuna notizia al momento, torna a controllare più tardi.</p>
<?php endif; unset($wp_query); wp_reset_postdata(); ?>
Questo codice si trova in un template parziale e viene chiamato usando il metodo get_template_part()
. Se assegno la WP_Query a una variabile diversa da $wp_query
non raddoppia l'output, ma ho bisogno che sia $wp_query
per far funzionare i link di paginazione. Sto anche annullando l'impostazione di $wp_query
e ripristinando i dati del post alla fine del ciclo. Sono perplesso e spero che tu possa aiutarmi!

Usa wp_reset_query()
per ripristinare la query originale. Questa funzione chiama anche wp_reset_postdata
, quindi puoi semplicemente sostituirla.

Questa è una preferenza personale, ma non mi piace molto usare $wp_query
e complicare le cose. Ci sono due modi per risolvere questo problema, uno, usando una variabile temporanea con $wp_query
e due, cambiando il nome della tua variabile e sistemando la paginazione, che è quello che consiglierei, ripeto, è una preferenza personale.
METODO 1
Come ho detto, puoi assegnare una variabile temporanea a $wp_query
e poi annullarla
<?php
// ottieni tutti i tipi di post
$args = array (
'post_type' => 'post',
'post_status' => 'publish',
'pagination' => true,
'paged' => (get_query_var('paged') ? get_query_var('paged') : 1),
'posts_per_page' => 20,
'order' => 'ASC',
'orderby' => 'date',
);
$temp = $wp_query;
$wp_query = null;
$wp_query = new WP_Query();
$wp_query->query( $args );
<--- IL TUO LOOP ETC--->
$wp_query = null;
$wp_query = $temp; // Reset
METODO 2
Questo è il metodo che preferisco. Dai alla tua variabile un nome univoco, ad esempio $my_query
e correggi la paginazione in next_posts_link
. Ecco come apparirà ora la tua query personalizzata. (Nota Non è necessario abusare del tag php. Se non stai passando da php a html e viceversa, non devi aprire e chiudere i tag php per ogni elemento come hai fatto. Controlla il mio codice qui sotto)
<?php
// ottieni tutti i tipi di post
$args = array (
'post_type' => 'post',
'post_status' => 'publish',
'pagination' => true,
'paged' => (get_query_var('paged') ? get_query_var('paged') : 1),
'posts_per_page' => 20,
'order' => 'ASC',
'orderby' => 'date',
);
$my_query = new WP_Query($args);
if ($my_query->have_posts()):
while($my_query->have_posts()): $my_query->the_post() ?>
<---IL TUO LOOP ETC--->
OK, questo crea problemi con la paginazione. Per risolverlo, devi impostare il parametro $max_pages
in next_posts_link
, quindi il tuo next_posts_link
apparirà così
<?php previous_posts_link('<i class="fa fa-arrow-left"></i> <span class="text">Pagina precedente</span>', $my_query->max_num_pages); ?>
Questo risolverà il tuo problema di paginazione

Grazie per aver fornito una risposta chiara e concisa. Sono d'accordo che $wp_query
non sia l'ideale da utilizzare in quanto aggiunge complicazioni alla questione. Grazie per il tuo aiuto!
