wordpressにて固定ページ内でWP_Queryで投稿をランダムで呼び出し、ページネーションをしています。
しかしランダムなので、2ページ目で1ページ目に出てきた投稿がまた出てきてしまいます。
▼固定ページテンプレート
<main class="Top"> <ul class="Search_result_list"> <?php $args = array( 'post_type' => 'post', 'paged' => $paged, 'orderby' => 'rand', 'posts_per_page' => 5 ); $my_query = new WP_Query($args); if($my_query->have_posts()): while($my_query->have_posts()): $my_query->the_post(); ?> <li class="Archive_item"> <div class="Archive_img"> <img src="<?php the_field('img1'); ?>" alt=""> </div> <h3 class="Archive_name"><?php the_title(); ?></h3> </li> </ul> <?php endwhile;?> <?php else: ?> <p class="Archive_nohit">該当する店舗はありませんでした。</p> <?php endif; wp_reset_postdata();?> <?php $the_query = new WP_Query($args); $paged = (int) get_query_var('paged'); if ($the_query->max_num_pages > 1) { echo paginate_links(array( 'base' => get_pagenum_link(1) . '%_%', 'format' => '/page/%#%/', 'current' => max(1, $paged), 'prev_text' => '前へ', //「前へ」のテキスト。 'next_text' => '次へ', //「次へ」のテキスト 'type' => 'list', 'total' => $the_query->max_num_pages, 'before_page_number' => '<span class="screen-reader-text">' . $translated . ' </span>' )); } ?> <?php get_template_part( 'search-form' ); ?> </ul> </main>
上記コードでページャーはできるのですが、ランダムによって起こる重複の回避方法がまるで分からず、頭を抱えています。
https://teratail.com/questions/192647を参考に、functions.phpにそのまま追記してみたのですが、状況は変わらずでして...
▼functions.php
//ランダムでページャー function session_start_on_init() { session_name( 'seed' ); session_start(); } add_action( 'init', 'session_start_on_init' ); function order_posts_randomly( $orderby, $query ) { if ( ! $query->is_main_query() ) { return $orderby; } $paged = 0 === get_query_var( 'paged', 0 ) ? 1 : get_query_var( 'paged', 1 ); $seed = isset( $_SESSION['seed'] ) ? $_SESSION['seed'] : null; if ( ( empty( $seed ) || 1 === $paged ) ) { $seed = rand(); $_SESSION['seed'] = $seed; } return 'RAND(' . $seed. ')'; } add_filter( 'posts_orderby', 'order_posts_randomly', 10, 2 );
他にもこういった記事も参考にしてみたのですが、解決に至らずです。
https://designhack.slashlab.net/wordpress-how-to-posts-orderby-random-and-paging/
▼functions.php(別案)
function category_rand_orderby( $orderby, $query ){ if ( !is_admin() && $query->is_main_query() ) { if ( $query->is_page() ) { $seed = strtotime( date( 'Y-m-d H:00:00' ) ); mt_srand( $seed ); $orderby = 'RAND(' . mt_rand() . ')'; } } remove_filter( current_filter(), __FUNCTION__ ); return $orderby; } add_filter( 'posts_orderby', 'category_rand_orderby', 10, 2 );
以上となります。
上記の固定ページのコードな上で、いい回避方法があれば、ご教授いただければ幸いです。
よろしくお願いします...!
あなたの回答
tips
プレビュー