paginate_links() nu funcționează corect în search.php?

1 sept. 2012, 20:54:46
Vizualizări: 20.5K
Voturi: 6

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
4
Comentarii

Afișează interogarea pentru această solicitare.

kaiser kaiser
1 sept. 2012 21:14:28

Am actualizat întrebarea mea cu șablonul meu search.php. Nu există nicio buclă în interiorul search-result.php, doar HTML simplu.

mathiregister mathiregister
1 sept. 2012 21:27:28

Ai parcurs întrebările anterioare legate de paginate_links()?

Chip Bennett Chip Bennett
1 sept. 2012 21:33:38

Am citit și am căutat pe Google destul de mult, dar nu reușesc să găsesc o soluție. Aveți idei?

mathiregister mathiregister
1 sept. 2012 21:47:34
Toate răspunsurile la întrebare 2
6
11

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' => '&lt;&lt;',
        'next_text' => '&gt;&gt;'
    );

    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 );
}
2 sept. 2012 00:34:18
Comentarii

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

mathiregister mathiregister
2 sept. 2012 09:59:33

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.

Chip Bennett Chip Bennett
2 sept. 2012 17:08:25

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.

Chip Bennett Chip Bennett
2 sept. 2012 17:16:27

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.

mathiregister mathiregister
2 sept. 2012 17:55:09

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

Chip Bennett Chip Bennett
3 sept. 2012 21:23:14

Tocmai am încercat asta și get_query_var('paged') singur funcționează bine. Nu este nevoie să-l extragi din global.

kaiser kaiser
25 sept. 2012 04:55:34
Arată celelalte 1 comentarii
1

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.

1 sept. 2012 22:36:43
Comentarii

Mulțumesc pentru răspuns. Nu este vorba despre get_template_part() pentru că am încercat să inserez codul șablonului direct în buclă. Și tehnica de paginare pe care ai postat-o în comentariu nu face nicio diferență - același efect.

mathiregister mathiregister
1 sept. 2012 22:50:13