質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

0回答

1202閲覧

WP_Queryにてランダム表示でループするとき、記事が重複する

sleeeep12

総合スコア36

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/04/09 16:37

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 );

以上となります。
上記の固定ページのコードな上で、いい回避方法があれば、ご教授いただければ幸いです。
よろしくお願いします...!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問