Problema con WP_Query personalizzato non funzionante

10 lug 2014, 20:40:26
Visualizzazioni: 15.3K
Voti: 0

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!

2
Commenti

Cosa succede se metti wp_reset_postdata(); prima del else: e rimuovi unset($wp_query);

Brad Dalton Brad Dalton
10 lug 2014 20:54:06

@BradDalton grazie per il suggerimento ma è sempre lo stesso. Inoltre in quel modo il postdata non verrà resettato se non ci sono post - anche se non sono sicuro se funzionalmente sia un problema o meno.

Chris Chris
10 lug 2014 21:33:16
Tutte le risposte alla domanda 2
1

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

10 lug 2014 22:25:04
Commenti

Questo ha funzionato per me, dopo aver esaminato il file wp-includes/query.php ho visto che essenzialmente utilizza la tecnica di @pieter-goosen ripristinando la query originale. Grazie per l'aiuto!

Chris Chris
11 lug 2014 11:25:15
2

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

10 lug 2014 23:18:10
Commenti

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!

Chris Chris
11 lug 2014 11:27:48

È stato un piacere, sono contento che tra me e le risposte di @Milo tu abbia risolto il tuo problema. Buon lavoro :-)

Pieter Goosen Pieter Goosen
11 lug 2014 11:35:19