La paginación no funciona con un loop personalizado
Tengo un loop personalizado que estoy usando para mostrar algunos listados inmobiliarios que estarán disponibles dentro de 60 días. Lo estoy llamando con la siguiente función:
<?php
// Calcula la fecha 60 días adelante
$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(); ?>
Aunque el loop funciona perfectamente, no puedo hacer que pagine. Muestra los primeros 10 posts (mi valor predeterminado) pero no muestra la paginación. La única forma de mostrar todos los posts es mostrarlos en una página añadiendo 'posts_per_page' => -1,
Tengo loops similares en otras páginas que no tienen problemas con la paginación. La única diferencia con este es que hay dos meta keys que están filtrando los posts.
Estoy usando WP Page Navi para esta y el resto de mis páginas. Estoy cerrando el loop y añadiendo la paginación usando el siguiente código:
<?php endwhile; // Fin del loop. Uff. ?>
<?php wp_pagenavi(); ?>
<?php wp_reset_query(); ?>
¿Cómo puedo solucionar esto?

He tenido este problema con PageNavi antes. Mi solución es tomar temporalmente el control de la variable $wp_query y luego reasignarla después de cerrar el bucle. Un ejemplo:
<?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 en la parte superior */
if (function_exists('wp_pagenavi')){wp_pagenavi();}
if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post();
/* HACER COSAS DENTRO DEL BUCLE */
endwhile; endif;
/* PageNavi en la parte inferior */
if (function_exists('wp_pagenavi')){wp_pagenavi();}
$wp_query = null;
$wp_query = $temp;
wp_reset_query(); ?>
El último paso es reasignar la variable $wp_query a su valor original y luego reiniciar la consulta.
*Edición:*Corregida la etiqueta php. Buen ojo sniper.

No sé cuándo PageNavi hizo este cambio en su plugin, pero desde WordPress 3.0 he tenido que modificar la variable $wp_query para que se muestre la paginación en loops personalizados. ¡Me alegra haber podido ayudar! :D

wp_pagenavi()
ahora también acepta el argumento query
, así que en lugar de sobrescribir $wp_query
puedes escribir wp_pagename( array( 'query' => $my_query ) )
.

Esta solución funcionó para mí. Tenía otro loop antes de este, así que tuve que agregar un wp_reset_query() antes del código del ejemplo.

Consulta esta respuesta para otra posible solución de Paginación Numérica con consultas personalizadas usando WP_Query();
.

Tuve un problema similar hoy mismo...
¿Tienes un tipo de entrada personalizado (custom post type) y una página o entrada con el mismo slug? Es decir, ¿la URL de una página que tienes es /bienes-raices y la reescritura de URL del tipo de entrada personalizada también está en /bienes-raices?
Si ese es el caso, no puedes tener dos con la misma URL o WordPress se confundirá.
Puedes cambiar la URL o probar esto http://wordpress.org/support/topic/pagination-with-custom-post-type-listing?replies=23#post-1637753. Yo opté por cambiar mi URL, pero alguien allí escribió una consulta personalizada para solucionar el problema

Estoy usando esto para una paginación personalizada y funciona bien
//paginación para newsletter
//definir en el archivo de funciones
function custom_pagination($numpages = '', $pagerange = '', $paged='') {
if (empty($pagerange)) {
$pagerange = 2;
}
/**
* Esta primera parte de nuestra función es un respaldo
* para la paginación personalizada dentro de un bucle regular que
* usa las variables globales $paged y global $wp_query.
*
* Es bueno porque ahora podemos sobrescribir la paginación por defecto
* en nuestro tema, y usar esta función en consultas por defecto
* y consultas personalizadas.
*/
if ($paged == '') {
global $paged;
if (empty($paged)) {
$paged = 1;
}
}
if ($numpages == '') {
global $wp_query;
$numpages = $wp_query->max_num_pages;
if(!$numpages) {
$numpages = 1;
}
}
/**
* Construimos los argumentos de paginación para ingresar a nuestra función
* 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' => __('◄'),
'next_text' => __('►'),
'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'>Page " . $paged . " of " . $numpages . "</span> ";
echo $paginate_links;
echo "</nav>";
}
}
?>
// Definir esto para cualquier plantilla como 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 { ?>
No se encontró lista de foros.
<?php } ?>
<div class="pagination">
<?php
if (function_exists(custom_pagination)) {
custom_pagination($posts->max_num_pages,"",$paged);
}
?>
</div>

La función custom_pagination() debe definirse en el archivo de funciones del tema o en el archivo de funciones del plugin. Después de eso, coloca este código en tu archivo de plantilla. Define esto después de la parte de comentarios en el código anterior =Define esto para cualquier Plantilla como template-newsletter para cualquier Plantilla como template-newsletter
Si tienes alguna consulta, házmelo saber aquí.

Esta es la solución que funcionó para mí, utilizando parte del código original de nurain y la respuesta de Jan Fabry:
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$myquery = new WP_Query(
array(
'posts_per_page' => '2',
'paged'=>$paged
// agregar cualquier otro parámetro a tu array wp_query
)
);
?>
<?php
if ($myquery->have_posts()) : while ($myquery->have_posts()) : $myquery->the_post();
?>
<!-- Inicia tu post. Abajo un ejemplo: -->
<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>
<!-- Fin de tu post -->
<?php endwhile; ?>
<?php wp_pagenavi( array( 'query' => $myquery ) ); ?><!-- IMPORTANTE: asegúrate de incluir un array con los valores de tu query declarados previamente aquí -->
<?php wp_reset_query(); ?>
<?php else : ?>
<p>No se encontraron posts</p>
<?php endif; ?>

Puedes mostrar tu tipo de entrada personalizada usando este método y tu paginación funcionará!!!
<?php
query_posts( array( 'post_type' => 'post', 'posts_per_page' => '2', 'paged' => get_query_var( 'paged' ) ) );
if (have_posts() ) : while (have_posts() ) : the_post();
?>
<!-- Inicia tu entrada. A continuación un ejemplo: -->
<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>
<!-- Fin de tu entrada -->
<?php endwhile; ?>
<?php wp_pagenavi(); ?><!-- IMPORTANTE: asegúrate de incluir un array con los valores de consulta declarados previamente aquí -->
<?php wp_reset_query(); ?>
<?php else : ?>
<p>No se encontraron entradas</p>
<?php endif; ?>
