WP_Query personalizat nu funcționează corect

10 iul. 2014, 20:40:26
Vizualizări: 15.3K
Voturi: 0

OK,

Am creat un WP_Query personalizat care preia post_type post și le afișează ca o listă stilizată. Funcționează bine și afișează lista stilizată, dar apoi sub aceasta afișează toate postările din nou într-un format complet diferit (nestilizat).

<?php

// obține toate tipurile de postări
$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">

                <!-- titlu și rezumat -->
                <h5><?php the_title() ?></h5>
                <?php the_excerpt() ?>

                <!-- butoane post -->
                <a href="<?php the_permalink() ?>" class="btn btn-primary">Vezi întreaga știre</a>
                <?php if(get_field('comments_enable') !== false): ?>
                    <a href="<?php the_permalink() ?>#disqus_thread" class="btn btn-default"> Comentarii</a>
                <?php endif; ?>

            </div>
        </div>

        <hr style="margin: 10px 0; border-style: dotted; border-color: #333" class="row">

    <?php endwhile; ?>

    <!-- rând -->
    <div class="row">
        <div class="col-xs-6">
            <?php previous_posts_link('<i class="fa fa-arrow-left"></i> <span class="text">Pagina anterioară</span>'); ?>
        </div>
        <div class="col-xs-6 text-right">
            <?php next_posts_link('<span class="text">Pagina următoare</span> <i class="fa fa-arrow-right"></i>'); ?>
        </div>

    </div>

<?php else: ?>

    <p class="text-muted">Momentan nu există știri, reveniți mai târziu.</p>

<?php endif; unset($wp_query); wp_reset_postdata(); ?>

Acest cod se află într-un fragment de șablon și este apelat folosind metoda get_template_part(). Dacă atribui WP_Query unei alte variabile în loc de $wp_query, nu se mai dublează postările, dar am nevoie să fie $wp_query pentru ca linkurile de paginare să funcționeze. De asemenea, folosesc unset($wp_query) și resetez datele postării la sfârșitul loop-ului. Sunt nedumerit și sper că mă puteți ajuta!

2
Comentarii

Ce se întâmplă dacă pui wp_reset_postdata(); înainte de else: și elimini unset($wp_query);

Brad Dalton Brad Dalton
10 iul. 2014 20:54:06

@BradDalton mulțumesc pentru sugestie, dar tot la fel se întâmplă. În plus, în felul acesta postdata nu va fi resetată dacă nu există postări - deși nu sunt sigur dacă din punct de vedere funcțional asta reprezintă o problemă sau nu.

Chris Chris
10 iul. 2014 21:33:16
Toate răspunsurile la întrebare 2
1

Folosește wp_reset_query() pentru a restaura interogarea originală. Această funcție apelează și wp_reset_postdata, așa că o poți înlocui direct cu ea.

10 iul. 2014 22:25:04
Comentarii

Asta a funcționat pentru mine, după ce am analizat fișierul wp-includes/query.php am văzut că practic folosește tehnica lui @pieter-goosen prin restaurarea interogării originale. Mulțumesc pentru ajutor!

Chris Chris
11 iul. 2014 11:25:15
2

Aceasta este o preferință personală, dar nu-mi place foarte mult să folosesc $wp_query și să complic lucrurile. Există două metode de a rezolva această problemă, una este folosirea unei variabile temporare cu $wp_query, iar cealaltă este schimbarea numelui variabilei tale și corectarea paginării, pe care aș recomanda-o, din nou, este o preferință personală.

METODA 1

Așa cum am spus, poți atribui o variabilă temporară pentru $wp_query și să o anulezi de asemenea

<?php

// obține toate tipurile de postări
$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 );

<--- BUCLA TA ETC--->

$wp_query = null; 
  $wp_query = $temp;  // Resetare

METODA 2

Aceasta este metoda pe care o prefer. Dă-i variabilei tale un nume unic, de exemplu, $my_query și corectează paginarea în next_posts_link. Acesta este modul în care va arăta acum interogarea ta personalizată. (Notă Nu este nevoie să abuzezi de tag-ul php. Dacă nu comuti de la php la html și invers, nu trebuie să deschizi și să închizi tag-uri php pentru fiecare element, așa cum ai făcut. Vezi codul meu mai jos)

<?php

// obține toate tipurile de postări
$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() ?>

<---BUCLA TA ETC--->

OK, acest lucru afectează paginarea. Pentru a remedia aceasta, trebuie să setezi parametrul $max_pages în next_posts_link, așa că next_posts_link va arăta cam așa

<?php previous_posts_link('<i class="fa fa-arrow-left"></i> <span class="text">Pagina anterioară</span>', $my_query->max_num_pages); ?>

Aceasta va rezolva problema ta cu paginarea

10 iul. 2014 23:18:10
Comentarii

Mulțumesc pentru răspunsul clar și concis. Sunt de acord că $wp_query nu este ideal de utilizat, deoarece complică lucrurile. Mulțumesc pentru ajutor!

Chris Chris
11 iul. 2014 11:27:48

Cu plăcere, mă bucur că între mine și @Milo am reușit să rezolvăm problema ta. Distracție plăcută :-)

Pieter Goosen Pieter Goosen
11 iul. 2014 11:35:19