Paginarea nu funcționează cu o buclă personalizată

30 nov. 2010, 20:44:43
Vizualizări: 33.7K
Voturi: 43

Am o buclă personalizată pe care o folosesc pentru a afișa anunțuri imobiliare ce vor fi disponibile în următoarele 60 de zile. O apelez folosind următoarea funcție:

<?php 
// Calculează data peste 60 de zile
$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(); ?>

În timp ce bucla funcționează perfect, nu reușesc să o paginez. Aceasta afișează primele 10 (setarea mea implicită) articole dar nu afișează paginarea. Singura modalitate de a afișa toate articolele este să le arăt pe o singură pagină adăugând 'posts_per_page' => -1, Am bucle similare pe alte pagini care nu au probleme cu paginarea. Singura diferență la aceasta este că există două chei meta care filtrează articolele.

Folosesc WP Page Navi pentru aceasta și restul paginilor mele. Închid bucla și adaug paginarea folosind următorul cod:

<?php endwhile; // Sfârșitul buclei. Uf. ?>
<?php wp_pagenavi(); ?>
<?php wp_reset_query(); ?>

Cum pot rezolva această problemă?

2
Comentarii

După ce am răspuns, am recitit întrebarea ta... Te refereai că pluginul tău pagenavi nu apărea sau că paginarea te ducea la o eroare 404?

eileencodes eileencodes
30 nov. 2010 22:02:28

WP Page Navi nu se afișează pe postările cu interogări similare (filtrate după mai mult de o cheie meta). Apare pe toate celelalte pagini precum arhive, blog, etc.

nurain nurain
30 nov. 2010 22:45:32
Toate răspunsurile la întrebare 5
4
41

Am întâlnit această problemă cu PageNavi înainte. Soluția mea este să preiau temporar variabila $wp_query și apoi să o reatribui după închiderea buclei. Un exemplu:

<?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 în partea de sus */
if (function_exists('wp_pagenavi')){wp_pagenavi();}
if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post();   

/* FACEM OPERAȚIUNI ÎN BUCLĂ */

endwhile; endif;
/* PageNavi în partea de jos */
if (function_exists('wp_pagenavi')){wp_pagenavi();}
$wp_query = null;
$wp_query = $temp;
wp_reset_query(); ?>

Ultimul pas este să reatribuim variabila $wp_query la valoarea inițială și apoi să resetăm interogarea la început.

*Editare:*Am corectat tag-ul php. Bună observație, sniper.

30 nov. 2010 22:30:55
Comentarii

Nu știu când PageNavi a făcut această modificare în plugin-ul lor, dar de la WordPress 3.0 a trebuit să preiau variabila $wp_query pentru a afișa paginarea pe bucle personalizate. Mă bucur că am putut ajuta! :D

PNMG PNMG
30 nov. 2010 23:36:31

wp_pagenavi() acceptă acum și argumentul query, așa că în loc să suprascrii $wp_query poți scrie wp_pagename( array( 'query' => $my_query ) ).

Jan Fabry Jan Fabry
17 feb. 2011 16:15:01

Această soluție a funcționat pentru mine. Aveam o altă buclă înaintea acesteia, așa că a trebuit să adaug un wp_reset_query() înainte de codul din exemplu.

Ryan Ryan
23 aug. 2011 23:25:35

Vezi acest răspuns pentru o altă posibilă soluție pentru Paginarea Numerică cu interogări personalizate folosind WP_Query();.

Michael Ecklund Michael Ecklund
18 apr. 2017 21:37:45
1
12

Am avut o problemă similară mai devreme astăzi...

Aveți un tip de postare personalizată și o pagină sau postare cu același slug? Adică URL-ul unei pagini pe care o aveți este /real-estate și rescrierea URL-ului tipului de postare personalizată la /real-estate?

Dacă acesta este cazul, nu puteți avea 2 cu același URL, altfel WordPress se va încurca.

Puteți fie să schimbați URL-ul, fie să încercați aceasta http://wordpress.org/support/topic/pagination-with-custom-post-type-listing?replies=23#post-1637753. Eu am ales să-mi schimb URL-ul, dar cineva de acolo a scris o interogare personalizată pentru a ocoli problema

30 nov. 2010 21:56:03
Comentarii

Nu cred că am nimic numit la fel. De fapt, am creat o pagină nouă numită "Mutare Rapidă - 60 de Zile" și am adăugat loop-ul creând un șablon de pagină pentru ea.

nurain nurain
30 nov. 2010 23:08:19
2

Folosesc această soluție pentru paginare personalizată și funcționează corespunzător

//paginare pentru newsletter

     //definit în fișierul de funcții
      function custom_pagination($numpages = '', $pagerange = '', $paged='')  {

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

      /**
       * Această primă parte a funcției noastre este o soluție alternativă
       * pentru paginarea personalizată în interiorul unei bucle obișnuite care
       * utilizează variabilele globale $paged și $wp_query.
       * 
       * Este benefic deoarece putem înlocui acum paginarea implicită
       * din tema noastră și putem folosi această funcție atât în interogările
       * implicite cât și în cele personalizate.
       */

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

      /** 
       * Construim argumentele de paginare pentru a le introduce în funcția
       * paginate_links. 
       */

      $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;'), //săgeată stânga
        'next_text'       => __('&#9658;'), //săgeată dreapta
        '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'>Pagina " . $paged . " din " . $numpages . "</span> ";
          echo $paginate_links;
        echo "</nav>";
      }
    }
    ?>

// Definiți aceasta pentru orice șablon precum 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 { ?>
                 Nu s-au găsit liste de forum.
                <?php } ?>

              <div class="pagination">
                    <?php
                       if (function_exists(custom_pagination)) {
                        custom_pagination($posts->max_num_pages,"",$paged);
                       }
                       ?>
                 </div>
2 sept. 2016 07:51:24
Comentarii

Funcția custom_pagination() este definită în fișierul de funcții al temei sau în fișierul de funcții al pluginului. După aceea, puneți acest cod în fișierul template-ului. Definiți acest lucru după secțiunea de comentariu din codul de mai sus = Definiți acest lucru pentru orice șablon, cum ar fi template-newsletter pentru orice șablon, cum ar fi template-newsletter

Dacă aveți întrebări, lăsați-mă să știu aici.

Adnan Limdiwala Adnan Limdiwala
21 feb. 2017 08:55:29

Orice problemă legată de acest răspuns. Sper că funcționează bine pentru tine.

Adnan Limdiwala Adnan Limdiwala
7 apr. 2017 12:23:37
0

Aceasta este soluția care a funcționat pentru mine, folosind o parte din codul original al lui nurain și răspunsul lui Jan Fabry:

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$myquery = new WP_Query(
    array(
        'posts_per_page' => '2',
        'paged'=>$paged
        // adaugă orice alte parametre în array-ul wp_query
    )   
);  
?>

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

<!-- Începutul postării tale. Mai jos un exemplu: -->

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

<!-- Sfârșitul postării tale -->

<?php endwhile; ?>
<?php wp_pagenavi( array( 'query' => $myquery ) ); ?><!-- IMPORTANT: asigură-te că incluzi un array cu valorile query declarate anterior aici -->
<?php wp_reset_query(); ?>
<?php else : ?>
<p>Nu s-au găsit postări</p>
<?php endif; ?>
28 iun. 2013 03:27:11
0

Puteți afișa tipul personalizat de postări folosind această metodă, iar paginarea va funcționa!!!

<?php
  query_posts( array( 'post_type' => 'post', 'posts_per_page' => '2', 'paged' =>     get_query_var( 'paged' ) ) ); 

  if (have_posts() ) :  while (have_posts() ) : the_post(); 
?>
<!-- Începeți postarea. Mai jos este un exemplu: -->
<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>
<!-- Sfârșitul postării -->
<?php endwhile; ?>
<?php wp_pagenavi(); ?><!-- IMPORTANT: asigurați-vă că includeți un array cu valorile interogării declarate anterior aici -->
<?php wp_reset_query(); ?>
<?php else : ?>
<p>Nu s-au găsit postări</p>
<?php endif; ?>
17 dec. 2014 12:35:22