Sorun
Varsayılan olarak, herhangi bir bağlamda, WordPress sayfalamayı belirlemek için ana sorguyu kullanır. Ana sorgu nesnesi, $wp_query
ana sorgu döngüsünün çıktısını almak için de kullanılan globalde saklanır :
if ( have_posts() ) : while ( have_posts() ) : the_post();
Ne zaman özel bir sorgu kullanmak , sen tamamen ayrı bir sorgu nesnesi oluşturmak:
$custom_query = new WP_Query( $custom_query_args );
Ve bu sorgu tamamen ayrı bir döngü aracılığıyla elde edilir:
if ( $custom_query->have_posts() ) :
while ( $custom_query->have_posts() ) :
$custom_query->the_post();
Ama dahil sayfalandırma şablon etiketleri previous_posts_link()
, next_posts_link()
, posts_nav_link()
, ve paginate_links()
, kendi çıkışını dayandırmak ana sorgu nesnesi , $wp_query
. Bu ana sorgu sayfalandırılmış olabilir veya olmayabilir. Geçerli içeriğin bir özel sayfa şablonu ise, örneğin, ana $wp_query
amacı, sadece oluşacak tek bir yayın - özel sayfa şablonu atandığı sayfanın kimliğinin olduğu.
Geçerli içerik bir tür arşiv dizini ise, ana sayfa $wp_query
, sorunun bir sonraki bölümüne yol açan sayfalandırmaya neden olacak kadar yayın içerebilir: ana $wp_query
nesne için WordPress paged
, sorguyu temel alan bir parametreyi iletir. paged
URL sorgu değişkeni. Sorgu getirildiğinde, bu paged
sayfalandırılmış hangi sayfaların döndürüleceğini belirlemek için kullanılır. Görüntülenen bir sayfalama bağlantısı tıklanır ve bir sonraki sayfa yüklenirse, özel sorgunuz sayfalamanın değiştiğini bilmenin bir yolunu bulamaz .
Çözüm
Özel Sorguya Doğru Sayfalı Parametreyi Geçmek
Özel sorgunun bir args dizisi kullandığını varsayarak:
$custom_query_args = array(
// Custom query parameters go here
);
paged
Diziye doğru parametreyi iletmeniz gerekir. Bunu, şu anki sayfayı belirlemek için kullanılan URL sorgusu değişkenini aşağıdakiler yoluyla alarak yapabilirsiniz get_query_var()
:
get_query_var( 'paged' );
Daha sonra bu parametreyi özel sorgu args dizinize ekleyebilirsiniz:
$custom_query_args['paged'] = get_query_var( 'paged' )
? get_query_var( 'paged' )
: 1;
Not: Sayfanız ise statik ön sayfa , kullandığınızdan emin olun page
yerine paged
statik bir ön sayfa kullandığından page
değil paged
. Statik bir ön sayfa için sahip olmanız gereken şey budur
$custom_query_args['paged'] = get_query_var( 'page' )
? get_query_var( 'page' )
: 1;
Şimdi, özel sorgu alındığında, doğru bir şekilde sayfalanmış yayınlar kümesi döndürülecek.
Sayfalandırma İşlevleri İçin Özel Sorgu Nesnesi Kullanma
Sayfalandırma işlevlerinin doğru çıktı vermesi için - yani, özel sorguya göre önceki / sonraki / sayfa bağlantıları - WordPress'in özel sorguyu tanıması için zorlanması gerekir. Buna "kesmek" biraz gerektirir: Ana değiştirirken $wp_query
, özel sorgu nesnesi ile nesneyi $custom_query
:
Ana sorgu nesnesini kes
- Ana sorgu nesnesini yedekle:
$temp_query = $wp_query
- Ana sorgu nesnesini boş bırakın:
$wp_query = NULL;
Özel sorguyu ana sorgu nesnesine yerleştirin: $wp_query = $custom_query;
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $custom_query;
Bu "kes" sayfalama işlevlerini çağırmadan önce yapılmalıdır
Ana sorgu nesnesini sıfırla
Sayfalandırma işlevleri çıktığında ana sorgu nesnesini sıfırlayın:
$wp_query = NULL;
$wp_query = $temp_query;
Sayfalandırma İşlev Düzeltmeleri
previous_posts_link()
Fonksiyon ne olursa olsun bir şekilde sayfa numarası, normal şekilde çalışacaktır. Yalnızca geçerli sayfayı belirler ve sonra bağlantıyı çıkarır page - 1
. Ancak, next_posts_link()
düzgün bir şekilde çıktı almak için bir düzeltme gerekir. Bunun nedeni next_posts_link()
kullandığı max_num_pages
parametre:
<?php next_posts_link( $label , $max_pages ); ?>
Diğer sorgu parametrelerinde olduğu gibi, işlev varsayılan max_num_pages
olarak ana $wp_query
nesne için kullanır . Nesneyi next_posts_link()
hesaba katmaya zorlamak için, işleve $custom_query
geçmeniz gerekir max_num_pages
. Bu değeri $custom_query
nesneden alabilirsiniz $custom_query->max_num_pages
:
<?php next_posts_link( 'Older Posts' , $custom_query->max_num_pages ); ?>
Hepsini bir araya koy
Düzgün işleyen sayfalandırma işlevlerine sahip özel bir sorgu döngüsünün temel yapısı aşağıdadır:
// Define custom query parameters
$custom_query_args = array( /* Parameters go here */ );
// Get current page and append to custom query parameters array
$custom_query_args['paged'] = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
// Instantiate custom query
$custom_query = new WP_Query( $custom_query_args );
// Pagination fix
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $custom_query;
// Output custom query loop
if ( $custom_query->have_posts() ) :
while ( $custom_query->have_posts() ) :
$custom_query->the_post();
// Loop output goes here
endwhile;
endif;
// Reset postdata
wp_reset_postdata();
// Custom query loop pagination
previous_posts_link( 'Older Posts' );
next_posts_link( 'Newer Posts', $custom_query->max_num_pages );
// Reset main query object
$wp_query = NULL;
$wp_query = $temp_query;
Zeyilname: Ne hakkında query_posts()
?
query_posts()
İkincil döngüler için
query_posts()
Özel bir döngü oluşturmak için kullanıyorsanız WP_Query()
, o zaman özel sorgu için ayrı bir nesneyi kullanarak başlatmak , o zaman siz _doing_it_wrong()
(ve en azından sayfalama sorunları olacak) birkaç soruna rastlayacaksınız. Bu sorunları çözmenin ilk adımı, yanlış kullanımı query_posts()
uygun bir WP_Query()
çağrıya dönüştürmek olacaktır .
query_posts()
Ana Döngüyü Değiştirmek İçin Kullanma
Ana döngü sorgusu için parametreleri değiştirmek isterseniz - örneğin sayfa başına yazılanları değiştirmek veya bir kategori hariç bırakmak gibi - kullanmak isteyebilirsiniz query_posts()
. Ama yine de yapmamalısın. Kullandığınızda query_posts()
, WordPress'i ana sorgu nesnesini değiştirmeye zorlarsınız . (WordPress aslında ikinci bir sorgu yapar ve üzerine yazar $wp_query
.) Sorun, yine de, sayfa değiştirme güncellemesi sürecinde bu değişikliği çok geç yapmasıdır.
Çözüm, gönderiler alınmadan öncepre_get_posts
kanca aracılığıyla ana sorguyu filtrelemektir .
Bunu kategori şablonu dosyasına ( category.php
) eklemek yerine :
query_posts( array(
'posts_per_page' => 5
) );
Aşağıdakileri ekleyin functions.php
:
function wpse120407_pre_get_posts( $query ) {
// Test for category archive index
// and ensure that the query is the main query
// and not a secondary query (such as a nav menu
// or recent posts widget output, etc.
if ( is_category() && $query->is_main_query() ) {
// Modify posts per page
$query->set( 'posts_per_page', 5 );
}
}
add_action( 'pre_get_posts', 'wpse120407_pre_get_posts' );
Bunu blog yazısı dizin şablon dosyasına ( home.php
) eklemek yerine :
query_posts( array(
'cat' => '-5'
) );
Aşağıdakileri ekleyin functions.php
:
function wpse120407_pre_get_posts( $query ) {
// Test for main blog posts index
// and ensure that the query is the main query
// and not a secondary query (such as a nav menu
// or recent posts widget output, etc.
if ( is_home() && $query->is_main_query() ) {
// Exclude category ID 5
$query->set( 'category__not_in', array( 5 ) );
}
}
add_action( 'pre_get_posts', 'wpse120407_pre_get_posts' );
Bu şekilde, WordPress sayfa değişikliği $wp_query
belirlenirken önceden değiştirilmiş nesneyi kullanır, şablon değişikliği gerekmez.
Hangi işlevi ne zaman kullanmalı
Araştırma bu soruyu ve cevabı ve bu soru cevap nasıl ve ne zaman kullanmak anlamak için WP_Query
, pre_get_posts
ve query_posts()
.