WP_Query personalizat nu funcționează corect
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!

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.

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

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!
