Ön sayfamda (her zaman en sonda) tek bir yazı olmasını istiyorum, ancak normal sayfalama çalışsın. Öyleyse ön sayfa 1, sonraki sayfa 2-11 (1-10 da iyidir), sonra 12-21 veya 11-20 vb. Yazmalıdır. Yapabileceğimi biliyorum bağlamına bağlı olarak gönderi sayısını değiştirebilirim , ancak bunu ana sayfada "1" olarak ayarlamak diğer sayfaların da yalnızca bir gönderi göstereceği anlamına gelir.
Benim asıl sorunum /page/2/
ve benzeri şeyler çalışır, ancak /page/1/
her zaman /
adresindeki gerçek ana sayfaya yönlendirir. Bu, sayfa 2-10'u gösterdiği için 2-10 arasındaki mesajların her zaman atlandığı anlamına gelir. I şu anda bunu benim arşivime bağlayarak çözüyorum, ancak bu, yılın ilk yazılarına geldiğinizde ideal değil ve daha az yazı var ve devam etmenin açık bir yolu yok.
offset
query parametresi kullanarak çözdüm. Bu, pre_get_posts
kancasında sorguyu düzenlememe izin verdi ve yeni bir sorgu olmadan bunu yapmanın en temiz yolu gibi görünüyor. Şimdi ana sayfa sadece bir yazı gösterir ve page/2/
2-11 mesajlarını gösterir. Tüm bağlantılar çalışmaya devam eder, başka bir değişiklik gerekmez.
add_action('pre_get_posts', 'set_offset_on_front_page');
function _set_offset_on_front_page(&$query)
{
if (is_front_page() && is_paged()) {
$posts_per_page = isset($query->query_vars['posts_per_page']) ? $query->query_vars['posts_per_page'] : get_option('posts_per_page');
// If you want to use 'offset', set it to something that passes empty()
// 0 will not work, but adding 0.1 does (it gets normalized via absint())
// I use + 1, so it ignores the first post that is already on the front page
$query->query_vars['offset'] = (($query->query_vars['paged'] - 2) * $posts_per_page) + 1;
}
}
Tamam, belki bu bunu yapmak için garip veya karmaşık bir yoldur, ancak benzer bir sorunum vardı (hoş geldiniz metni ve belirli bir kategorideki en yeni üç yazıyı ön sayfada görüntülemek istedim.
şuna benziyor: http://hinek.de (sayfa Almanca, üzgünüm)
Bu sizin için yol olabilirse ve sayfa şablonu için daha fazla bilgi veya kod örneğine ihtiyacınız varsa, yorum yazıp ben bu yazıyı düzenleyeceğim.
Wordpress 3.0.x kullandığınızı varsayıyorum?
Ön sayfada sadece bir yazıyı (hangi kategorideki) göstermek kolaydır. query_posts('post_per_page=1')
işlevini çağırmak yerine home.php
dosyanızda get_template_part('loop')
kullanın.
Bundan sonra normal çağrı yöntemlerini takip etmek biraz zor. loop.php
dosyanızda <?php global $paged; ?>
<?php if (have_posts()) : ?>
ifadesinden önce koymanızı ve sorgunuzu değiştirmek için $paged
değişkeni ve query_posts()
işlevini kullanmanızı öneririz.
loop.php
dosyanız aşağıdaki gibi görünecektir (not: test edilmedi):
<?php
global $paged;
if (!is_front_page() && $paged && $post->post_type == 'post') :
query_posts('posts_per_page=10&paged=' . ($paged - 1));
if (have_posts()) :
while (have_posts()) : the_post();
// Rest of the loop
endwhile;
endif;
endif;
?>
Sayfa 2, 1-10 arası mesajları gösterecek ve sayfa 3, 11 - 20 arası mesajları göstereceği için $paged - 1
kullandım.
Bu soru biraz eski ama bunu modern çağda bulanlar için asla query_posts diye çağırmamalısınız. Wordpress kodeksinden:
query_posts (), sayfanın ana sorgusunu, sorgunun yeni örneği ile değiştirerek değiştirmenin aşırı basit ve sorunlu bir yoludur. Verimsizdir (SQL sorgularını yeniden çalıştırır) ve bazı durumlarda (özellikle mesajların sayfalandırılmasıyla uğraşırken bile) tamamen başarısız olur.
...
TL; DR hiç query_posts () kullanmaz;
Bunun yerine, function.php içindeki pre_get_posts
hook'u aşağıdaki gibi kullanmalısınız:
function hwl_home_pagesize( $query ) {
// Behave normally for secondary queries
if ( is_admin() || ! $query->is_main_query() )
return;
if ( is_home() ) {
// Display only 1 post for the home page
$query->set( 'posts_per_page', 1 );
return;
}
// Otherwise, use whatever is set in the Wordpress Admin screen
$query->set( 'posts_per_page', get_option('posts_per_page'); );
}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );
Bununla birlikte, bazı durumlarda, (posta ofsetlerini ayarlama gibi) pre_get_posts
kanca kullanmanın sayfa numaralandırmanızı engelleyebileceğini unutmayın. Bunu düzeltmek süper zor değil, ama dikkat edilmesi gereken bir şey. Bunu düzeltmenin bir örneği var here .