고정 게시물이 페이지 당 게시물 수를 초과 함


21

pre_get_posts내 홈페이지에 표시되는 게시물 수를 조정하는 데 사용 하고 있습니다.

function lifelounge_query_adjust( $query ) {
    if ( is_home() ) {
        set_query_var( 'posts_per_page', 12 );
        return;
    }
}
add_filter( 'pre_get_posts', 'lifelounge_query_adjust' );

그러나 스티커 포스트에 문제가 있습니다. 내가 어떤 끈적 게시물이있는 경우 기본적으로 쿼리가 표시됩니다 가 (12 개) 표시하기 때문에, 내가 지정한 12 개 게시물보다 더한 어떤 끈적 게시물. 물론 끈적 끈적한 게시물을 무시할 수 있습니다.

function lifelounge_query_adjust( $query ) {
    if ( is_home() ) {
        set_query_var( 'posts_per_page', 1 );
        set_query_var( 'ignore_sticky_posts', 1 );
        return;
    }
}
add_filter( 'pre_get_posts', 'lifelounge_query_adjust' );

그러나 이것이 이상적이라고 생각하지 않습니다. 스티커 게시물은 12 게시물의 한도에 포함 되어야하며 한도에 추가 해서는 안된다고 생각합니다 . 그것이 저에게 가장 의미가있는 것입니다. 그것을 달성 할 수있는 방법이 있습니까? 얼굴에 맞는 오류를 범했습니까?

거의 복제본 : 페이지 당 고정 게시물 및 게시물 이지만 너무 현지화되어 이상하게 닫혔습니다. 나는 대답을 찾고 있기 때문에 분명히 동의하지 않지만, 스티커 포스트를 사용하는 경우 WordPress가 posts_per_page 한계 를 존중하지 않는 이유에 대한 질문이기 때문에 동의하지 않습니다 . 페이지 당 12 개의 게시물을 원하는 경우 13 개가 아닌 12 개의 게시물을 가져와야합니다. 이는 하나의 고정 된 게시물이있는 경우 얻을 수 있습니다.

답변:


12

다음은 고정 게시물 수 (있는 경우)를 가져 와서 고정 게시물을 계산 posts_per_page매개 변수 에 포함시키는 방법입니다 .

add_action('pre_get_posts', 'ad_custom_query');
function ad_custom_query($query) {

    if ($query->is_main_query() && is_home()) {

        // set the number of posts per page
        $posts_per_page = 12;
        // get sticky posts array
        $sticky_posts = get_option( 'sticky_posts' );

        // if we have any sticky posts and we are at the first page
        if (is_array($sticky_posts) && !$query->is_paged()) {

            // counnt the number of sticky posts
            $sticky_count = count($sticky_posts);

            // and if the number of sticky posts is less than
            // the number we want to set:
            if ($sticky_count < $posts_per_page) {
                $query->set('posts_per_page', $posts_per_page - $sticky_count);

            // if the number of sticky posts is greater than or equal
            // the number of pages we want to set:
            } else {
                $query->set('posts_per_page', 1);
            }

        // fallback in case we have no sticky posts
        // and we are not on the first page
        } else {
            $query->set('posts_per_page', $posts_per_page);
        }
    }
}

편집하다

설정하려는 페이지 당 게시물 수가 고정 게시물 수보다 작거나 같은 경우에는 1로 설정하면 첫 번째 posts_per_page게시물 $sticky_count + 1에만 13 개 이상의 게시물 (이 경우)이 표시됩니다. 페이지 (다음 페이지에는 12 개의 게시물이 있습니다). 이 경우는 드물고 첫 페이지의 +1 게시물이 그다지 중요하지 않기 때문에 괜찮습니다.

워드 프레스는 제 한 페이지 (첫 페이지) 자신의 카운트가보다 큰 경우에도 모든 끈적 게시물을 표시하기 때문입니다 posts_per_page, 매개 변수를 우리가 설정할 수 있도록 posts_per_page이다 가능한 최소한의 금액이 경우 1때문에, 0음수 값은 해제하고 posts_per_page매개 변수와 그 첫 페이지에있는 모든 게시물을 표시하는 워드 프레스를 만들 것입니다.


큰!! 나는 변경할 필요가 있다고 생각 $sticky_count + (12 - $sticky_count)12- $sticky_count하지만. 예를 들어, 끈적 끈적한 것이 1 인 경우 수학은 여전히 ​​12로 계산되고 WP는 스티커 포스트를 추가하여 13을 만듭니다. 오, if ($sticky_count > $posts_per_page)12로 설정하면 24+가 표시되지 않습니까?
helgatheviking

@ helgatheviking : 당신이 맞아요. 나는 항상 그런 바보 같은 실수를 저지르고 계산은 결코 흥미롭지 않았다. 그리고 그렇습니다. 이를 설명하기 위해 코드를 업데이트했으며 페이지 번호 확인을 추가했습니다. 이 잘 작동하지만, 지금은 하나의 경우가 될 것 $posts_per_page같 것 $sticky_count, 여기에 내가 1가되도록 posts_per_page 매개 변수를 설정, 나는 OK가 될 것입니다 생각부터 (이 경우 아마도 희귀하고 그 첫 번째 페이지에있을 것입니다 $sticky_count + 1).
Ahmad M

편집 해 주셔서 감사합니다! 나는 이것이 우리가 끈적 끈적한 게시물을 사용할 수있는 최상의 솔루션이라고 생각합니다. 게시물이 표시되는지 여부에 대한 간단한 메타 키로 정렬 할 수 있다고 생각합니다. 그것은 내 이해를 위해보다 정상적으로 작동합니다.
helgatheviking

고정 게시물이 원래 원하는 posts_per_page의 일부인 경우 솔루션으로 실패합니다. 총 게시물 수는 줄어들지 만 고정 게시물은 일반 주문 날짜 설정의 일부이므로 해당 번호를 다시 올리지 않습니다.
앤드류 킬렌

3

스티커 포스트가 첫 페이지에있는 경우 문제가 있습니다.

해결 방법은 첫 페이지의 일부인 고정 포스트의 고정 포스트 수를 줄이는 것입니다.

function fix_posts_per_page_with_sticky_posts( $query ) {

    if ( $query->is_main_query() ) {

        // set the number of posts per page
        $posts_per_page = 12;

        // get sticky posts array
        $sticky_posts = get_option( 'sticky_posts' );

        // get queried post ids array
        $ids = array();
        $args = array(
            'post_type' => 'post',
            'post_per_page' => $posts_per_page,
            'paged' => 1
        );

        $posts = get_posts( $args );

        foreach ( $posts as $post ) {
            $ids[] = $post->ID;
        }

        // if we have any sticky posts and we are at the first page
        if ( is_array( $sticky_posts ) && ! $query->is_paged() ) {

            // count the number of sticky posts
            $sticky_count = count( $sticky_posts );

            foreach ( $sticky_posts as $sticky_post ) {
                if ( in_array( $sticky_post, $ids ) ) {
                    // decrement sticky posts count if the sticky post in on the page
                    $sticky_count--;
                }
            }

            // and if the number of sticky posts is less than
            // the number we want to set:
            if ( $sticky_count < $posts_per_page ) {
                $query->set( 'posts_per_page', $posts_per_page - $sticky_count );

            // if the number of sticky posts is greater than or equal
            // the number of pages we want to set:
            } else {
                $query->set( 'posts_per_page', 1 );
            }

        // fallback in case we have no sticky posts
        // and we are not on the first page
        } else {
            $query->set( 'posts_per_page', $posts_per_page );
        }
    }
}
add_action( 'pre_get_posts', 'fix_posts_per_page_with_sticky_posts'  );

도움이 되길 바랍니다.


1
더 쉽고 빠른 해결책이 확실하지 않습니까? 힌트 : 끈적 끈적한 게시물과 페이지 당 게시물의 양을 알고 있습니다.
kaiser

나는이 내 의견에 WP 코어에 있어야 뭔가 더 수정입니다 .. 지금까지 잘 발견되지 않았다
csag

그것이 핵심이라면 다른 시나리오는 작동하지 않을 것입니다.
카이저

이것은 알려진 버그이며 core.trac.wordpress.org/ticket/27282
Will

@kaiser Ahmad M의 솔루션은 끈적 끈적한 상태에 관계없이 첫 페이지에 나타날 끈적 끈적한 게시물을 설명하지 않습니다. 첫 페이지에 게시물이 너무 적을 수 있습니다 (WordPress v4.9.7). 이 답변은 그것을 설명하기 때문에 더 좋습니다.
Jacob Budin

0

위의 두 가지 답변을 모두 하나로 정리하여 불필요한 WP_Query를로드하지 않도록하고 첫 페이지에 고정되어 있으면 수정하고 더 빠른 코드로 정보를 처리하는 시간을 줄입니다.

function modify_main_query( $query ) {
   if ( ( $query->is_home() || is_front_page() ) && $query->is_main_query() ) {
         // set the number of posts per page
        $posts_per_page = 12;
        // get sticky posts array
        $sticky_posts = get_option( 'sticky_posts' );
        // if we have any sticky posts and we are at the first page
        if (is_array($sticky_posts) && !$query->is_paged()) {
            // make a second query to make sure the sticky posts will still work 
            // correctly when on the first page
            // Only reply with the ID's as that is all that is needed
            $args = [
                'post_type' => 'post',
                'post_per_page' => $posts_per_page,
                'paged' => 1,
                'fields' => 'ids'
            ];
            // Array flip to reduce the time taken by 
            // using isset and not in_array
            $posts = array_flip( get_posts( $args ) );

            // count the number of sticky posts
            $sticky_count = count($sticky_posts);

            // loop the posts from the 2nd query to see if the ID's of the sticky posts
            // sit inside it.
            foreach ( $sticky_posts as $sticky_post ) {
                if(isset($posts[$sticky_post])){
                    $sticky_count--;
                }
            }
            // and if the number of sticky posts is less than
            // the number we want to set:
            if ($sticky_count < $posts_per_page) {
               $query->set('posts_per_page', $posts_per_page - $sticky_count);
            } else {
                // if the number of sticky posts is greater than or equal
                // the number of pages we want to set:
                $query->set('posts_per_page', 1);
            }
        // fallback in case we have no sticky posts
        // and we are not on the first page
        } else {
            $query->set('posts_per_page', $posts_per_page);
        }
    } 
}

add_action( "pre_get_posts", 'modify_main_query' );
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.