web-dev-qa-db-ja.com

ホームページに7件の投稿を表示し、その後のページに9件の投稿を表示するにはどうすればよいですか。

私のサイトのホームページは9つの最新の投稿を表示するように設定され(管理者エリアの設定で)、それから一番下に私は訪問者がより多くの投稿を見ることを可能にする標準のページ付けリンクがあります。

私はホームページ(そしてホームページのみ)に7つの最新の投稿を表示させたいのですが、その後のページには2、3、4など9つの投稿が表示されています。カテゴリとアーカイブにも9つの投稿が表示されるようにします。

私がこれまでに試したすべての方法は、投稿の欠落や重複を招くか、ページネーションに余分なページが表示されて404になるかのいずれかです。

これまでのところ、ここに掲載されている答えのバリエーションを試してみました。

ページ付けは20ページ目の後に404を返します

そしてここでも(ケース#2:条件付きオフセット):

最初のページと残りのページ番号付きページの 'posts_per_page'設定は異なりますか?

どちらも私が達成したいことのために働くように思われません、しかし、私は私が解決策に近く、明らかな何かを見逃しているかもしれないような気がします。

これは私が試した(functions.phpに追加された)コードの最新版で、ページ付けリンクが多すぎる(最後のリンクは404)。

function home_paged_offset( $query ) {
$ppp = get_option( 'posts_per_page' );
$first_page_ppp = 7;
$paged = $query->query_vars[ 'paged' ];
if( $query->is_home() && $query->is_main_query() ) {
    if( !is_paged() ) {
        $query->set( 'posts_per_page', $first_page_ppp );
    } else {
        $paged_offset = $first_page_ppp + ( ($paged - 2) * $ppp );
        $query->set( 'offset', $paged_offset );
    }
}
}
add_action( 'pre_get_posts', 'home_paged_offset' );

function home_adjust_paged_offset_pagination( $found_posts, $query ) {
$ppp = get_option( 'posts_per_page' );
$first_page_ppp = 7;
$paged = $query->query_vars[ 'paged' ];
if( $query->is_home() && $query->is_main_query() ) {
    if( !is_paged() ) {
        return( $found_posts );
    } else {
        return( $found_posts - ($first_page_ppp - $ppp) );
    }
}
return $found_posts;
}
add_filter( 'found_posts', 'home_adjust_paged_offset_pagination', 10, 2 );
2
Paul Dixon

わかりましたこれは本当にトリッキーでした。私はこれまでWordPressのグローバル$wp_queryに嘘をつけることによってそれを回避することに成功しました。これはどうですか。

あなたのテーマのfunctions.phpでは、これらの関数を追加して、最初のページに7件の投稿を、他のページに9件の投稿を表示することができます。

さて、そのコードはこれまでのところうまくいきますが、最初のページのページ付けが正しくないことに気付くでしょう。どうして?これは、WordPressが最初のページのページあたりの投稿数(7)を使用し、(1000/7)=合計投稿数のように分割してページ数を取得するためです。しかし、次のページでは7ページではなく9ページの投稿を表示するようにページ付けを考慮に入れる必要があります。フィルタを使用するとこれはできませんが、the_posts_pagination()関数の直前にテンプレートにこのハックを追加すると期待通りに動作します。

トリックは、$ wp_queryグローバル変数内のmax_num_pagesをカスタム値に変更し、ページネーションリンクの表示中に最初のページにのみWPの計算を無視することです

global $wp_query;

// Needed for first page only
if ( ! $wp_query->is_paged ) {
    $all_posts_except_fp = ( $wp_query->found_posts - 7 ); // Get us the found posts except those on first page
    $wp_query->max_num_pages = ceil( $all_posts_except_fp / 9 ) + 1; // + 1 the first page we have containing 7 posts
}

そしてこれは、クエリをフィルタリングするためにfunctions.phpに入れるコードです。

add_action('pre_get_posts', 'myprefix_query_offset', 1 );
function myprefix_query_offset(&$query) {

    if ( ! $query->is_home() ) {
        return;
    }

    $fp = 7;
    $ppp = 9;

    if ( $query->is_paged ) {
        $offset = $fp + ( ($query->query_vars['paged'] - 2) * $ppp );
        $query->set('offset', $offset );
        $query->set('posts_per_page', $ppp );

    } else {
        $query->set('posts_per_page', $fp );
    }

}

add_filter('found_posts', 'myprefix_adjust_offset_pagination', 1, 2 );
function myprefix_adjust_offset_pagination($found_posts, $query) {

    $fp = 7;
    $ppp = 9;

    if ( $query->is_home() ) {
        if ( $query->is_paged ) {
            return ( $found_posts + ( $ppp - $fp ) );
        }
    }
    return $found_posts;
}
1
Ahmed Fouad

関数ページネーション($ query_string){グローバル$ posts_per_page、$ paged。 $ my_query = new WP_Query($ query_string。 "&posts_per_page = -1"); $ total_posts = $ my_query-> post_count; if(empty($ paged))$ paged = 1の場合$ prev = $ paged - 1; $ next = $ paged + 1; $範囲= 5。 $ showitems =($範囲* 2)+1; $ pages = ceil($ total_posts/$ posts_per_page); if(1!= $ pages){echo ''; echo($ paged> 1 && $ showitems <$ pages)? '"': ""; for($ i = 1; $ i <= $ pages; $ i ++){if(1!= $ pages &&(!($ i> = $ paged + $ range-0 || $ i <= $ paged- $ range) -1)|| $ pages <= $ showitems)){echo($ paged == $ i)? echo($ paged <$ pages && $ showitems <$ pages)? ''。$ i。 '': ''。$ i。 '';}} echo '"': ""; echo "\ n";}}