Paginare care nu funcționează pe pagina principală
Am o pagină numită "share" cu un loop complex care funcționează perfect. Această pagină se află la domain.com/share
. Acum trebuie să folosesc această pagină ca pagină principală, așa că am mers la "Setări -> Citire" și am selectat acea pagină ca pagină statică.
Problema acum este că paginarea nu mai funcționează. Pe pagina reală afișa domain.com/share/page/2
dar acum afișează domain.com/page/2
și încarcă mereu același conținut de la prima pagină, indiferent de pagina în care te afli.
Nu am făcut alte modificări, doar am setat acea pagină ca pagină principală. Care sunt posibilele soluții aici?
Folosesc WP Pagenavi dacă asta face vreo diferență.
Acesta este template-ul meu page.php
:
<?
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
if (is_page('join')) $post_types = array('articles');
if (is_page('learn')) $post_types = array('actions');
if (is_page('share')) $post_types = array('articles', 'actions');
$category = get_query_var('category');
$type = get_query_var('type');
$args = array(
'post_type' => $post_types,
'paged' => $paged,
'tax_query' => array('relation' => 'AND')
);
// Obține toate taxonomiile pentru tipurile de postări
$taxonomies = array();
foreach ($post_types as $post_type) {
foreach (get_object_taxonomies($post_type) as $tax) {
if (array_search($tax, $taxonomies) === false) $taxonomies[] = $tax;
}
}
// Construiește query-ul pentru taxonomii
foreach ($taxonomies as $taxonomy) {
$all_terms = get_terms($taxonomy, array('fields' => 'names'));
$query_terms = array(ucfirst($category), ucwords(str_replace('-', ' ', $type)));
$cur_terms = array_values(array_filter(array_intersect($all_terms, $query_terms)));
if (! empty($cur_terms)) {
$args['tax_query'][] = array(
'taxonomy' => $taxonomy,
'terms' => empty($cur_terms) ? $all_terms : $cur_terms,
'field' => 'slug'
);
}
}
if (is_page('join')) $args['posts_per_page'] = 36;
$query = new WP_Query($args);
get_header();
Theme::toolbar();
?>
<div class="center">
<div id="content">
<? if ($query->have_posts()): ?>
<? while ($query->have_posts()): $query->the_post() ?>
<? get_template_part('content') ?>
<? endwhile ?>
<? else: ?>
<? endif ?>
</div>
</div>
<?
wp_reset_query();
Theme::pagination($query);
get_footer();
?>
Și acesta este codul de paginare din Theme
:
function pagination($query = null)
{
global $wp_query;
if (empty($query)) $query = $wp_query;
$is_paged = $query->max_num_pages > 1;
?>
<? if ($is_paged): ?>
<div class="center"><div id="pagination"><? wp_pagenavi(array('query' => $query)) ?></div></div>
<? endif ?>
<?
}

Am avut aceeași problemă. Și în final, am rezolvat-o.
Obținerea numărului curent de paginare
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
Pentru a obține numărul curent de paginare pe o pagină frontală statică (șablon de pagină) trebuie să utilizați variabila de interogare 'page'.
<?php $paged = (get_query_var('page')) ? get_query_var('page') : 1; ?>
Deci ar trebui să utilizați get_query_var('page')
în loc de get_query_var('paged')
.
Puteți utiliza funcția is_front_page()
într-o condiție if pentru interogarea paginii frontale. Exact ca în exemplul următor:
<?php
if(is_front_page()) {
$paged = (get_query_var('page')) ? get_query_var('page') : 1;
}else {
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
}
Creditul merge aici

Nu am testat acest lucru, dar pagina WP Query menționează:
Notă privind paginarea: Folosește
get_query_var('page');
dacă dorești ca interogarea ta să funcționeze într-un șablon de Pagină pe care l-ai setat ca pagină principală statică.
Deci, probabil ai nevoie de asta:
$page_number = get_query_var('page') ? get_query_var('page') : 1;
[ ... ]
$args = array(
'post_type' => $post_types,
'page' => $page_number,
'tax_query' => array( 'relation' => 'AND' ),
);

Folosesc acest cod pentru paginare în index.php pentru bucla de postări:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
// adaugă titlu, rezumat sau link-uri permanente
<?php endwhile; ?>
<?php pagination(); ?>
<?php else : ?>
<?php // mesaj pentru lipsa postărilor se adaugă aici ?>
<?php endif; ?>
Apoi adaug următoarele linii în functions.php
function pagination() {
if( is_singular() )
return;
global $wp_query;
/** Oprește execuția dacă există doar 1 pagină */
if( $wp_query->max_num_pages <= 1 )
return;
$paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;
$max = intval( $wp_query->max_num_pages );
/** Adaugă pagina curentă în array */
if ( $paged >= 1 )
$links[] = $paged;
/** Adaugă paginile din jurul paginii curente în array */
if ( $paged >= 3 ) {
$links[] = $paged - 1;
$links[] = $paged - 2;
}
if ( ( $paged + 2 ) <= $max ) {
$links[] = $paged + 2;
$links[] = $paged + 1;
}
echo '<div class="navigation"><ul>' . "\n";
/** Link către postările anterioare */
if ( get_previous_posts_link() )
printf( '<li>%s</li>' . "\n", get_previous_posts_link() );
/** Link către prima pagină, plus puncte de suspensie dacă e necesar */
if ( ! in_array( 1, $links ) ) {
$class = 1 == $paged ? ' class="active"' : '';
printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( 1 ) ), '1' );
if ( ! in_array( 2, $links ) )
echo '<li>…</li>';
}
/** Link către pagina curentă, plus 2 pagini în ambele direcții dacă e necesar */
sort( $links );
foreach ( (array) $links as $link ) {
$class = $paged == $link ? ' class="active"' : '';
printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $link ) ), $link );
}
/** Link către ultima pagină, plus puncte de suspensie dacă e necesar */
if ( ! in_array( $max, $links ) ) {
if ( ! in_array( $max - 1, $links ) )
echo '<li>…</li>' . "\n";
$class = $paged == $max ? ' class="active"' : '';
printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $max ) ), $max );
}
/** Link către postările următoare */
if ( get_next_posts_link() )
printf( '<li>%s</li>' . "\n", get_next_posts_link() );
echo '</ul></div>' . "\n";
}

Ai resetat interogarea înainte de a genera paginarea, uită-te la aceste linii din codul tău:
wp_reset_query();
Theme::pagination($query);
get_footer();
Nu am analizat mai departe din cauza acestei probleme. Rezolvă această eroare și spune-mi dacă soluționează problema.
