paginate_links() nu funcționează corect în search.php?
Folosesc acest cod în șablonul meu search.php ...
<div class="pagination">
<?php echo get_pagination_links(); ?>
</div>
Și aceasta este funcția ...
function get_pagination_links() {
global $wp_query;
$big = 999999999;
return paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages,
'prev_next' => false
) );
}
-
Rezultatul funcționează: Deci dacă caut "test" și sunt mai mult de 10 rezultate iar paginarea arată 1 2
unde 2
este un link. Când dau click pe pagina 2
bara de adrese se actualizează corect la mysite.com/search/test/page/2
dar pagina rezultată este tot numărul 1
.
Sunt încă aceleași rezultate ca pe pagina numărul 1
și linkurile de paginare sunt încă aceleași - 2
este încă link și 1
este pagina curentă.
Aveți idei de ce s-ar putea întâmpla asta?
Actualizare
Aici este locul unde funcția personalizată este apelată în șablon:
<?php
/**
* Șablonul pentru afișarea paginilor cu Rezultatele Căutării
*/
get_header(); ?>
<?php if ( have_posts() ) : ?>
<hgroup class="section-heading wrapper">
<h1>Rezultate</h1>
</hgroup>
<section id="results">
<?php while ( have_posts() ) : the_post(); ?>
<ul class="event-items">
<?php get_template_part( 'inc/search', 'result' ); ?>
</ul>
<?php endwhile; ?>
</section>
<div class="pagination tiny wrapper">
<?php echo get_pagination_links(); ?>
</div>
<?php else : ?>
<div class="wrapper">
<h2>Nu s-a găsit nimic</h2>
</div>
<?php endif; ?>
<?php get_footer(); ?>
Editare
Folosind codul recomandat din răspunsul de mai jos:
/**
* Linkuri de paginare pentru căutare și arhive
*/
function get_pagination_links() {
global $wp_query;
$wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;
$big = 999999999;
return paginate_links( array(
'base' => @add_query_arg('paged','%#%'),
'format' => '?paged=%#%',
'current' => $current,
'total' => $wp_query->max_num_pages,
'prev_next' => false
) );
}
Paginarea funcționează acum, totuși "permalinkurile" nu sunt exact ce vreau să fie. Folosesc custom_pagination_base()
pentru a avea această structură de permalink:
mypage.com/search/term/seite/2
(unde seite este cuvântul german pentru pagină).
Este posibil să păstrăm permalinkurile să funcționeze așa. Paginarea funcționează cu codul tău, doar că permalinkurile arată așa:
mypage.com/search/term?paged=2

Sunt destul de sigur că acest lucru a fost răspuns în altă parte, dar voi adăuga din nou aici.
Cred că problema ta stă aici:
'current' => max( 1, get_query_var('paged') ),
Încearcă în schimb:
global $wp_query;
$wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;
...apoi:
'current' => $current;
Parametrul tău 'base'
poate fi de asemenea o problemă. În loc de:
$big = 999999999;
//...
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) )
Eu folosesc:
'base' => @add_query_arg('paged','%#%')
Editare
În caz că te ajută, iată întreaga mea funcție wrapper pentru paginate_links()
:
/**
* Funcție pentru generarea linkurilor de paginare în arhive
*/
function oenology_get_paginate_archive_page_links( $type = 'plain', $endsize = 1, $midsize = 1 ) {
global $wp_query, $wp_rewrite;
$current = get_query_var( 'paged' ) > 1 ? get_query_var('paged') : 1;
// Validare valori argumente
if ( ! in_array( $type, array( 'plain', 'list', 'array' ) ) ) $type = 'plain';
$endsize = absint( $endsize );
$midsize = absint( $midsize );
// Configurare array argumente pentru paginate_links()
$pagination = array(
'base' => @add_query_arg( 'paged', '%#%' ),
'format' => '',
'total' => $wp_query->max_num_pages,
'current' => $current,
'show_all' => false,
'end_size' => $endsize,
'mid_size' => $midsize,
'type' => $type,
'prev_text' => '<<',
'next_text' => '>>'
);
if ( $wp_rewrite->using_permalinks() )
$pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ).'page/%#%/', 'paged' );
if ( ! empty( $wp_query->query_vars['s'] ) )
$pagination['add_args'] = array( 's' => get_query_var( 's' ) );
return paginate_links( $pagination );
}

Mulțumesc domnule. Perfect, dar încă un ultim mic detaliu. Am actualizat întrebarea mea mai sus cu codul tău. Paginarea funcționează acum, dar "permalinks" nu sunt exact cum aș vrea să fie. Folosesc custom_pagination_base()
pentru a avea această structură de permalink mypage.com/search/term/seite/2
unde seite
este cuvântul german pentru pagină. Este posibil să păstrez permalink-urile funcționând în acest fel. Paginarea funcționează cu codul tău, doar că permalink-urile arată astfel: mypage.com/search/term?paged=2

Vezi răspunsul actualizat. Am adăugat întreaga mea funcție. Și: fii atent cum editezi întrebarea ta. Dacă suprascrii codul original, este dificil pentru cititorii ulteriori să urmărească fluxul întrebare-răspuns. De obicei este mai bine să păstrezi codul original și apoi să adaugi cod nou la întrebare. Am să editez întrebarea ta ca să-ți dau o idee despre ce vreau să spun.

Pentru a răspunde la întrebarea ta specifică ulterioară, referă-te la ternarul $pagination['base']
aproape de sfârșitul funcției. Cred că ar trebui să poți adapta acea linie pentru a se potrivi nevoilor tale.

Mulțumesc, dar se pare că am o altă problemă. Când folosesc codul tău, paginarea nu funcționează din nou - exact același comportament ca în întrebarea mea de mai sus. Linkul pe care dau click nu actualizează vizualizarea și paginarea nu funcționează. Dacă decomentez ultimele două blocuri if
din funcția ta (liniile care țin de permalinkuri), funcția ta funcționează din nou perfect. Deci totul funcționează bine, exceptând partea cu rescrierea ?paged
în URL-ul în sine. Mai ai alte idei de unde ar putea veni asta? Mulțumesc din nou pentru ajutorul tău minunat până acum.

Bănuiesc că problema este regulile tale personalizate de rescriere. Aceasta este partea din funcția mea pe care ai modificat-o...

Deși aceasta nu este o soluție care folosește codul exact pe care l-ai menționat, poți încerca să utilizezi această tehnică de paginare în loc de exemplul pe care l-ai folosit din WordPress Codex.
Presupun că problema se află în obținerea părții de template cu această linie de cod:
<?php get_template_part( 'inc/search', 'result' ); ?>
Dacă aceasta nu rezolvă problema, aș sugera să extragi conținutul din 'inc/search' și să îl incluzi în pagina de rezultate a căutării fără a folosi <?php get_template_part(); ?>
- asta te-ar putea ajuta să identifici orice anomalii.
