私はindex.phpのメインループをWP_Query関数で正しく動作させることに本当に苦労しています。メインポストを6ポスト下にループさせながらオフセットしないようにするために、上部に6つの注目画像のグリッドアレイを配置する必要があります。
Query_posts()を含むものは、必然的にページ区切りを壊すことになります。単一のループを使用するとページネーションの問題は解決されますが、特徴的なグリッドセクションにオフセットが適用されるので望ましくありません。 WordPressコーデックスが推奨するpre_get_posts https://codex.wordpress.org/Making_Custom_Queries_using_Offset_and_Pagination を使用して、ページネーションメインループを機能させることができました。ただし、この修正により、注目の投稿のループ設定も6だけ上書きされます。
オフセット/ページネーションのジレンマはWordPressの開発者にとってはよく知られている問題のようです、そして私はたくさんの記事、フォーラム、そしてチュートリアルを閲覧しましたが、pre_get_postsフィックスが他のカスタムループ設定を無効にするときインデックスに。 pre_get_postsはある程度機能します。トップ6の投稿ではなく、ホームページ上のメインの投稿ループにのみ書式設定を適用するようにします。
これがコードです。これを読んでくれてありがとう。
index.php:
<?php get_header();
do_shortcode( '[mg-masonry_js]' );
$options = get_option('mg_options');
$option_cats = $options['mg-posts-categories'];
$option_pg_number = $options['mg-posts-post-per-page'];
$args = array(
'post_type' => 'post',
'post_status' => array( 'publish' ),
'posts_per_page' => $option_pg_number,
'orderby' => 'date',
'order' => 'DESC',
'cat' => $option_cats,
'offset' => 0,
);
?>
<div id="all-content-wrapper">
<div id="home-content" >
<div id="grid">
<?php if ($paged < 1 ) {
$paged = get_query_var('paged'); ?>
<?php // initialize main loop ?>
<?php $grid_query = new WP_Query( $args );
if ( $grid_query->have_posts() ) :
while ( $grid_query->have_posts()) : $grid_query->the_post();
?>
<?php switch ( $grid_query->current_post ) {
case 0 :
?>
<?php // First featured image code here ?>
<?php echo get_template_part('grid_featured'); ?>
<?php break; ?>
<?php // Grid image array code here ?>
<?php default : ?>
<?php echo get_template_part('grid'); ?>
<?php } ?> <?php // end switch ?>
<?php endwhile;
wp_reset_postdata();
rewind_posts();
else : ?>
<h2><?php _e('No posts.', 'news portal' ); ?></h2>
<br><br><p class="lead"><?php _e('No posts to display.', 'news portal' ); ?></p>
<?php endif; ?>
<?php } // end paged switch ?>
</div> <?php // end grid ?>
<div id="primary" class="content-area">
<main id="main" class="site-main" role="main">
<?php
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'offset' => 6,
);
?>
<?/* Start the Loop */?>
<? $main_query = new WP_Query( $args );
if ( have_posts() ) :
while ( have_posts() ) : the_post();
get_template_part( 'template-parts/blog', get_post_format() );
endwhile;
echo regular_pagination();
else :
get_template_part( 'template-parts/content', 'none' );
endif; ?>
</main><!-- #main -->
</div><!-- #primary -->
<?php news_portal_get_sidebar();?>
</div><!-- #all_content_wrapper -->
<?php get_footer();?>
functions.php:
/*--Offset Pre_Get_Posts pagination fix--*/
add_action('pre_get_posts', 'myprefix_query_offset', 1 );
function myprefix_query_offset(&$query) {
if ( ! $query->is_home() ) {
return;
}
$offset = 6;
$ppp = get_option('posts_per_page');
if ( $query->is_paged ) {
$page_offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('offset', $page_offset );
}
else {
$query->set('offset',$offset);
}
}
add_filter('found_posts', 'myprefix_adjust_offset_pagination', 1, 2 );
function myprefix_adjust_offset_pagination($found_posts, $query) {
$offset = 6;
if ( $query->is_home() ) {
return $found_posts - $offset;
}
return $found_posts;
}
私はもう少しコードをめちゃくちゃにした、そして私の特定の問題は実際には元のifステートメントのパラメータに関連することになった。ホームページでクエリをチェックする条件を変更する
if ( $query->is_home() && ! $query->is_main_query() ) {
return;
}
そして
else {
//This is the first page. Just use the offset...
if ( $query->is_home() && $query->is_main_query()) {
$query->set('offset',$offset);
}
}
}
デフォルトのelse条件がindex.phpファイルで宣言されているデフォルトのelse条件が、必要に応じて二次グリッドループに適用されるように、既存のoffsetとposts per pages引数がtrueになるようにしました。 2つ目のifステートメント条件は、それがなければ、メディアライブラリと投稿から最初の6つの項目を削除し続けるという奇妙なテーマを破るバグがあったので追加する必要がありました。
これらのリンクは、同様の問題を解決するのに役立ちます。
https://wordpress.stackexchange.com/questions/tagged/pre-get-posts
https://wpshout.com/practical-uses-pre_get_posts/ /
https://www.billerickson.net/customize-the-wordpress-query/ /