it-swarm.asia

Ön sayfadaki tek sayfa nasıl yazılır normal sayfalama yapılır?

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

8
Jan Fabry

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;
    }
}
6
Jan Fabry

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.

  1. Ev adı verilen yeni bir sayfa yarattı ve hoş geldiniz metnimi buraya yaz.
  2. Varsayılan giriş sayfasını devre dışı bıraktım ve özel giriş sayfamı başlangıç ​​sayfası olarak ayarla
  3. Yeni bir sayfa oluşturuldu (kopyalandı ve değiştirildi) sayfa şablonu
    1. sayfa gövdesini göstermesine izin ver
    2. x kategorisindeki en yeni üç gönderiyi yükleyin ve bunları görüntüleyin
    3. / category/category-x/'a bağlanan "more" bağlantısına sahip

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

3
Hinek

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.

1
john010117

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 .

0
lfalin