첫 페이지에 다른 수의 게시물이 있습니다.


12

첫 페이지의 다른 페이지와 다른 페이지 당 게시물 수를 가져야합니다.

예를 들어, 이것이 내가 필요한 것입니다

  • 총 게시물 : 6
  • 첫 페이지 : 게시물 3 개 표시
  • 다음 페이지 : 페이지 당 2 개의 게시물 표시

내 코드는 다음과 같습니다.

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$fp_limit = 3; // first page limit
$limit = 2; // following page limit
$offset = 0; // default offset

if( $paged == 1 ) {
    $limit = $fp_limit;
} else {
    $offset = $fp_limit + ( ($paged - 2) * $limit );
}

$args = array(
    'post_type' => 'my_post_type',
    'post_status' => 'publish',
    'offset' => $offset,
    'posts_per_page' => $limit,
    'caller_ get_ posts' => -1, // remove sticky post
    'paged' => $paged,
    'tax_query' => array(
        array(
            'taxonomy' => 'my_taxo',
            'field' => 'slug',
            'terms' => array('slug1', 'slug2', 'slug3')
        )
    )
);
$my_query = null;
$my_query = new WP_Query($args);

// basic loop
if( $my_query->have_posts() ) : 
while ($my_query->have_posts()) : $my_query->the_post();

...

endwhile; endif; // archive loop
if (function_exists('wp_pagenavi')){ wp_pagenavi( array( 'query' => $my_query ) ); }

wp_reset_query();

아카이브의 첫 페이지에서이 코드는 다음을 가정합니다.

글 당 6 개의 게시물과 3 개의 게시물이 있습니다. 그래서 나는 2 개의 아카이브 페이지가 필요하며 내가 당신에게 제시하는 페이지 매김은 다음과 같습니다.

[1] [2]

그러나 코드의 아카이브에있는 다른 페이지는 다음을 가정합니다.

글당 총 6 개의 게시물과 2 개의 게시물이 있습니다. 그래서 나는 3 개의 아카이브 페이지가 필요하며 내가 당신에게 제시하는 페이지 매김은 다음과 같습니다.

[1] [2] [3]

이 문제를 해결하려면 약간의 도움이 필요합니다.


WP_pagenavi에게 첫 번째 페이지와 나머지 페이지의 게시물 수를 알려줄 수 있다면 ...
norixxx

왜 이렇게해야합니까? 특별한 이유
Pieter Goosen

내 고객의 이기심. 실제로 wp_pagenavi를 사용하는지 여부는 상관하지 않습니다. 다른 기술을 사용할 수 있습니까?
norixxx

2
먼저 'caller_ get_ posts'공백이 포함되어 있으며 유효하지 않습니다. 둘째, 더 이상 사용되지 않습니다. ignore_sticky_posts대신 사용하십시오 .
카이저

귀하의 홈페이지는 일반 홈페이지이거나 첫 페이지로 설정되었습니다
Pieter Goosen

답변:


22

편집-답변 다시 확인

나는 실제로 원래의 대답보다 나은 다른 솔루션을 연구하고 있습니다. 이것은 사용자 정의 쿼리를 포함하지 않으며 모든 목적을 위해 원래의 답변을 삭제할 수는 있지만 정보를 제공하기 위해 유지됩니다

나는 아직도 당신이 홈페이지에 있다고 믿고 이것을 또한 그렇게 취급 할 것입니다. 그래서 이것은 나의 새로운 해결책입니다

1 단계

홈페이지에서 맞춤 검색어를 삭제하고 기본 루프로 교체

<?php

        if ( have_posts() ) :
            // Start the Loop.
            while ( have_posts() ) : the_post();

                ///<---YOUR LOOP--->

            endwhile;

                //<---YOUR PAGINATION--->   

            else : 

                //NO POSTS FOUND OR SOMETHING   

            endif; 

    ?>

2 단계

사용하여 pre_get_posts홈 페이지에 표시 메인 쿼리에 사용자 정의 분류를 추가 할 주요 쿼리를 변경할 수 있습니다.

3 단계

이제 posts_per_page백엔드에서 옵션 세트 (2라고 가정)를 가져오고 사용할 옵션을 설정하십시오 offset. 즉 될 것입니다 1당신이 나머지 1 페이지 2 3 게시물 필요하므로

$ppg = get_option('posts_per_page');
$offset = 1;

4 단계

페이지 하나에, 당신은 추가해야합니다 offsetposts_per_page페이지 하나에 당신의 세 가지 게시물을 얻기 위해 3 개까지 추가 할 것입니다.

$query->set('posts_per_page', $offset + $ppp);

5 단계

offset모든 후속 페이지에 적용해야합니다 . 그렇지 않으면 다음 페이지에서 페이지의 마지막 게시물이 반복됩니다.

$offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('posts_per_page',$ppp);
$query->set('offset',$offset); 

6 단계

마지막으로, found_posts마지막 페이지의 페이지 매김이 잘못되고 404잘못된 게시물 수로 인해 마지막 게시물이 누락 되어 오류가 발생합니다.

참고 :이 코드는 검색 페이지에서 페이지 매김을 일으켰습니다. 이제 수정되었습니다. 업데이트 된 코드를 참조하십시오.

function homepage_offset_pagination( $found_posts, $query ) {
    $offset = 1;

    if( $query->is_home() && $query->is_main_query() ) {
        $found_posts = $found_posts - $offset;
    }
    return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );

모두 함께

이것이 완전한 쿼리가 함수에 들어가는 모습입니다.

function tax_and_offset_homepage( $query ) {
  if ($query->is_home() && $query->is_main_query() && !is_admin()) {
    $query->set( 'post_type', 'my_post_type' );
    $query->set( 'post_status', 'publish' );
    $query->set( 'ignore_sticky_posts', '-1' );
    $tax_query = array(
        array(
            'taxonomy' => 'my_taxo',
            'field' => 'slug',
            'terms' => array('slug1', 'slug2', 'slug3')
        )
    );
    $query->set( 'tax_query', $tax_query );
    $ppp = get_option('posts_per_page');
    $offset = 1;
    if (!$query->is_paged()) {
      $query->set('posts_per_page',$offset + $ppp);
    } else {
      $offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
      $query->set('posts_per_page',$ppp);
      $query->set('offset',$offset);
    }
  }
}
add_action('pre_get_posts','tax_and_offset_homepage');

function homepage_offset_pagination( $found_posts, $query ) {
    $offset = 1;

    if( $query->is_home() && $query->is_main_query() ) {
        $found_posts = $found_posts - $offset;
    }
    return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );

4

나는 이것이 1000 년 전의 것이라는 것을 알고 있지만 사용자 정의 쿼리를 사용하는 동안이 솔루션을 찾는 다른 사람들을위한 또 다른 솔루션은 다음과 같습니다. 이 예에서 첫 번째 페이지에는 10 개의 게시물이 필요했으며 모든 후속 페이지에는 9가 필요합니다.

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
if( $paged == 1 ) {
   $limit = 10;
} else {
   $limit = 9;
}

그리고 배열에서 이것을 사용하십시오 :

'posts_per_page' => $limit,

이제 잘가요


2
작동하지 않습니다. 이것으로 10 번 포스트가 두번 표시됩니다. 두 번째 페이지를 진행할 때 첫 번째 페이지에도 9 개의 게시물이 표시되어 "첫 번째 페이지에 이미 표시되었지만 10 번 게시물이 표시되기 시작합니다."
leymannx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.