La paginación no funciona con el bucle personalizado

42

Tengo un bucle personalizado que estoy usando para mostrar algunos listados de Bienes Raíces que estarán disponibles dentro de 60 días. Lo llamo con la siguiente función:

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

Si bien el ciclo funciona muy bien, no puedo hacer que se pagine. Muestra las primeras 10 publicaciones (por defecto) pero no muestra la paginación. La única forma de mostrar todas las publicaciones es mostrarlas en una página agregando 'posts_per_page' => -1,que tengo bucles similares en otras páginas que no tienen problemas para paginar. La única diferencia con este es que hay dos meta claves que están filtrando las publicaciones.

Estoy usando WP Page Navi para esto y el resto de mis páginas. Estoy cerrando el ciclo y agregando la paginación usando el siguiente código:

<?php endwhile; // End the loop. Whew. ?>
<?php wp_pagenavi(); ?>
<?php wp_reset_query(); ?>

¿Cómo puedo solucionar esto?

nurain
fuente
Después de responder, volví a leer tu pregunta ... ¿Querías decir que tu complemento pagenavi no aparecía o que la paginación te estaba llevando a un 404?
eileencodes
WP Page Navi no se muestra en las publicaciones con consultas similares (filtradas por más de una metaclave). Aparece en todas las demás páginas, como archivos, blogs, etc.
nurain

Respuestas:

39

Me he encontrado con este problema con PageNavi antes. Mi solución es secuestrar la variable $ wp_query temporalmente y luego reasignarla después de cerrar el ciclo. 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 at Top */
if (function_exists('wp_pagenavi')){wp_pagenavi();}
if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post();   

/* DO STUFF IN THE LOOP */

endwhile; endif;
/* PageNavi at Bottom */
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 lo que era originalmente y luego restablecer la consulta para comenzar.

* Editar: * Se corrigió la etiqueta php. Buen ojo francotirador.

PNMG
fuente
No sé cuándo PageNavi realizó este cambio en su complemento, pero desde Wordpress 3.0 he tenido que secuestrar la variable $ wp_query para que la paginación se muestre en bucles personalizados. Me alegro de poder ayudar! : D
PNMG
8
wp_pagenavi() ahora también acepta el queryargumento , por lo que en lugar de sobrescribir $wp_querypuede escribir wp_pagename( array( 'query' => $my_query ) ).
Jan Fabry
Esta solución funcionó para mí. Tenía otro ciclo antes de este, así que tuve que agregar un wp_reset_query () antes del código en el ejemplo.
Ryan
Vea esta respuesta para otra posible solución para la paginación numérica con consultas personalizadas usando WP_Query();.
Michael Ecklund
11

Tuve un problema similar hoy temprano ...

¿Tiene un tipo de publicación personalizada y una página o publicación con la misma babosa? ¿Qué significa la url de una página que tiene / real-estate y el tipo de publicación personalizada url rewrite at / real-estate?

Si ese es el caso, no puede tener 2 con la misma URL o WordPress se confunde.

Puede cambiar la url o probar esta http://wordpress.org/support/topic/pagination-with-custom-post-type-listing?replies=23#post-1637753 . Elegí cambiar mi URL, pero alguien allí escribió una consulta personalizada para solucionar el problema

eileencodes
fuente
No creo que tenga nada llamado igual. De hecho, creé una nueva página llamada "Quick Move In - 60 Days" y agregué el bucle creando una plantilla de página.
nurain
7

Estoy usando esto para la paginación personalizada y funciona bien

//paginations for newsletter

     //define in function file
      function custom_pagination($numpages = '', $pagerange = '', $paged='')  {

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

      /**
       * This first part of our function is a fallback
       * for custom pagination inside a regular loop that
       * uses the global $paged and global $wp_query variables.
       * 
       * It's good because we can now override default pagination
       * in our theme, and use this function in default queries
       * and custom queries.
       */

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

      /** 
       * We construct the pagination arguments to enter into our paginate_links
       * function. 
       */

      $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>";
      }
    }
    ?>

// Defina 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 Forum List found.
                <?php } ?>

              <div class="pagination">
                    <?php
                       if (function_exists(custom_pagination)) {
                        custom_pagination($posts->max_num_pages,"",$paged);
                       }
                       ?>
                 </div>
Adnan Limdiwala
fuente
Hola, la función custom_pagination () define en el archivo de funciones del tema o en el archivo de funciones del complemento. y después de poner este código en su archivo de plantilla Defina esto después de la parte del comentario en el código anterior = Defina esto para cualquier plantilla como template-newsletter para cualquier plantilla como template-newsletter si tiene alguna consulta, hágamelo saber aquí.
Adnan Limdiwala
Cualquier problema relacionado con este Ans espero que funcione bien para usted
Adnan Limdiwala
3

Esta es la solución que funcionó para mí, usando 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
        // add any other parameters to your wp_query array
    )   
);  
?>

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

<!-- Start your post. Below an example: -->

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

<!-- End of your post -->

<?php endwhile; ?>
<?php wp_pagenavi( array( 'query' => $myquery ) ); ?><!-- IMPORTANT: make sure to include an array with your previously declared query values in here -->
<?php wp_reset_query(); ?>
<?php else : ?>
<p>No posts found</p>
<?php endif; ?>
ChowKaiDeng
fuente
2

¡Puede mostrar su tipo de publicación personalizada utilizando este método, su paginación puede 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(); 
?>
<!-- Start your post. Below an example: -->
<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>
<!-- End of your post -->
<?php endwhile; ?>
<?php wp_pagenavi(); ?><!-- IMPORTANT: make sure to include an array with your previously declared query values in here -->
<?php wp_reset_query(); ?>
<?php else : ?>
<p>No posts found</p>
<?php endif; ?>
Shiv Singh
fuente