頭がわからないのですが、なぜoffset
がページテンプレートのカスタムのWP_Query
からメインのクエリに転送されているようですか。
私のfunctions.phpより
/**
* ::: Filter 'Custom Post Type' Archive Main Query :::
*/
add_action( 'pre_get_posts', 'filter_cpt_posts' );
function filter_cpt_posts( $query ) {
if ( ! is_admin() && $query->is_main_query() && ! is_post_type_archive( 'cpt' ) ) {
return $query;
}
else { // on is_post_type_archive( 'cpt' )
$query->set( 'offset', '1' );
return $query;
}
}
私のarchive-cpt.phpから:
<?php
$loop_recent_post = new WP_Query( array(
'post_type' => 'cpt',
'posts_per_page' => 1, // number of posts to display
'offset' => 0
) );
if ( $loop_recent_post->have_posts() ) {
while ( $loop_recent_post->have_posts() ) {
$loop_recent_post->the_post();
?>
<!-- HTML Code -->
<?php wp_reset_postdata(); ?>
そしてさらに下:
<?php
//query_posts( 'post_type=cpt&offset=1' ); //Get rid of `query_posts`
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
?>
投稿はoffset=0
でメインのクエリから始まります。
どうして?
シモンズ:はい、
pre_get_posts
を使用してクエリを変更するようになったのはこのためです。wp_reset_query()
はWP_Query
の後に違いを生じさせません、私は this rec に従いました。問題を書き留めるのに役立ちます。
私はpre_get_posts
を広範囲に使用したことがないので、その原因についてその領域に集中しすぎましたが、それはif
節でした。
に変更
if ( ! is_admin() && $query->is_main_query() && ! is_post_type_archive( 'cpt' ) ) {
return $query;
}
elseif ( ! is_admin() && $query->is_main_query() && is_post_type_archive( 'cpt' ) ) { // on is_post_type_archive( 'cpt' )
$query->set( 'offset', '1' );
return $query;
}
else {
return $query;
}
すべてうまくいっています。私はpre_get_posts
が好きです。