Wordpressは私にとっては新しいものではありませんが、私は本当にうまく動かないようにすることができないコードのこの部分にはまっています。
カスタム投稿タイプを登録します ニュース そしてカスタム投稿タイプにWordpressカテゴリを使用させます
'taxonomies' => array('category')
ここまでは順調ですね。カスタム投稿タイプNewsに異なるカテゴリを割り当てることができます。しかし、私は人々が特定のカテゴリからのニュースを見ることができることを望みます。それで、それをcategory.phpページで行いたいと思います。問題は、ページネーションが機能していないことです。/page/2に移動したときにページが見つからない
私はcategory.phpページでこのコードを使います。
// Get post ID
$post_type = get_post_type( $post->ID );
// Get category ID
$category_id = get_cat_ID(single_cat_title('', false));
// Wordpress pagination
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// WP_Query arguments
$args_news = array (
'post_type' => array( 'news' ),
'pagination' => true,
'posts_per_page' => '9',
'orderby' => 'date',
'paged' => $paged,
'cat' => $category_id,
);
// The Query
$query = new WP_Query( $args_news );
// The Loop
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post(); ?>
<div>
<h1><?php the_title(); ?></h1>
<p><?php the_content(); ?></p>
</div>
<?php }
} else {
// no news found
}
?>
<div class="pagination">
<div class="previous-page"><?php previous_posts_link( 'Newer Posts' );?></div>
<div class="next-page"><?php next_posts_link( 'Older Posts', $query->max_num_pages ); ?></div>
</div>
<?php
// Reset postdata
wp_reset_postdata();
私があなたの問題に取り組む前に、私はあなたがなぜメインページの代わりにカテゴリーページの上でカスタムクエリーを使っているのかを尋ねることから始めたいと思います。アーカイブページやホームページのカスタムクエリのメインクエリを変更しないでください。
Wordpressにはアクションフック pre_get_posts
が用意されています。これを コンディショナルタグ と組み合わせて使用すると、特定のページで実行する前にメインクエリをターゲットにして変更できます。カテゴリページには is_category()
条件付きチェックが提供されています。
あなたのカテゴリページであなたのデフォルトのループをそのままに保ちながら、単にあなたのfunctions.phpで以下をすることができます。ちょっと一言、pre_get_posts
は WP_Query
と同じパラメータを使います
function add_news_to_category( $query ) {
if ( !is_admin && $query->is_category() && $query->is_main_query() ) {
$query->set( 'post_type', array( 'news' ) );
$query->set( 'posts_per_page', '9' );
$query->set( 'orderby', 'date' );
}
}
add_action( 'pre_get_posts', 'add_news_to_category' );
さて、あなたのコードに関するあなたの実際の問題へ。
まず、wp_reset_query
とwp_reset_postdata
を一緒に使用する必要はありません。 wp_reset_query
は、実際には query_posts
と組み合わせて使用されます。これは絶対に使用してはいけません。絶対に使用しないことを意味します。単にwp_reset_postdata after
WP_Queryand
get_posts`を使うだけで、忘れないでください。
次に、コードをよく見てください。あなたは$query = new WP_Query( $args_news );
を持っています、しかしあなたは<?php next_posts_link( 'Older Posts', $custom_query->max_num_pages ); ?>
を持っています。違いを見つけますか? $query
と$custom_query
。したがって、<?php next_posts_link( 'Older Posts', $custom_query->max_num_pages ); ?>
は<?php next_posts_link( 'Older Posts', $query->max_num_pages ); ?>
であるべきです。
さらに読むために: