Die Paginierung funktioniert nicht mit der benutzerdefinierten Schleife


41

Ich habe eine benutzerdefinierte Schleife, mit der ich einige Immobilienlisten anzeige, die innerhalb von 60 Tagen verfügbar sein werden. Ich rufe es mit folgender Funktion auf:

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

Während die Schleife großartig funktioniert, kann ich sie nicht zum Paginieren bringen. Es zeigt die ersten 10 (meine Standard) Beiträge, aber nicht die Paginierung. Die einzige Möglichkeit, alle Beiträge anzuzeigen, besteht darin, sie auf einer Seite anzuzeigen, indem Sie hinzufügen, dass 'posts_per_page' => -1,ich ähnliche Schleifen auf anderen Seiten habe, bei denen das Paginieren kein Problem darstellt. Der einzige Unterschied zu diesem ist, dass es zwei Metaschlüssel gibt, die die Beiträge filtern.

Ich benutze WP Page Navi für diesen und den Rest meiner Seiten. Ich schließe die Schleife und füge die Paginierung mit dem folgenden Code hinzu:

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

Wie kann ich das beheben?


Nach der Beantwortung habe ich Ihre Frage noch einmal gelesen ... Meinten Sie, dass Ihr Pagenavi-Plugin nicht angezeigt wurde oder dass die Paginierung Sie auf einen 404 brachte?
Eileencodes

WP Page Navi wird nicht in Posts mit ähnlichen Abfragen angezeigt (gefiltert nach mehr als einem Metaschlüssel). Es erscheint auf allen anderen Seiten wie Archiven, Blogs usw.
nurain 30.11.10

Antworten:


38

Ich habe dieses Problem schon einmal mit PageNavi erlebt. Meine Lösung besteht darin, die Variable $ wp_query vorübergehend zu hijacken und sie nach dem Schließen der Schleife erneut zuzuweisen. Ein Beispiel:

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

Der letzte Schritt besteht darin, die Variable $ wp_query der ursprünglichen Variable zuzuweisen und die Abfrage anschließend zum Starten zurückzusetzen.

* Bearbeiten: * Feste PHP-Tag. Guter Scharfschütze.


Ich weiß nicht, wann PageNavi diese Änderung in seinem Plugin vorgenommen hat, aber seit Wordpress 3.0 musste ich die Variable $ wp_query hijacken, damit die Paginierung in benutzerdefinierten Schleifen angezeigt wird. Froh, dass ich helfen konnte! : D
PNMG

8
wp_pagenavi() Akzeptiert jetzt auch das queryArgument , sodass Sie anstelle des Überschreibens $wp_queryschreiben können wp_pagename( array( 'query' => $my_query ) ).
Jan Fabry

Diese Lösung hat bei mir funktioniert. Ich hatte eine andere Schleife vor dieser, also musste ich vor dem Code im Beispiel eine wp_reset_query () einfügen.
Ryan

In dieser Antwort finden Sie eine weitere mögliche Lösung für die numerische Paginierung mit benutzerdefinierten Abfragen WP_Query();.
Michael Ecklund

10

Ich hatte heute früher ein ähnliches Problem ...

Haben Sie einen benutzerdefinierten Beitragstyp und eine Seite oder einen Beitrag mit demselben Slug? Bedeutet dies, dass die URL einer Seite, die Sie haben / immobilien, und die benutzerdefinierte Post-Typ-URL, die Sie unter / immobilien umschreiben?

Wenn das der Fall ist, können Sie nicht 2 mit der gleichen URL haben, sonst wird WordPress verwirrt.

Sie können entweder die URL ändern oder http://wordpress.org/support/topic/pagination-with-custom-post-type-listing?replies=23#post-1637753 versuchen . Ich habe beschlossen, meine URL zu ändern, aber jemand dort hat eine benutzerdefinierte Abfrage geschrieben, um das Problem zu umgehen


Ich glaube nicht, dass ich etwas mit demselben Namen habe. Ich habe tatsächlich eine neue Seite mit dem Namen "Quick Move In - 60 Days" erstellt und die Schleife hinzugefügt, indem ich eine Seitenvorlage dafür erstellt habe.
Nurain

6

Ich benutze dies für benutzerdefinierte Paginierung und seine Arbeit gut

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

// Definiere dies für jedes Template wie 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>

Hi custom_pagination () Funktion in Theme-Funktionsdatei oder Plugin-Funktionsdatei definieren. und nachdem Sie diesen Code in Ihre Vorlagendatei eingefügt haben Definieren Sie diesen Nach-Kommentar-Teil in obigem Code = Definieren Sie dies für alle Vorlagen wie Vorlagen-Newsletter für alle Vorlagen wie Vorlagen-Newsletter, wenn Sie Fragen haben, lassen Sie es mich hier wissen.
Adnan Limdiwala

Irgendwelche Fragen zu diesem Ans Ich hoffe, es funktioniert gut für Sie
Adnan Limdiwala

2

Dies ist die Lösung, die für mich funktioniert hat, indem ein Teil des Originalcodes von nurain und die Antwort von Jan Fabry verwendet wurden:

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

1

Sie können Ihren benutzerdefinierten Beitragstyp anzeigen, indem Sie diese Methode verwenden. Ihre Paginierung kann funktionieren !!!

<?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; ?>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.