Paginarea nu funcționează

28 apr. 2015, 00:39:14
Vizualizări: 25.6K
Voturi: 2

Am folosit aceeași interogare pentru paginare pentru majoritatea site-urilor pe care le-am creat. De această dată nu funcționează din anumite motive. Am folosit linkurile de depanare pentru paginare Aici dar nimic nu pare să funcționeze. Am atașat codul meu mai jos.

De această dată fac interogarea postărilor într-un tabel, așa că cred că ar putea avea legătură cu asta, dar am încercat și fără tabel și tot nu funcționează. Vă rog să vedeți codul meu mai jos.

Noua interogare

<?php
$args = array(
    'post_type' => 'custom_post_type',
    'posts_per_page' => 5,
    'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1),
);
query_posts($args);
?>

Tabelul cu datele mele din câmpurile meta personalizate.

<table>
    <thead>
        <tr>
            <th>antet</th>
            <th>antet</th>
            <th>antet</th>
            <th>antet</th>
        </tr>
    </thead>
    <tbody>
        <?php while (have_posts()) : the_post();?>
            <tr>
                <td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
                <td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
                <td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>    
                <td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>    
            </tr>
        <?php
        endwhile;
        ?>
    </tbody>
</table>

Linkurile mele de paginare

<?php
global $wp_query;

$big = 999999999; // avem nevoie de un număr întreg improbabil

echo paginate_links( array(
    'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    'format' => '?paged=%#%',
    'prev_text'          => __('Anterior'),
    'next_text'          => __('Următor'),
    'current' => max( 1, get_query_var('paged') ),
    'total' => $wp_query->max_num_pages
) );
?>

Când spun că nu funcționează, mă refer la faptul că linkurile de paginare sunt afișate cu numărul corespunzător de pagini, dar când apăs pe pagina doi nu se schimbă paginile. Permalinkurile sunt corecte, spune domeniu/pagina/2 dar pagina este aceeași ca pagina unu. Aceasta este pe o pagină template pe care am creat-o pentru home-page.php. Apreciez sugestiile.

5
Comentarii

descrie ce înțelegi prin nu funcționează, ce se întâmplă? pe ce tip de pagină este aceasta?

Milo Milo
28 apr. 2015 01:49:05

Salut @Milo Mulțumesc pentru răspuns, când spun că nu funcționează, mă refer că linkurile de paginare sunt afișate cu numărul corect de pagini. dar când apăs pe pagina doi, nu se schimbă paginile. permalinkurile sunt corecte, scrie domain/page/2 dar pagina este aceeași cu pagina unu. Aceasta este pe o pagină de șablon pe care am creat-o pentru home-page.php Apreciez ajutorul.

steamfunk steamfunk
28 apr. 2015 02:49:07

Nu folosi query_posts, strică paginarea și interogarea principală

Pieter Goosen Pieter Goosen
28 apr. 2015 07:59:24

De asemenea, rețineți, comentariul dumneavoastră ar trebui să fie o [editare] a întrebării dumneavoastră. Mulți alții sar peste și ignoră comentariile și vor sări peste și vor ignora întrebarea dumneavoastră ca fiind nu funcționează, de asemenea nu are prea mult sens pentru ei

Pieter Goosen Pieter Goosen
28 apr. 2015 08:55:18

@PieterGoosen vă mulțumesc din nou, voi ține cont de asta!

steamfunk steamfunk
28 apr. 2015 09:25:40
Toate răspunsurile la întrebare 2
2

După cum am menționat deja în comentarii, nu ar trebui să folosești niciodată query_posts, folosește query_posts doar dacă intenționezi să strici funcționalitățile paginii tale. Adaugă query_posts în vârful listei tale de LUCRURI RELE.

query_posts distruge obiectul principal al interogării, exact obiectul pe care se bazează funcția ta de paginare. Funcția ta de paginare se bazează pe proprietatea $max_num_pages din interogarea principală. Acesta este doar unul dintre multele lucruri pe care query_posts le strică.

Pentru a rezolva problema ta, folosește WP_Query deoarece se pare că folosești un șablon de pagină personalizat aici. Doar o notă, dacă home-page.php este o pagină frontală statică, ceea ce bănuiesc din numele șablonului, atunci

'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1),

ar trebui să fie

'paged' => ( get_query_var('page') ? get_query_var('page') : 1),

deoarece paginile frontale statice folosesc page și nu paged

Poți încerca ceva de genul acesta: (Foarte important, acest lucru nu a fost testat și este copiat și lipit din OP, și întotdeauna amintește să resetezi postdata odată ce ai terminat cu interogarea ta personalizată)

<?php
$args = array(
    'post_type' => 'custom_post_type',
    'posts_per_page' => 5,
    'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1),
);
$query = new WP_Query($args);
?>
<table>
    <thead >
        <tr>

            <th>antet</th>
            <th>antet</th>
            <th>antet</th>
            <th>antet</th>

        </tr>
    </thead>
    <tbody>

        <?php  while ($query->have_posts()) : $query->the_post();?>
            <tr>

                <td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
                <td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
                <td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>    
                <td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>    

            </tr>
        <?php
        endwhile;
        wp_reset_postdata();
        ?>

    </tbody>
</table>

Apoi, trebuie doar să actualizezi funcția ta de paginare cu proprietatea $max_num_pages din interogarea ta personalizată

<?php
$big = 999999999; // un număr improbabil

echo paginate_links( array(
    'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    'format' => '?paged=%#%',
    'prev_text'          => __(' Anterior'),
    'next_text'          => __('Următor '),
    'current' => max( 1, get_query_var('paged') ),
    'total' => $query->max_num_pages
) );
?>
28 apr. 2015 20:21:05
Comentarii

Uimitor, mulțumesc, apreciez foarte mult. Nu știam asta înainte.

steamfunk steamfunk
29 apr. 2015 00:39:36

s-a schimbat recent? În 2018 parametrul "paged" funcționa, dar a încetat să mai funcționeze recent (2020). Am schimbat în "page" și acum funcționează

thebigtine thebigtine
22 feb. 2021 18:30:30
0

Foloseam o interogare personalizată și aveam nevoie să paginez rezultatele interogării mele. Deoarece funcția originală paginate_links() este puternic legată de contexte globale $wp_query și $wp_rewrite, am adaptat-o să fie complet independentă. utilizare:

function myPaginateLinks( WP_Query $wp_query, $args = '' ) {
    global $wp_rewrite;

    // Setarea valorilor implicite bazate pe URL-ul curent.
    $pagenum_link = html_entity_decode( get_pagenum_link() );
    $url_parts    = explode( '?', $pagenum_link );

    // Obține numărul maxim de pagini și pagina curentă din interogarea curentă, dacă este disponibil.
    $total   = isset( $wp_query->max_num_pages ) ? $wp_query->max_num_pages : 1;
    $current = !empty($_GET['pg']) ? absint($_GET['pg']) : 1;

    // Adaugă substituentul de format la URL-ul de bază.
    $pagenum_link = trailingslashit( $url_parts[0] ) . '%_%';

    // Baza URL-ului depinde de setările permalinkurilor.
    $format  = $wp_rewrite->using_index_permalinks() && ! strpos( $pagenum_link, 'index.php' ) ? 'index.php/' : '';
    $format .= '?pg=%#%';

    $defaults = array(
        'base'               => $pagenum_link, // http://example.com/all_posts.php%_% : %_% este înlocuit cu formatul (mai jos).
        'format'             => $format, // ?page=%#% : %#% este înlocuit cu numărul paginii.
        'total'              => $total,
        'current'            => $current,
        'aria_current'       => 'page',
        'show_all'           => false,
        'prev_next'          => true,
        'prev_text'          => __( '&laquo; Anterior' ),
        'next_text'          => __( 'Următor &raquo;' ),
        'end_size'           => 1,
        'mid_size'           => 2,
        'type'               => 'plain',
        'add_args'           => array(), // Array de argumente de interogare de adăugat.
        'add_fragment'       => '',
        'before_page_number' => '',
        'after_page_number'  => '',
    );

    $args = wp_parse_args( $args, $defaults );

    if ( ! is_array( $args['add_args'] ) {
        $args['add_args'] = array();
    }

    // Combină variabilele suplimentare de interogare găsite în URL-ul original în array-ul 'add_args'.
    if ( isset( $url_parts[1] ) ) {
        // Găsește argumentul de format.
        $format       = explode( '?', str_replace( '%_%', $args['format'], $args['base'] ) );
        $format_query = isset( $format[1] ) ? $format[1] : '';
        wp_parse_str( $format_query, $format_args );

        // Găsește argumentele de interogare ale URL-ului solicitat.
        wp_parse_str( $url_parts[1], $url_query_args );

        // Elimină argumentul de format din array-ul de argumente de interogare, pentru a evita suprascrierea formatului personalizat.
        foreach ( $format_args as $format_arg => $format_arg_value ) {
            unset( $url_query_args[ $format_arg ] );
        }

        $args['add_args'] = array_merge( $args['add_args'], urlencode_deep( $url_query_args ) );
    }

    // Cine știe ce mai transmit oamenii în $args.
    $total = (int) $args['total'];
    if ( $total < 2 ) {
        return;
    }
    $current  = (int) $args['current'];
    $end_size = (int) $args['end_size']; // Depășește limitele? Fă-l implicit.
    if ( $end_size < 1 ) {
        $end_size = 1;
    }
    $mid_size = (int) $args['mid_size'];
    if ( $mid_size < 0 ) {
        $mid_size = 2;
    }

    $add_args   = $args['add_args'];
    $r          = '';
    $page_links = array();
    $dots       = false;

    if ( $args['prev_next'] && $current && 1 < $current ) :
        $link = str_replace( '%_%', 2 == $current ? '' : $args['format'], $args['base'] );
        $link = str_replace( '%#%', $current - 1, $link );
        if ( $add_args ) {
            $link = add_query_arg( $add_args, $link );
        }
        $link .= $args['add_fragment'];

        $page_links[] = sprintf(
            '<a class="prev page-numbers" href="%s">%s</a>',
            /**
             * Filtrează legăturile paginate pentru paginile de arhivă date.
             *
             * @since 3.0.0
             *
             * @param string $link URL-ul legăturii paginate.
             */
            esc_url( apply_filters( 'paginate_links', $link ) ),
            $args['prev_text']
        );
    endif;

    for ( $n = 1; $n <= $total; $n++ ) :
        if ( $n == $current ) :
            $page_links[] = sprintf(
                '<span aria-current="%s" class="page-numbers current">%s</span>',
                esc_attr( $args['aria_current'] ),
                $args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number']
            );

            $dots = true;
        else :
            if ( $args['show_all'] || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) :
                $link = str_replace( '%_%', 1 == $n ? '' : $args['format'], $args['base'] );
                $link = str_replace( '%#%', $n, $link );
                if ( $add_args ) {
                    $link = add_query_arg( $add_args, $link );
                }
                $link .= $args['add_fragment'];

                $page_links[] = sprintf(
                    '<a class="page-numbers" href="%s">%s</a>',
                    /** Acest filtru este documentat în wp-includes/general-template.php */
                    esc_url( apply_filters( 'paginate_links', $link ) ),
                    $args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number']
                );

                $dots = true;
            elseif ( $dots && ! $args['show_all'] ) :
                $page_links[] = '<span class="page-numbers dots">' . __( '&hellip;' ) . '</span>';

                $dots = false;
            endif;
        endif;
    endfor;

    if ( $args['prev_next'] && $current && $current < $total ) :
        $link = str_replace( '%_%', $args['format'], $args['base'] );
        $link = str_replace( '%#%', $current + 1, $link );
        if ( $add_args ) {
            $link = add_query_arg( $add_args, $link );
        }
        $link .= $args['add_fragment'];

        $page_links[] = sprintf(
            '<a class="next page-numbers" href="%s">%s</a>',
            /** Acest filtru este documentat în wp-includes/general-template.php */
            esc_url( apply_filters( 'paginate_links', $link ) ),
            $args['next_text']
        );
    endif;

    switch ( $args['type'] ) {
        case 'array':
            return $page_links;

        case 'list':
            $r .= "<ul class='page-numbers'>\n\t<li>";
            $r .= implode( "</li>\n\t<li>", $page_links );
            $r .= "</li>\n</ul>\n";
            break;

        default:
            $r = implode( "\n", $page_links );
            break;
    }

    /**
     * Filtrează ieșirea HTML a legăturilor paginate pentru arhive.
     *
     * @since 5.7.0
     *
     * @param string $r    Ieșire HTML.
     * @param array  $args Un array de argumente. Vezi paginate_links()
     *                     pentru informații despre argumentele acceptate.
     */
    $r = apply_filters( 'paginate_links_output', $r, $args );

    return $r;
}

Exemplu de utilizare:

$myQuery = new WP_Query();

$cars = $myQuery->query([
    'post_type' => 'cars',
    'paged' => !empty($_GET['pg']) ? absint($_GET['pg']) : 1,
]);

foreach ($cars as $car) {
    echo $car->post_title;
}

echo myPaginateLinks($myQuery);

Ceea ce produce exact același rezultat ca paginate_links, dar fără nicio legătură cu interogarea globală sau regulile de rescriere:

paginare wordpress interogare personalizată tip post personalizat cpt

Observați că folosesc $_GET['pg'] în loc de ?paged pentru paginare, deoarece nu am vrut ca nicio "magie de rescriere" să interfereze cu paginarea.

20 iun. 2021 19:32:49