La paginación no funciona con un loop personalizado

30 nov 2010, 20:44:43
Vistas: 33.7K
Votos: 43

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?

2
Comentarios

Después de responder, volví a leer tu pregunta... ¿Querías decir que tu plugin pagenavi no se mostraba o que la paginación te llevaba a un error 404?

eileencodes eileencodes
30 nov 2010 22:02:28

WP Page Navi no se muestra en las publicaciones con consultas similares (filtradas por más de una meta clave). Aparece en todas las demás páginas como archivos, blog, etc.

nurain nurain
30 nov 2010 22:45:32
Todas las respuestas a la pregunta 5
4
41

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.

30 nov 2010 22:30:55
Comentarios

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

PNMG PNMG
30 nov 2010 23:36:31

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 ) ).

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

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.

Ryan Ryan
23 ago 2011 23:25:35

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

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

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

30 nov 2010 21:56:03
Comentarios

No creo que tenga nada con el mismo nombre. De hecho, creé una nueva página llamada "Entrega Rápida - 60 Días" y agregué el bucle creando una plantilla de página para ello.

nurain nurain
30 nov 2010 23:08:19
2

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'       => __('&#9668;'),
        'next_text'       => __('&#9658;'),
        '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>
2 sept 2016 07:51:24
Comentarios

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í.

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

Cualquier problema respecto a esta respuesta, espero que funcione bien para ti

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

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; ?>
28 jun 2013 03:27:11
0

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; ?>
17 dic 2014 12:35:22