トップページに単一の投稿を表示するが、通常のページングがある方法は?


9

フロントページ(常に最新)に1つの投稿を掲載したいのですが、通常のページングが機能します。したがって、最初のページには投稿1があり、次のページには投稿2-11(1-10でも結構です)、次に12-21または11-20と続きます。コンテキスト応じて投稿数を変更できることはわかっていますが、ホームページでこれを「1」に設定すると、以降のページにも1つの投稿のみが表示されます。

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

回答:


7

クエリパラメータを使用し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;
    }
}

これが機能する場合、OPはこれを使用する必要があります。
john010117 2010

質問とこの回答を書いたので、どちらにしますか。しかし、あなたの提案をありがとう、彼らは私を正しい軌道に乗せました。
Jan Fabry

正しいページ付けを維持しながら、1ページ目に最新の2つの投稿のみを表示して、archive.phpまたはcategory.phpで機能する可能性はありますか?ありがとう!
2011

@アミット:またはに置き換えるis_front_page()と、必要な場所に到達できると思います。is_archive()is_category()
Jan Fabry

3

OK、多分これは奇妙または複雑な方法ですが、同様の問題がありました(ウェルカムテキストと特定のカテゴリの最新の3つの投稿をフロントページに表示したかったので、次のようにしました:

  1. homeという新しいページを作成し、ウェルカムテキストをその上に配置しました。
  2. デフォルトのホームページを非アクティブ化し、カスタムホームページを開始ページとして設定しました
  3. 新しい(既存のものをコピーして変更した)ページテンプレートを作成した
    1. ページの本文を表示させます
    2. カテゴリXの最新の投稿を3つ読み込んで表示する
    3. / category / category-x /にリンクしているその下に「その他」のリンクがある

このように見えます:http : //hinek.de(ページはドイツ語です、申し訳ありません)

これがあなたのための方法である可能性があり、ページテンプレートの詳細情報またはコードサンプルが必要な場合は、コメントしてください。私はこの投稿を編集します。


これは、「...のメッセージ」カテゴリの投稿のみを表示し、そのカテゴリページに移動して通常のページングを使用できるため機能します。すべてのカテゴリの投稿を表示したいので、この方法ではうまくいきません。すべてのカテゴリのすべての投稿を閲覧できる場所がありませんか?
Jan Fabry、2010

1

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

フロントページに1つの投稿のみ(どのカテゴリでも)を表示するのは簡単です。を呼び出す代わりにファイルで使用query_posts('post_per_page=1')します。home.phpget_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を表示する、というように単純に使用しました。


pagedパラメータを変更しても、next_posts_link?のような他のものは壊れません。多分それはpre_get_postsフックでクエリを変更する方が良いので、新しいクエリを作成しませんか?そして、はい、これはWP 3です
月ファブリ

AFAIK、それは影響を与えるべきではありませんnext_posts_link。もちろん、実際に試してみるしか方法はありません。
john010117 2010

1
ああ、フックのpagedパラメーターを編集しようとするとpre_get_postsredirect_canonicalキックしてURLを新しいpagedパラメーターに置き換えたいと思います。この場合、リダイレクトを無効にできますが、新しい値に設定されるnext_posts_linkグローバル$paged変数を使用しますが、どのコードでそれがわからないので、正しくありません。
Jan Fabry、2010

実際に私のコードを使用してみて、それが機能するかどうかを確認しましたか?私はpre_get_postsフックにあまり慣れていないので、そこにはあまり助けがありません。また、が心配な場合は、$paged変数を直接変更してみてください(例:)。$paged = $paged - 1)next_posts_link()
john010117 2010

0

この質問は少し古いですが、現代の時代にこれを見つけた人は、query_postsを呼び出さないでください。Wordpress codexから:

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

...

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

代わりに、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フックを使用するとページ付けが損なわれる可能性があることに注意してください。これを修正することは難しいことではありませんが、注意する必要があります。これを修正する方法の例がここにあります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.