Paginazione non funzionante con loop personalizzato
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?

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.

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

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

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.

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

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

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' => __('◄'), // Freccia sinistra
'next_text' => __('►'), // 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>

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.

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

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