私は自分のフロントページに一つの投稿をしたいのですが(いつも最新のものですが)、通常のページングを有効にしましょう。そのため、フロントページの投稿は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;
}
}
わかりました、多分これは奇妙なまたは複雑な方法ですが、私は同様の問題を抱えていました(私はウェルカムテキストと特定のカテゴリの最新の3つの投稿をフロントページに表示したいと思いました。
http://hinek.de (ページはドイツ語で書かれています、ごめんなさい)
これがあなたのための方法であるかもしれなくて、あなたがより多くの情報またはページテンプレートのためのコードサンプルを必要とするならば、コメントしてください、そして、私はこのポストを編集します。
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の投稿が表示されるからです。
この質問は少し古いですが、現代の時代にこれを見つけた人たちのために、 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
フックを使用するとページ区切りがめちゃくちゃになることがあります。これを修正することはそれほど難しいことではありませんが、気をつけるべきことです。これを修正する方法の例があります ここ 。