Paginacja nie działa z niestandardową pętlą

42

Mam niestandardową pętlę, której używam do wyświetlania niektórych ofert nieruchomości, które będą dostępne w ciągu 60 dni. Wywołuję to za pomocą następującej funkcji:

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

Chociaż pętla działa świetnie, nie mogę jej podzielić na strony. Pokazuje pierwsze 10 (moje domyślne) posty, ale nie pokazuje podziału na strony. Jedynym sposobem wyświetlenia wszystkich postów jest pokazanie ich na jednej stronie przez dodanie 'posts_per_page' => -1,Mam podobne pętle na innych stronach, które nie mają problemu z paginacją. Jedyną różnicą w tym przypadku jest to, że są dwa meta-klucze, które filtrują posty.

Używam WP Page Navi do tego i reszty moich stron. Zamykam pętlę i dodam paginację za pomocą następującego kodu:

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

Jak mogę to naprawić?

nurain
źródło
Po udzieleniu odpowiedzi ponownie przeczytałem twoje pytanie ... Czy chodziło Ci o to, że wtyczka pagenavi się nie pojawiła, czy paginacja doprowadziła cię do 404?
eileencodes
WP Page Navi nie wyświetla się w postach zawierających podobne zapytania (filtrowane według więcej niż jednego meta-klucza). Pojawia się na wszystkich innych stronach, takich jak archiwa, blog itp.
Nurain

Odpowiedzi:

39

Wcześniej miałem taki problem z PageNavi. Moim rozwiązaniem jest tymczasowe przejęcie zmiennej $ wp_query, a następnie ponowne przypisanie jej po zamknięciu pętli. Przykład:

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

Ostatnim krokiem jest ponowne przypisanie zmiennej $ wp_query do pierwotnej wersji, a następnie zresetowanie zapytania, aby rozpocząć.

* Edycja: * Naprawiono tag php. Dobry snajper oka.

PNMG
źródło
Nie wiem, kiedy PageNavi wprowadziło tę zmianę w swojej wtyczce, ale od Wordpress 3.0 musiałem przejąć zmienną $ wp_query, aby wyświetlić paginację w niestandardowych pętlach. Cieszę się, że mogłem pomóc! : D
PNMG
8
wp_pagenavi() teraz akceptuje również queryargument , więc zamiast nadpisywania $wp_querymożesz pisać wp_pagename( array( 'query' => $my_query ) ).
Jan Fabry
To rozwiązanie działało dla mnie. Miałem inną pętlę przed tą, więc musiałem dodać wp_reset_query () przed kodem w przykładzie.
Ryan
Zobacz tę odpowiedź, aby znaleźć inne możliwe rozwiązanie numerycznego podziału na strony przy użyciu niestandardowych zapytań WP_Query();.
Michael Ecklund,
11

Miałem podobny problem wcześniej dzisiaj ...

Czy masz niestandardowy typ posta i stronę lub post z tym samym ślimakiem? Czy adres URL strony, którą masz / real-estate, i niestandardowy typ postu przepisujesz w / real-estate?

W takim przypadku nie możesz mieć 2 z tym samym adresem URL, w przeciwnym razie Wordpress się myli.

Możesz zmienić adres URL lub wypróbować ten http://wordpress.org/support/topic/pagination-with-custom-post-type-listing?replies=23#post-1637753 . Wybrałem zmianę adresu URL, ale ktoś tam napisał niestandardowe zapytanie, aby obejść ten problem

eileencodes
źródło
Nie sądzę, żebym miał coś o tej samej nazwie. Stworzyłem nową stronę o nazwie „Szybki ruch w ciągu 60 dni” i dodałem pętlę, tworząc dla niej szablon strony.
nurain
7

Używam tego do niestandardowej paginacji i działa dobrze

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

// Zdefiniuj to dla każdego szablonu, takiego jak szablon-biuletyn

    <?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
źródło
Cześć funkcja custom_pagination () zdefiniuj w pliku funkcji motywu lub pliku funkcji wtyczki. a po umieszczeniu tego kodu w pliku szablonu Zdefiniuj to po części komentarza w powyższym kodzie = Zdefiniuj to dla dowolnego szablonu, takiego jak szablon-biuletyn dla dowolnego szablonu, takiego jak szablon-biuletyn, jeśli jakieś zapytanie, daj mi znać tutaj.
Adnan Limdiwala
Jakikolwiek problem dotyczący tego Ans Mam nadzieję, że będzie dla ciebie dobrze
Adnan Limdiwala,
3

To rozwiązanie działało dla mnie, wykorzystując część oryginalnego kodu nurain i odpowiedź Jana Fabry'ego:

<?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
źródło
2

Za pomocą tej metody możesz wyświetlić niestandardowy typ postu, dzięki czemu podział na strony może działać !!!

<?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
źródło