Paginazione non funziona nella home page
Ho una pagina chiamata "share" con un loop complesso che funziona perfettamente. Questa pagina si trova all'indirizzo domain.com/share
. Ora ho bisogno di usare questa pagina come home page, quindi sono andato in "Impostazioni -> Lettura" e ho scelto quella pagina come pagina statica.
Il problema ora è che la paginazione non funziona più. Sulla pagina effettiva appare come domain.com/share/page/2
ma ora appare come domain.com/page/2
e carica sempre lo stesso contenuto della prima pagina, indipendentemente dalla pagina in cui ti trovi.
Non ho fatto altri cambiamenti, ho semplicemente scelto quella pagina come front page. Quali sono le possibili soluzioni qui?
Sto usando WP Pagenavi se può fare differenza.
Questo è il mio template 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')
);
$taxonomies = array();
foreach ($post_types as $post_type) {
foreach (get_object_taxonomies($post_type) as $tax) {
if (array_search($tax, $taxonomies) === false) $taxonomies[] = $tax;
}
}
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();
?>
E questo è il codice della paginazione in 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 ?>
<?
}

Ho affrontato lo stesso problema. E alla fine, ho risolto il problema.
Ottenere il numero corrente della paginazione
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
Per ottenere il numero corrente della paginazione su una pagina frontale statica (template di pagina) devi usare la variabile di query 'page'.
<?php $paged = (get_query_var('page')) ? get_query_var('page') : 1; ?>
Quindi dovresti usare get_query_var('page')
invece di get_query_var('paged')
.
Puoi usare la funzione is_front_page()
nella condizione if per la query della pagina frontale. Esattamente così-
<?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;
}
Il merito va qui

Non ho testato questo, ma la pagina WP Query dice:
Nota sulla paginazione: Usa
get_query_var('page');
se vuoi che la tua query funzioni in un template di Pagina che hai impostato come tua front page statica.
Quindi, forse hai bisogno di questo:
$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' ),
);

Sto utilizzando questo codice per la paginazione. Nel file index.php per il loop:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
// aggiungi titolo, estratto o permalink
<?php endwhile; ?>
<?php pagination(); ?>
<?php else : ?>
<?php // messaggio di nessun post trovato va qui ?>
<?php endif; ?>
Poi aggiungi le seguenti righe al file functions.php
function pagination() {
if( is_singular() )
return;
global $wp_query;
/** Interrompi l'esecuzione se c'è solo 1 pagina */
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 );
/** Aggiungi la pagina corrente all'array */
if ( $paged >= 1 )
$links[] = $paged;
/** Aggiungi le pagine attorno alla pagina corrente all'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 Post Precedente */
if ( get_previous_posts_link() )
printf( '<li>%s</li>' . "\n", get_previous_posts_link() );
/** Link alla prima pagina, più ellissi se necessario */
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 alla pagina corrente, più 2 pagine in entrambe le direzioni se necessario */
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 all'ultima pagina, più ellissi se necessario */
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 Post Successivo */
if ( get_next_posts_link() )
printf( '<li>%s</li>' . "\n", get_next_posts_link() );
echo '</ul></div>' . "\n";
}
