web-dev-qa-db-ja.com

フロントページに単一の投稿を表示するが、通常のページングを行うにはどうすればよいですか?

私は自分のフロントページに一つの投稿をしたいのですが(いつも最新のものですが)、通常のページングを有効にしましょう。そのため、フロントページの投稿は1、次のページの投稿は2-11(1-10でも構いません)、次に12-21または11-20などとなります。 コンテキストに応じて投稿数を変更できることを知っています しかし、ホームページでこれを "1"に設定すると、それ以降のページにも1つの投稿しか表示されなくなります。

私の主な問題は、/page/2/などが機能することですが、/page/1/は常に実際のホームページ、/にリダイレクトします。これは、2ページ目に11-20が表示されているため、ポスト2〜10は常にスキップされることを意味します。私は - 現在 私のアーカイブにリンクすることによってこれを解決しますが、 今年の最初の投稿に来た場合 - これは理想的ではありません .

8
Jan Fabry

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

わかりました、多分これは奇妙なまたは複雑な方法ですが、私は同様の問題を抱えていました(私はウェルカムテキストと特定のカテゴリの最新の3つの投稿をフロントページに表示したいと思いました。

  1. Homeという名前の新しいページを作成し、その上にウェルカムテキストを配置します。
  2. デフォルトのホームページを無効にし、私のカスタムホームページをスタートページに設定する
  3. 新しい(既存のものをコピーして変更した)ページテンプレートを作成しました
    1. ページ本文を表示させる
    2. カテゴリーXの最新の投稿を3つロードして表示する
    3. その下に "more"というリンクがあり、/ category/category-x /にリンクしている

http://hinek.de (ページはドイツ語で書かれています、ごめんなさい)

これがあなたのための方法であるかもしれなくて、あなたがより多くの情報またはページテンプレートのためのコードサンプルを必要とするならば、コメントしてください、そして、私はこのポストを編集します。

3
Hinek

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

フロントページに1つの投稿だけを表示するのは簡単です。 query_posts('post_per_page=1')を呼び出す代わりに、home.phpファイルで get_template_part('loop') を使用します。

その後通常のページング方法に従うのは少しトリッキーです。 loop.phpファイルでは、<?php if (have_posts()) : ?>ステートメントの前に<?php global $paged; ?>を置き、$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の投稿が表示されるからです。

1
john010117

この質問は少し古いですが、現代の時代にこれを見つけた人たちのために、 query_posts を呼び出すべきではありません。 Wordpressのコーデックスから:

query_posts()は、ページのメインクエリを新しいクエリインスタンスに置き換えることによって変更する、非常に単純で問題の多い方法です。これは非効率的で(SQLクエリを再実行する)、状況によっては完全に失敗する可能性があります(特に投稿ページ付けを扱うときによくあります)。

...

TL; DRはquery_posts()を使用しません。

代わりに、次のようにfunctions.phpのpre_get_postsフックを使うべきです。

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フックを使用するとページ区切りがめちゃくちゃになることがあります。これを修正することはそれほど難しいことではありませんが、気をつけるべきことです。これを修正する方法の例があります ここ

0
lfalin