Paginarea nu funcționează cu o buclă personalizată
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ă?

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.

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

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

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.

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

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

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' => __('◄'), //săgeată stânga
'next_text' => __('►'), //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>

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.

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

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