Paginarea nu funcționează
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.

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
) );
?>

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' => __( '« Anterior' ),
'next_text' => __( 'Următor »' ),
'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">' . __( '…' ) . '</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:
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.
