Paginazione non funziona nella home page

25 apr 2013, 04:23:04
Visualizzazioni: 15.4K
Voti: 4

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

  <?
}
8
Commenti

Forse sono io che sono stupido, ma c'è una ragione particolare per cui chiami wp_reset_query(); prima di chiamare la paginazione?

netfreak netfreak
25 apr 2013 14:49:58

Il tuo tema ha un template front-page.php? Se sì, quello sovrascriverà il tuo template page.php.

mrwweb mrwweb
25 apr 2013 18:08:17

@mrwweb: No, nessun front-page.php. Il contenuto viene visualizzato correttamente, proprio come in share. La paginazione appare ma tutte le pagine caricano il contenuto della prima. Ho lo scroll infinito, quindi si blocca e continua a caricare lo stesso contenuto all'infinito.

elclanrs elclanrs
25 apr 2013 22:39:28

Puoi abilitare WP_DEBUG e magari fare un dump della tua $query specialmente quando vai alla pagina successiva?

netfreak netfreak
26 apr 2013 01:49:36

@netfreak: Ho WP_DEBUG abilitato. Ho appena ricontrollato attentamente la query, e in page/2 dice paged=>1?! Ma su share/page/2 dice paged=>2... Non capisco.

elclanrs elclanrs
26 apr 2013 02:09:41

is_page('share') non è più vero quando è la front page, non sono sicuro se questo contribuisca al problema.

Milo Milo
26 apr 2013 02:23:14

@Milo: Ho provato con is_front_page() e non ha fatto differenza, il problema persiste...

elclanrs elclanrs
26 apr 2013 03:26:15

Per favore evita discussioni estese nei commenti. @elclanrs per favore inserisci le [modifiche] con informazioni aggiuntive, non commenti.

kaiser kaiser
25 apr 2014 09:41:03
Mostra i restanti 3 commenti
Tutte le risposte alla domanda 4
1
11

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

31 lug 2017 18:25:00
Commenti

Fantastico! Grazie mille!!

tillinberlin tillinberlin
15 apr 2024 15:56:31
0

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' ),
);
10 mag 2013 21:21:03
0

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";

}
3 set 2013 10:26:22
0

Hai resettato la query prima di generare la paginazione, guarda queste righe del tuo codice:

wp_reset_query();
Theme::pagination($query);
get_footer();

Non ho approfondito ulteriormente a causa di questo problema. Correggi questo e dimmi se risolve il problema.

3 set 2013 10:49:59