La pagination ne fonctionne pas avec la boucle personnalisée

38

J'utilise une boucle personnalisée pour afficher certaines annonces immobilières qui seront disponibles dans un délai de 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 messages (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 '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 clés méta 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?

    
posée nurain 30.11.2010 - 19:44

5 réponses

34

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 la requête pour qu'elle recommence.

* Éditer: * Correction du tag php. Bon tireur d'élite.

    
réponse donnée PNMG 30.11.2010 - 21:30
10

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 c'est le cas, vous ne pouvez pas avoir 2 avec la même URL, sinon wordpress est confus.

Vous pouvez modifier l'URL ou essayer cette enlace . J'ai choisi de changer d'URL, mais quelqu'un a écrit une requête personnalisée pour contourner le problème

    
réponse donnée eileencodes 30.11.2010 - 20:56
6

J'utilise ceci pour la pagination personnalisée et son travail correct

//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éfinissez ceci pour tout modèle tel que 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>
    
réponse donnée Adnan Limdiwala 02.09.2016 - 06:51
2

C’est 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; ?>
    
réponse donnée ChowKaiDeng 28.06.2013 - 02:27
1

Vous pouvez afficher votre type de publication personnalisé à l'aide de 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; ?>
    
réponse donnée Shiv Singh 17.12.2014 - 11:35

Lire d'autres questions sur les étiquettes