La pagination ne fonctionne pas avec la boucle personnalisée

42

J'utilise une boucle personnalisée pour afficher certaines annonces immobilières qui seront disponibles dans les 60 jours. Je l'appelle avec la fonction suivante:

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

Bien que la boucle fonctionne très bien, je ne parviens pas à la paginer. Il montre les 10 premiers articles (ma valeur par défaut) mais ne montre pas la pagination. La seule façon d'afficher tous les articles est de les afficher sur une page en ajoutant que 'posts_per_page' => -1,j'ai des boucles similaires sur d'autres pages sans problème de pagination. La seule différence avec celui-ci est qu'il existe deux méta-clés qui filtrent les publications.

J'utilise WP Page Navi pour cela et le reste de mes pages. Je ferme la boucle et ajoute la pagination en utilisant le code suivant:

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

Comment puis-je résoudre ce problème?

Nurain
la source
Après avoir répondu, je relis votre question ... Voulez-vous dire que votre plug-in pagenavi n'apparaissait pas ou que la pagination vous conduisait à un 404?
eileencodes
WP Page Navi ne s'affiche pas sur les publications contenant des requêtes similaires (filtré par plus d'une clé méta). Il apparaît sur toutes les autres pages telles que archives, blog, etc.
nurain

Réponses:

39

J'ai déjà rencontré ce problème avec PageNavi. Ma solution consiste à pirater temporairement la variable $ wp_query, puis à la réaffecter après la fermeture de la boucle. Un exemple:

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

La dernière étape consiste à réaffecter la variable $ wp_query à ce qui était à l'origine, puis à réinitialiser à nouveau la requête.

* Edit: * balise php fixe. Bon tireur d'élite.

PNMG
la source
Je ne sais pas quand PageNavi a apporté cette modification à son plugin, mais depuis Wordpress 3.0, je dois détourner la variable $ wp_query pour que la pagination s'affiche sur les boucles personnalisées. Heureux d'avoir pu aider! : D
PNMG
8
wp_pagenavi() maintenant accepte également l' queryargument , donc au lieu d'écraser, $wp_queryvous pouvez écrire wp_pagename( array( 'query' => $my_query ) ).
Jan Fabry
Cette solution a fonctionné pour moi. J'avais une autre boucle avant celle-ci, je devais donc ajouter un wp_reset_query () avant le code de l'exemple.
Ryan
Voir cette réponse pour une autre solution possible pour la pagination numérique avec des requêtes personnalisées utilisant WP_Query();.
Michael Ecklund
11

J'ai eu un problème similaire plus tôt aujourd'hui ...

Avez-vous un type de message personnalisé et une page ou un message avec le même slug? La signification est l'URL d'une page que vous avez / real-estate et le type de message personnalisé réécrire sur / real-estate?

Si tel est le cas, vous ne pouvez pas en avoir 2 avec la même URL, sinon WordPress devient confus.

Vous pouvez soit modifier l’URL, soit utiliser http://wordpress.org/support/topic/pagination-with-custom-post-type-listing?replies=23#post-1637753 . J'ai choisi de changer d'URL, mais quelqu'un a écrit une requête personnalisée pour contourner le problème.

eileencodes
la source
Je ne pense pas avoir le même nom. J'ai en fait créé une nouvelle page intitulée "Déplacement rapide - 60 jours" et y ai ajouté la boucle en créant un modèle de page.
Nourain
7

J'utilise ceci pour la pagination personnalisée et son travail 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>";
      }
    }
    ?>

// Définit ceci pour n'importe quel modèle comme 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
la source
Hi custom_pagination () function définit dans un fichier de fonctions thème ou un fichier de fonctions plug-in. et après avoir placé ce code dans votre fichier de modèle Définissez cette partie de commentaire après dans le code ci-dessus = Définissez-le pour tout modèle tel que template-newsletter pour tout modèle tel que template-newsletter si vous avez une requête, faites-le moi savoir ici.
Adnan Limdiwala
J'espère que son travail fonctionnera bien pour vous
Adnan Limdiwala
3

Voici la solution qui a fonctionné pour moi, en utilisant une partie du code original de nurain et la réponse 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
la source
2

Vous pouvez afficher votre type de message personnalisé en utilisant cette méthode, votre pagination peut fonctionner !!!

<?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
la source