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( '< %link' ) ?></span>
<?php } ?>
<?php if( get_adjacent_post( false, '', false ) ) { ?>
<span class="next"><?php next_post_link( '%link >' ) ?></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システムの外で)そしてこのテンプレートの目的は与えられた作者のための全ての投稿を出力することです。
あなたは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つの可能性があります。
query_posts
を使用します。is_single()
がページに対してfalseであり、コードがそこで機能するためです。これがソリューション番号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 »' );
$label = preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&$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 );
もう1つの同様のWPSE質問「 ページネーションはwp_queryカスタムフィールド値 」を処理していませんが、テンプレートファイルの先頭にglobal $paged;
を追加することをお勧めします。
global $paged;
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;