web-dev-qa-db-ja.com

カスタム投稿タイプのカテゴリページのページ付け

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();
1
3lb3rt

私があなたの問題に取り組む前に、私はあなたがなぜメインページの代わりにカテゴリーページの上でカスタムクエリーを使っているのかを尋ねることから始めたいと思います。アーカイブページやホームページのカスタムクエリのメインクエリを変更しないでください。

Wordpressにはアクションフック pre_get_posts が用意されています。これを コンディショナルタグ と組み合わせて使用​​すると、特定のページで実行する前にメインクエリをターゲットにして変更できます。カテゴリページには is_category() 条件付きチェックが提供されています。

あなたのカテゴリページであなたのデフォルトのループをそのままに保ちながら、単にあなたのfunctions.phpで以下をすることができます。ちょっと一言、pre_get_postsWP_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_querywp_reset_postdataを一緒に使用する必要はありません。 wp_reset_queryは、実際には query_posts と組み合わせて使用​​されます。これは絶対に使用してはいけません。絶対に使用しないことを意味します。単にwp_reset_postdata afterWP_Queryandget_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 ); ?>であるべきです。

さらに読むために:

1
Pieter Goosen