web-dev-qa-db-ja.com

Single-custom.phpでのWP_Queryページ付け

私がやろうとしているのは:

Single-custom-post-type.phpテンプレートファイルでWP_Queryページ付けを設定する

私がしたこと

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ループ内の実際のコンテンツ出力は省略しました。その部分は問題ではないからです。問題は、私がこの単一の投稿にすでに存在するコンテンツをページ分割する必要があるということです。

この機能の目的は投稿がカスタムの作者を持つことを可能にすることであった(組み込みのUsersシステムの外で)そしてこのテンプレートの目的は与えられた作者のための全ての投稿を出力することです。

13
Shane

あなたは2つの問題を抱えています。

最初の問題

この線

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

単一の投稿ビューでURLが'/page/XX/'を含んでいる場合、WordPressが設定する変数は'page'であり'paged'ではないため失敗します。

'page'の代わりに'paged'を使用することを考えるかもしれませんが、'page'変数が複数ページの単数形投稿(<!--nextpage-->を使ったページ分離)に使われることを意図していて'/page/XX/'を付けずにリクエストをURLにリダイレクトします。

これは、クエリ変数に$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'
            $query->set( 'page', 1 );
            $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'クエリ変数を正しく設定します。

第二の問題

next_posts_link()previous_posts_link()はどちらもif ( ! is_single() )をチェックしてページ付けを表示します。

あなたのケースではis_single()が真実です、なぜならあなたは 'author'タイプの単一の投稿にいるので、それらの関数は期待通りには動作できないからです。

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 we are in 1st page and required previous or in last page and required 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 ), $label );
}

single-authors.phpのようにそれを使います。

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

もう1つの同様のWPSE質問「 ページネーションはwp_queryカスタムフィールド値 」を処理していませんが、テンプレートファイルの先頭にglobal $paged;を追加することをお勧めします。

global $paged;
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
0
Stephen S.