Nu funcționează paginate_links cu o interogare personalizată
Am creat o secțiune de știri în site-ul meu WordPress folosind plugin-urile Advanced Custom Fields și Custom Post Type UI. Pe pagina personalizată de prezentare a știrilor (nu postările standard WordPress) am vrut să limitez numărul de știri la șase pe pagină și să ofer o navigare cu paginate_links. Am construit următorul fragment de cod:
<section class="news-main" role="main">
<?php
$args = array(
'post_type' => 'news',
'posts_per_page' => '6'
);
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$pagination = array(
'base' => '%_%',
'format' => '?page=%#%',
'total' => $the_query->max_num_pages,
'prev_next' => True,
'prev_text' => __( '<< Anterior' ),
'next_text' => __( 'Următor >>' )
);
if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<article class="news-snippet">
<header class="news-box">
<h2 class="mus-hi slogan-head fancy"><span class="fancy-hook"><?php the_time( 'j. F Y' ); ?></span></h2>
<a href="<?php the_permalink(); ?>"><p class="bran-hn slogan-state closure"><?php the_title(); ?></p></a>
</header>
<div class="news-wrap">
<p class="news-excerpt"><?php echo acf_excerpt( 'news_post', 35, ' <span class="news-more-inbox">[...]</span>' ); ?></p>
<p class="bran-hn news-more"><a href="<?php the_permalink(); ?>">Mai mult →</a></p>
</div>
</article>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else: ?>
<p>Nu există înregistrări</p>
<?php endif; ?>
<nav>
<?php echo paginate_links( $pagination );
$wp_query = NULL;
$wp_query = $temp_query; ?>
</nav>
</section>
Mai întâi sunt definite argumentele pentru wp_query, apoi se setează $the_query
cu un WP_Query, după care variabila $wp_query
este salvată într-o variabilă temporară, resetată cu NULL și apoi setată la variabila $the_query
. În ultimul pas este setat array-ul de setări pentru paginate_links
. Apoi urmează bucla pentru afișarea postărilor de știri. După buclă este apelată funcția paginate_links și în final $wp_query
este resetat și i se atribuie înapoi conținutul variabilei temporare $temp_query
.
Dacă am să zicem 15 postări de blog, rezultatul meu arată astfel:
Dacă trec cu mouse-ul peste numărul trei, sfârșitul slug-ului arată astfel:
Problema este că link-urile pentru anterior și următor nu sunt afișate deși sunt setate. În timp ce problema principală este slug-ul dat - dacă dau click pe numărul trei ajung pe o pagină 404. "page 3" unde sunt redirecționat este necunoscut pentru WordPress. Mulțumesc anticipat Ralf
Actualizare:
$args = array(
'post_type' => 'news',
'posts_per_page' => '1'
);
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$current_page = new WP_Query('post_type=news&posts_per_page=1&paged=' . $paged);
$pagination = array(
'base' => '%_%',
'format' => '?paged=%#%',
'mid-size' => 1,
'current' => $current_page,
'total' => $total_pages,
'prev_next' => True,
'prev_text' => __( '<< Anterior' ),
'next_text' => __( 'Următor >>' )
);
}
Actualizare 2:
Ok, cu următoarele modificări la prima parte a codului am reușit să fac navigarea să funcționeze
$args = array(
'post_type' => 'news',
'posts_per_page' => '3',
'paged' => get_query_var( 'paged' )
);
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
$the_paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$pagination = array(
'base' => @add_query_arg('paged','%#%'),
'format' => '?paged=%#%',
'mid-size' => 1,
'current' => $the_paged,
'total' => $total_pages,
'prev_next' => True,
'prev_text' => __( '<< Anterior' ),
'next_text' => __( 'Următor >>' )
);
}
Singura întrebare care mi-a rămas (singurul lucru care încă nu funcționează corect) este dacă este posibil ca primul link să aibă link în loc de link/?paged=1
În ceea ce privește numărul de pagini afișate, consultă argumentele pentru paginate_links
, în special end_size
și mid_size
.
Referitor la eroarea 404 - Problema este că nu există pagina 3. Indiferent dacă o pagină returnează conținut sau încarcă șablonul 404, aceasta se bazează pe rezultatele interogării principale, nu pe interogarea personalizată pe care o rulezi în șablon. Dacă acesta este un tip de postare page
, încearcă să setezi variabila de interogare paged
în loc de page
.

Mulțumesc, da, numerotarea funcționează bine acum, a fost nevoie de unele ajustări în setări, precum și pentru linkurile anterioare și următoare. Deci, practic, paginarea arată bine, dar nu funcționează deloc. Dacă acum dau clic pe doi, ajung la ?paged=2 și nu mai apare șablonul 404. Dar, pe de altă parte, încă sunt afișate articolele de pe pagina inițială, iar numărul unu rămâne cu clasa current în loc de paged 2 pe care mă aflu. De asemenea, linkul Previous nu apare.

Și despre suspiciunea ta că totul se bazează pe interogarea principală în loc de interogarea personalizată pe care o rulez - am crezut că cu $wp_query = $the_query;
am "transferat" interogarea mea personalizată la interogarea principală și am făcut-o accesibilă funcției paginate_links.

Am adăugat o actualizare la postarea inițială cu un fragment de cod actualizat pentru părțile PHP legate de paginate_links (am încercat să includ paged - dar încă nu funcționează :/ ).

faptul dacă se întoarce sau nu o eroare 404 are loc înainte de încărcarea template-ului tău, deci acel cod nu rulează niciodată dacă variabilele de interogare nu sunt corecte. Și vezi primele 6 postări pe fiecare pagină pentru că nu ai setat paged
în argumentele tale personalizate ale interogării.

ahhhhhhhhhhhh înțeleg. Am fost puțin lent - să folosesc paged
deja în interogarea personalizată nu am înțeles și realizat, dar are perfect sens. Prostul de mine :( Ok, afișarea articolelor funcționează acum perfect. Singurul lucru care mai rămâne de rezolvat este ca navigația paginate_links
să reflecte modificările. Dar va trebui să mă joc și să încerc mâine dimineață. Acum este deja târziu. Mulțumesc!
