Paginazione non funzionante con loop personalizzato

30 nov 2010, 20:44:43
Visualizzazioni: 33.7K
Voti: 43

Ho un loop personalizzato che sto utilizzando per visualizzare alcuni annunci immobiliari che saranno disponibili entro 60 giorni. Lo sto chiamando con la seguente funzione:

<?php 
$sixtydays = date('Y/m/d', strtotime('+60 days'));
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$query = new PostsOrderedByMetaQuery(array(
  'post_type' => array('post', 'real-estate'),
  'meta_key' => 'Time Available',
  'meta_compare' => '<=',
  'meta_value' => $sixtydays,
  'paged' => $paged,
  'orderby_meta_key' => 'Price',
  'orderby_order'    => 'ASC'
));
?>
<?php while ($query->have_posts()) : $query->the_post(); ?>

Mentre il loop funziona perfettamente, non riesco a farlo paginare. Mostra i primi 10 post (il mio valore predefinito) ma non visualizza la paginazione. L'unico modo per visualizzare tutti i post è mostrarli su una singola pagina aggiungendo 'posts_per_page' => -1, Ho loop simili in altre pagine che non hanno problemi con la paginazione. L'unica differenza con questo è che ci sono due meta key che stanno filtrando i post.

Sto utilizzando WP Page Navi per questa e tutte le altre mie pagine. Sto chiudendo il loop e aggiungendo la paginazione utilizzando il seguente codice:

<?php endwhile; // Fine del loop. Finalmente. ?>
<?php wp_pagenavi(); ?>
<?php wp_reset_query(); ?>

Come posso risolvere questo problema?

2
Commenti

Dopo aver risposto ho riletto la tua domanda... Intendevi che il tuo plugin pagenavi non veniva visualizzato o che la paginazione ti portava a un 404?

eileencodes eileencodes
30 nov 2010 22:02:28

WP Page Navi non viene visualizzato sugli articoli con query simili (filtrati per più di una meta key). Appare invece su tutte le altre pagine come archivi, blog, ecc.

nurain nurain
30 nov 2010 22:45:32
Tutte le risposte alla domanda 5
4
41

Mi sono imbattuto in questo problema con PageNavi in precedenza. La mia soluzione è di sovrascrivere temporaneamente la variabile $wp_query e poi riassegnarla dopo aver chiuso il loop. Ecco un esempio:

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args=array(
   'post_type'=>'post',
   'cat' => 6,
   'posts_per_page' => 5,
   'paged'=>$paged
);
$temp = $wp_query;
$wp_query= null;
$wp_query = new WP_Query($args);

/* PageNavi in alto */
if (function_exists('wp_pagenavi')){wp_pagenavi();}
if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post();   

/* OPERAZIONI NEL LOOP */

endwhile; endif;
/* PageNavi in basso */
if (function_exists('wp_pagenavi')){wp_pagenavi();}
$wp_query = null;
$wp_query = $temp;
wp_reset_query(); ?>

L'ultimo passaggio consiste nel riassegnare alla variabile $wp_query il suo valore originale e poi resettare la query all'inizio.

*Modifica:*Corretto il tag php. Ottima osservazione.

30 nov 2010 22:30:55
Commenti

Non so quando PageNavi abbia apportato questa modifica al loro plugin, ma da WordPress 3.0 ho dovuto "hijackare" la variabile $wp_query per far apparire la paginazione sui loop personalizzati. Felice di aver potuto aiutare! :D

PNMG PNMG
30 nov 2010 23:36:31

wp_pagenavi() ora accetta anche l'argomento query, quindi invece di sovrascrivere $wp_query puoi scrivere wp_pagename( array( 'query' => $my_query ) ).

Jan Fabry Jan Fabry
17 feb 2011 16:15:01

Questa soluzione ha funzionato per me. Avevo un altro loop prima di questo, quindi ho dovuto aggiungere un wp_reset_query() prima del codice nell'esempio.

Ryan Ryan
23 ago 2011 23:25:35

Vedi questa risposta per un'altra possibile soluzione per la Paginazione Numerica con query personalizzate utilizzando WP_Query();.

Michael Ecklund Michael Ecklund
18 apr 2017 21:37:45
1
12

Ho avuto un problema simile oggi stesso...

Hai un custom post type e una pagina o post con lo stesso slug? Cioè, l'URL di una tua pagina è /real-estate e la rewrite URL del custom post type è impostata su /real-estate?

Se è questo il caso, non puoi avere due elementi con lo stesso URL altrimenti WordPress si confonde.

Puoi cambiare l'URL oppure provare questa http://wordpress.org/support/topic/pagination-with-custom-post-type-listing?replies=23#post-1637753. Io ho scelto di cambiare il mio URL, ma qualcuno lì ha scritto una query personalizzata per aggirare il problema

30 nov 2010 21:56:03
Commenti

Non credo di avere nulla con lo stesso nome. In realtà ho creato una nuova pagina chiamata "Quick Move In - 60 Giorni" e ho aggiunto il loop creando un page template apposito.

nurain nurain
30 nov 2010 23:08:19
2

Sto utilizzando questo per la paginazione personalizzata e funziona correttamente

//paginazione per newsletter

     //definito nel file functions.php
      function custom_pagination($numpages = '', $pagerange = '', $paged='')  {

      if (empty($pagerange)) {
        $pagerange = 2;
      }

      /**
       * Questa prima parte della nostra funzione è un fallback
       * per la paginazione personalizzata all'interno di un loop regolare
       * che utilizza le variabili globali $paged e $wp_query.
       * 
       * È utile perché possiamo ora sovrascrivere la paginazione predefinita
       * nel nostro tema, e usare questa funzione sia nelle query standard
       * che nelle query personalizzate.
       */

      if ($paged == '') {
          global $paged;
          if (empty($paged)) {
            $paged = 1;
          }
      }
      if ($numpages == '') {
        global $wp_query;
        $numpages = $wp_query->max_num_pages;
        if(!$numpages) {
            $numpages = 1;
        }
      }

      /** 
       * Costruiamo gli argomenti di paginazione da passare alla funzione
       * paginate_links.
       */

      $pagination_args = array(
        'base'            => get_pagenum_link(1) . '%_%',
        'format'          => 'page/%#%',
        'total'           => $numpages,
        'current'         => $paged,
        'show_all'        => false,
        'end_size'        => 1,
        'mid_size'        => $pagerange,
        'prev_next'       => true,
        'prev_text'       => __('&#9668;'), // Freccia sinistra
        'next_text'       => __('&#9658;'), // Freccia destra
        'type'            => 'plain',
        'add_args'        => true,
        'add_fragment'    => '',
        'after_page_number' => '',
        'before_page_number' =>'',
        );
     $paginate_links = paginate_links($pagination_args);

      if ( $paginate_links ) {
        echo "<nav class='custom-pagination'>";
          //echo "<span class='page-numbers page-num'>Pagina " . $paged . " di " . $numpages . "</span> ";
          echo $paginate_links;
        echo "</nav>";
      }
    }
    ?>

// Definire questo per qualsiasi Template come template-newsletter

    <?php  $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
                               $newslatter_detail = array(
                               'post_type' => 'newsletter',
                               'post_status' => 'publish',
                               'posts_per_page' =>4,
                               'order' => 'ASC',
                               //'orderby' =>'date',
                               'paged' => $paged
                               );
                               $posts = new WP_Query( $newslatter_detail );
                               $posts_array = get_posts( $newslatter_detail );
                              if ( $posts -> have_posts() ) {
                               while ( $posts->have_posts() ) : $posts->the_post();
                               the_title();
                               endwhile;
                        wp_reset_postdata();
              } else { ?>
                 Nessun elenco forum trovato.
                <?php } ?>

              <div class="pagination">
                    <?php
                       if (function_exists(custom_pagination)) {
                        custom_pagination($posts->max_num_pages,"",$paged);
                       }
                       ?>
                 </div>
2 set 2016 07:51:24
Commenti

La funzione custom_pagination() deve essere definita nel file functions del tema o nel file functions di un plugin. Dopo averlo fatto, inserisci questo codice nel tuo file template. Definisci questo dopo la parte del commento nel codice sopra =Definisci questo per qualsiasi Template come template-newsletter per qualsiasi Template come template-newsletter

Se hai qualsiasi domanda, fammelo sapere qui.

Adnan Limdiwala Adnan Limdiwala
21 feb 2017 08:55:29

Qualsiasi problema riguardo a questa risposta, spero funzioni bene per te

Adnan Limdiwala Adnan Limdiwala
7 apr 2017 12:23:37
0

Questa è la soluzione che ha funzionato per me, utilizzando parte del codice originale di nurain e la risposta di Jan Fabry:

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$myquery = new WP_Query(
    array(
        'posts_per_page' => '2',
        'paged'=>$paged
        // aggiungi altri parametri al tuo array wp_query se necessario
    )   
);  
?>

<?php
if ($myquery->have_posts()) :  while ($myquery->have_posts()) : $myquery->the_post();
?>

<!-- Inizia il tuo post. Di seguito un esempio: -->

<div class="article-box">                               
<h2 class="article-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<p class="article-excerpt"><?php echo(get_the_excerpt()); ?></p>                        
</div>

<!-- Fine del tuo post -->

<?php endwhile; ?>
<?php wp_pagenavi( array( 'query' => $myquery ) ); ?><!-- IMPORTANTE: assicurati di includere un array con i valori della query dichiarati in precedenza -->
<?php wp_reset_query(); ?>
<?php else : ?>
<p>Nessun articolo trovato</p>
<?php endif; ?>
28 giu 2013 03:27:11
0

Puoi visualizzare il tuo custom post type utilizzando questo metodo e la tua paginazione funzionerà!!!

<?php
  query_posts( array( 'post_type' => 'post', 'posts_per_page' => '2', 'paged' =>     get_query_var( 'paged' ) ) ); 

  if (have_posts() ) :  while (have_posts() ) : the_post(); 
?>
<!-- Inizia il tuo post. Di seguito un esempio: -->
<div class="article-box">                               
<h2 class="article-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<p class="article-excerpt"><?php echo(get_the_excerpt()); ?></p>                        
</div>
<!-- Fine del tuo post -->
<?php endwhile; ?>
<?php wp_pagenavi(); ?><!-- IMPORTANTE: assicurati di includere un array con i valori della query precedentemente dichiarati qui -->
<?php wp_reset_query(); ?>
<?php else : ?>
<p>Nessun post trovato</p>
<?php endif; ?>
17 dic 2014 12:35:22