single-custom.php의 WP_Query 페이지 매김


16

내가하고자하는 것 :

WP_Querysingle-custom-post-type.php 템플릿 파일의 설정 페이지 매김

내가 뭘 한거지

1) "저자"라는 게시물 유형을 작성했습니다. 해당 게시물 유형 내의 각 게시물은 개별 작성자입니다.

2) 표준 편집 게시물 화면 페이지에는 작성자 사용자 정의 게시물 유형의 모든 게시물 (작성자)을 나열하는 드롭 다운이 있습니다.

3) 드롭 다운에서 작성자 메타 데이터가있는 모든 게시물을 쿼리하는 single-authors.php 템플릿을 만들었으므로 결과는 동일한 작성자가 지정된 게시물 목록입니다 (아카이브 종류).

<?php

// set the "paged" parameter (use 'page' if the query is on a static front page)
global $paged;

/*We need this here to add and maintain Pagination if Template is assigned to Front Page*/
if ( get_query_var( 'paged' ) ) {
    $paged = get_query_var('paged');
} elseif ( get_query_var( 'page' ) ) {
    $paged = get_query_var( 'page' );
} else {
    $paged = 1;
}

$args = array(
    'posts_per_page'    =>  10,
    'meta_key'          => 'author_select',
    'meta_value'        => $author_id,
    'paged'             => $paged,
);

$temp = $wp_query;
$wp_query = NULL;

$wp_query = new WP_Query($args);

?>

<?php if( $wp_query->have_posts() ) : ?>    
    <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
    <?php // Successfully outputs the results of the above query, so I've omitted the code from this example. ?>

    <?php endwhile; ?>

<div class="single_navigation"> 
    <?php if( get_adjacent_post( false, '', true ) ) { ?>
        <span class="prev"><?php previous_post_link( '&lt; %link' ) ?></span>
    <?php } ?>

    <?php if( get_adjacent_post( false, '', false ) ) { ?>
        <span class="next"><?php next_post_link( '%link &gt;' ) ?></span>
    <?php } ?>
    </div><!--/single navigation-->
<?php endif; ?>

<?php
    $wp_query = null;
    $wp_query = $temp;
    wp_reset_query();
?>

내가 붙어있는 것

페이지 매김 링크가 나타나지 않습니다. 몇 가지 연구를 수행하고 $wp_query변수 를 사용하는 $wp_query것으로 나타 났지만 쿼리 변수를로 변경 하면 링크가 나타나지만 클릭했을 때 아무것도 수행되지 않았습니다.

내가 잘못 가고있는 아이디어가 있습니까?

편집하다:

귀하의 질문 중 일부에 답하기 위해 쿼리에서 쿼리중인 게시물을 성공적으로 출력합니다. $ author_id에는 이미이 코드 스 니펫에 포함되지 않은 값이 있습니다. 마찬가지로 while 루프 내에서 실제 내용 출력을 생략했습니다. 그 부분은 문제가 아니기 때문입니다. 문제는이 단일 게시물에 이미 존재하는 내용을 페이지 매김해야한다는 것입니다.

이 기능의 목적은 게시물에 사용자 정의 작성자 (내장 사용자 시스템 외부에 있음)를 허용하는 것이 었으며이 템플리트의 목적은 지정된 작성자 (이미 작동중인)의 모든 게시물을 출력하는 것입니다.


3
올바른 형식의 질문에 대한 찬성 투표를하는 이유는 설명하지 않았지만 현재 작성자 상자의 관련 게시물입니까?
Tom J Nowell

1
나는 @TomJNowell에 동의합니다. +1
Pieter Goosen

2
관련이 없지만 에코 할 필요는 없습니다.the_title()
Pieter Goosen

2
되어 'meta_value' => $author_id언급의 메뉴에서 채워지는? 드롭 다운을 통해 각 저자를 선택할 때 처음 10 개의 게시물이 올바르게 표시됩니까?
Stephen S.

1
$author_query->have_posts()반품 true$author_query실제로 게시물이 포함되어 있는지 확인 했습니까 ?
카이저

답변:


17

두 가지 문제가 있습니다.

첫 번째 문제

라인

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

URL이 포함 된 경우, 때문에 단일 포스트보기에, 실패 '/page/XX/', 변수 워드 프레스 세트가 'page'아니라 'paged'.

변수 대신 여러 페이지의 단일 게시물에 사용되도록 설정하고 (페이지를 사용하여 페이지 분리 ) 게시물이 여러 페이지가 아닌 경우 WordPress에서 요청을 리디렉션 하기 때문에 'page'대신 대신 사용 하는 것으로 생각할 수도 있습니다. 없는 URL로 .'paged''page'<!--nextpage-->'/page/XX/'

쿼리 변수 이름을 지정할 때 발생합니다 $wp_query.

용액은 그 기능에 대한 책임이있는, 제거하여 그 재를 방지하는 것이다 'redirect_canonical'에 후크를 'template_redirect':

따라서 functions.php추가 할 때 :

add_action( 'template_redirect', function() {
    if ( is_singular( 'authors' ) ) {
        global $wp_query;
        $page = ( int ) $wp_query->get( 'page' );
        if ( $page > 1 ) {
            // convert 'page' to 'paged'
            $wp_query->set( 'page', 1 );
            $wp_query->set( 'paged', $page );
        }
        // prevent redirect
        remove_action( 'template_redirect', 'redirect_canonical' );
    }
}, 0 ); // on priority 0 to remove 'redirect_canonical' added with priority 10

이제 WordPress가 더 이상 리디렉션되지 않으며 'paged'쿼리 var를 올바르게 설정합니다 .

두 번째 문제

next_posts_link()그리고 previous_posts_link()둘 다 if ( ! is_single() )페이지 매김을 표시합니다.

이제는 is_single()'작성자'유형의 단일 게시물에 있으므로 해당 기능이 예상대로 작동하지 않기 때문에 귀하의 경우에는 사실입니다.

3 가지 가능성이 있습니다.

  1. query_posts기본 쿼리를 재정의하는 데 사용 (실제로 권장 되지 않음)
  2. 페이지에is_single() 대해서는 false 이므로 코드가 작동 하므로 사용자 정의 게시물 유형 대신 사용자 정의 페이지 템플릿을 사용하십시오 .
  3. 자신의 페이지 매김 함수를 작성하고 사용하십시오.

솔루션 번호 # 3의 코드입니다.

function my_pagination_link( $label = NULL, $dir = 'next', WP_Query $query = NULL ) {
    if ( is_null( $query ) ) {
        $query = $GLOBALS['wp_query'];
    }
    $max_page = ( int ) $query->max_num_pages;
    // only one page for the query, do nothing
    if ( $max_page <= 1 ) {
        return;
    }
    $paged = ( int ) $query->get( 'paged' );
    if ( empty( $paged ) ) {
        $paged = 1;
    }
    $target_page = $dir === 'next' ?  $paged + 1 : $paged - 1;
    // if 1st page requiring previous or last page requiring next, do nothing
    if ( $target_page < 1 || $target_page > $max_page ) {
        return;
    }
    if ( null === $label ) {
        $label = __( 'Next Page &raquo;' );
    }

    $label = preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label );
    printf( '<a href="%s">%s</a>', get_pagenum_link( $target_page ), esc_html( $label ) );
}

그리고 다음과 같이 사용하십시오 single-authors.php:

my_pagination_link( 'Older Entries', 'next', $author_query );
my_pagination_link( 'Newer Entries', 'prev', $author_query );

매우 자세한 답변, 감사합니다! 이것은 사이트의 영어 쪽에서 작동하지만 프랑스어 쪽에서는 페이지 매김 링크가 아무것도하지 않고 페이지를 새로 고칩니다. WPML을 사용하고 있습니다.
셰인

1
@ Shane은 WPML이 코드 작동을 방해하는 일부 필터를 실행하는 것으로 보입니다. 그러나 너무 큰 플러그인이므로 수천 줄의 코드를 파헤쳐 서 어디에 있는지 알 수 없습니다. WPML 지원에 문의하십시오.
gmazzap

@Shane WPML 지원 포럼 -위의 내용에 해당하는 경우 솔루션으로 표시하십시오. WPML 충돌은 어쨌든이 사이트의 주제 / 범위를 벗어납니다.
카이저

환상적인 답은 주로 페이지 매김 문제를 해결하는 데 도움이 되었기 때문입니다. 나는 비슷한 작업을 수행하고 두 번째 WP_Query를 만들어 루프 오버합니다. 나는라고 the_posts_pagination하지만이 질문에 명시된 바와 같이 원래 wp_query의 사본을했다 : wordpress.stackexchange.com/questions/216821/...
알렉산더 Holsgrove

1
당신은 올바른 @ HongPong입니다, 고마워요.
gmazzap

0

다른 유사한 WPSE 질문 인 " 페이지 매김이 wp_query 사용자 정의 필드 값을 작동하지 않습니다 " global $paged;에 따라 템플릿 파일의 시작 부분에 추가 하는 것이 좋습니다 .

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

1
답변 주셔서 감사합니다! 불행히도 아무런 차이가없는 것 같습니다. 페이지 매김 링크가 나타나지 않습니다
Shane

1
스티븐, 왜 도움이 되나요? 그렇습니다. 이것은 전역 컨텍스트에서 가져 오지만 지금까지는 아무것도하지 않습니다. 전역을 재정의하려면을 사용하십시오 $GLOBALS['paged'] = get_query_var( 'paged' );. 그렇지 않으면 globals 컨텐츠 만 사용하십시오.
카이저

@Shane Hmm, 템플릿 페이지가 정적 프론트 페이지로 사용됩니까?
Stephen S.

아니요, 맞춤 게시물 유형에 대한 단일 게시물 템플릿으로 만 사용됩니다. 내 검색어를에서 (으) $author_query로 변경하려고 시도 $wp_query했지만 페이지 매김이 나타나는 것처럼 보였지만 클릭하면 페이지가 새로 고쳐지고 실제로 여러 페이지가 있어도 다음 페이지로 이동하지 않습니다. 이러한 변경 사항을 반영하기 위해 답변을 업데이트했습니다.
Shane

1
php.net의 설명 이 나쁘지 않다. 난 그냥 놀아 좋을 것 global하고 $GLOBALS. A는 비트 var_dump(), 일부 기능하고있는 거 잘. 약간의 시도 / 오류로 실제로 이해하려면 약. 30 분이 필요합니다. 이를 통해 함수와 클래스 및 OOP 접근 방식을 전체적으로 더 잘 이해할 수 있습니다. 그리고 네임 스페이스를 이해하는 데 더 가까이 다가 갈 것입니다 :)
kaiser
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.