it-swarm-ko.tech

프론트 페이지에 단일 게시물을 표시하는 방법은 있지만 정상적인 페이징이 있습니까?

내 프론트 페이지 (항상 최신)에 단일 게시물을 갖고 싶지만 정상적인 페이징 작업을 시키십시오. 첫 페이지에는 게시물 1이 있고, 다음 페이지에는 게시물 2-11 (1-10은 괜찮습니다), 12-21 또는 11-20 등이 있어야합니다. 나는 컨텍스트 에 따라 게시물 수를 변경할 수 있지만 홈페이지에서 "1"로 설정하면 추가 페이지에서도 단 하나의 게시물 만 표시됩니다.

내 주요한 문제는 /page/2/ 등이 작동하지만 /page/1/은 항상 실제 홈 페이지 인 /로 리디렉션됩니다. 이것은 페이지 2가 11-20을 보여주기 때문에 포스트 2-10이 항상 스킵된다는 것을 의미합니다. I currently 내 보관함에 연결하여 해결할 수 있지만, 올해의 첫 번째 게시물 에 올 때 이상적이지 않습니다. 게시 수가 적고 분명한 방법이 없습니다. 계속.

8
Jan Fabry

나는 그것을 사용하여 해결 offset 쿼리 매개 변수 . 이를 통해 pre_get_posts 훅에서 쿼리를 편집 할 수 있었고 새 쿼리없이이 작업을 수행하는 가장 깨끗한 방법 인 것으로 보입니다. 이제 홈 페이지에는 하나의 게시물 만 표시되고 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;
    }
}
6
Jan Fabry

좋아, 어쩌면 이것은 이상하거나 복잡한 방법이지만, 비슷한 문제가있다. (프론트 페이지에 환영 텍스트와 특정 카테고리의 세 가지 최신 게시물을 표시하고 싶었다.

  1. 집이라고하는 새 페이지를 작성하고 환영 텍스트를 그 위에 놓습니다.
  2. 기본 홈 페이지를 비활성화하고 사용자 정의 홈 페이지를 시작 페이지로 설정합니다.
  3. 새로운 (복사 및 수정 된) 페이지 템플릿 을 생성했습니다.
    1. 페이지 본문을 표시하게하십시오.
    2. 카테고리 X의 최신 게시물 3 개를로드하고 표시합니다.
    3. / category/category-x /에 링크되어있는 "more"링크가 있습니다.

다음과 같이 보입니다 : http://hinek.de (페이지는 독일어로, 죄송합니다)

이것이 당신을위한 길일 수 있고 더 많은 정보 나 페이지 템플릿을위한 코드 샘플이 필요하다면,이 포스트를 편집 할 것입니다.

3
Hinek

Wordpress 3.0.x를 실행한다고 가정합니다.

첫 페이지에 게시물을 하나만 표시하는 것은 쉽습니다. 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;
?>

2 페이지에 게시물 1 ~ 10이 표시되고 3 페이지에 게시물 11 ~ 20이 표시되므로 $paged - 1을 사용했습니다.

1
john010117

이 질문은 약간 오래된 것이지만, 현대 시대에이 문제를 발견 한 사람들에게는 절대로 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 후크를 사용하여 페이지 오프셋을 조정하는 것과 같은 일부 경우에는 페이지 매김을 조정할 수 있다는 점에 유의하십시오. 이 문제를 해결하는 것은 어렵지 않지만 알아 두어야 할 사항입니다. 이 here 를 수정하는 방법의 예가 있습니다.

0
lfalin