フロントページに単一の投稿を表示する方法は、通常のページングがありますか?

wordpress.stackexchange https://wordpress.stackexchange.com/questions/194

  •  16-10-2019
  •  | 
  •  

質問

フロントページ(常に最新)に1つの投稿をしたいのですが、通常のページングをしてみましょう。そのため、フロントページには投稿1があり、次のページには2〜11ポスト(1-10も問題ありません)、次に12-21または11-20などが必要です。自分ができるということがわかっている コンテキストに応じて投稿数を変更します, 、しかし、これをホームページの「1」に設定すると、さらにページが1つの投稿のみを表示することを意味します。

私の主な問題はそれです /page/2/ そのような作品など /page/1/ 常に実際のホームページにリダイレクトし、 /. 。これは、ページ2に11〜20を示しているため、投稿2〜10が常にスキップされることを意味します。私 現在 私のアーカイブにリンクしてこれを解決しますが、これはあなたが来たときに理想的ではありません 今年の最初の投稿 そして、投稿が少なく、明らかな継続方法はありません。

役に立ちましたか?

解決

私はそれを使って解決しました offset クエリパラメーター. 。これにより、でクエリを編集することができました pre_get_posts フック、そして新しいクエリなしでこれを行うための最もクリーンな方法のようです。これで、ホームページには1つの投稿だけが表示されます。 page/2/ 投稿2-11を示します。すべてのリンクは機能し続け、他の変更は必要ありません。

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

他のヒント

OK、これはこれを行うための奇妙または複雑な方法かもしれませんが、私は同様の問題を抱えていました(私は歓迎のテキストと、フロントページに特定のカテゴリの3つの最新の投稿を表示したかったのです。

  1. Homeという新しいページを作成して、私の歓迎のテキストを入れました。
  2. デフォルトのホームページを非アクティブ化し、カスタムホームページを開始ページとして設定します
  3. 新しい(既存のコピーおよび変更された既存の)ページテンプレートを作成しました
    1. ページ本文を表示します
    2. カテゴリXの3つの最新の投稿をロードして表示します
    3. /category/category-x/をリンクするリンク「more」があります

このように見えます: http://hinek.de (ページはドイツ語です、ごめんなさい)

これがあなたにとっての道であり、ページテンプレートにもっと多くのinfosまたはコードサンプルが必要な場合は、コメントしてください。この投稿を編集します。

WordPress 3.0.xを実行していると思いますか?

フロントページに1つの投稿(どのカテゴリでも)のみを表示するのは簡単です。使用する query_posts('post_per_page=1') あなたの中で home.php 呼び出す代わりにファイル get_template_part('loop').

その後、通常のページング方法に従うことは少し難しいです。あなたの中で loop.php ファイル、私は置くことをお勧めします <?php global $paged; ?> の前に <?php if (have_posts()) : ?> 声明、および使用 $paged 変数と query_posts() クエリを変更して、正しい投稿を表示して機能します。

あなたの loop.php ファイルは次のようになります(注:テストされていません):

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

使った $paged - 1 単に2ページが投稿1-10を示し、3ページが投稿11-20などを示します。

この質問は少し古いですが、現代でこれを見つけた人にとっては、決して電話してはいけません query_posts. 。 WordPress Codexから:

query_posts()は、ページを新しいインスタンスの新しいインスタンスに置き換えることにより、ページのメインクエリを変更するための過度に単純で問題のある方法です。それは非効率的であり(SQLクエリを再実行)、状況によっては完全に失敗します(特に、Paginationの投稿を扱う場合)。

...

tl; dr query_posts()everを使用しないでください。

代わりに、を使用する必要があります pre_get_posts 次のようにfunctions.phpをフック:

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

ただし、場合によっては(郵便局の調整など)、を使用してください。 pre_get_posts フックはあなたのページネーションをマングルすることができます。これを修正することは非常に困難ではありませんが、それは注意すべきことです。これを修正する方法の例があります ここ.

ライセンス: CC-BY-SA帰属
所属していません wordpress.stackexchange
scroll top