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

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

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

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

Q&A

解決済

1回答

4151閲覧

[wordpress]記事をランダムにしてページングを実装

TaikiNamioka

総合スコア24

WordPress

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

0グッド

0クリップ

投稿2019/06/01 17:47

編集2019/06/01 17:52

前提・実現したいこと

ワードプレスの全記事を取得して重複しないようにページングしたいです。

https://560days.com/lab/2019/01/002385.php
こちらの記事を参考にしたのですが、重複が解消されません。
トップページに新しくアクセス(もしくはリロード)した時のみ記事の並びを変更したいです。
ページネーションのコードに不具合があるかもしれないので貼っておきます。

ページネーションのコード

function pagination($pages = '', $range = 2) { $showitems = ($range * 2)+1;//表示するページ数(5ページを表示) global $paged;//現在のページ値 if(empty($paged)) $paged = 1;//デフォルトのページ if($pages == '') { global $wp_query; $pages = $wp_query->max_num_pages;//全ページ数を取得 if(!$pages) {//全ページ数が空の場合は、1とする $pages = 1; } } if(1 != $pages) {//全ページが1でない場合はページネーションを表示する echo "<ul class=\"lst_pager cf\">\n"; //Prev:現在のページ値が1より大きい場合は表示 if($paged > 1) echo "<li class=\"prev\"><a href='".get_pagenum_link($paged - 1)."'>◀︎</a></li>\n"; for ($i=1; $i <= $pages; $i++) { if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems )) { //三項演算子での条件分岐 echo ($paged == $i)? "<li class=\"is_cur\">".$i."</li>\n":"<li><a href='".get_pagenum_link($i)."'>".$i."</a></li>\n"; } } //Next:総ページ数より現在のページ値が小さい場合は表示 if ($paged < $pages) echo "<li class=\"next\"><a href=\"".get_pagenum_link($paged + 1)."\">▶︎</a></li>\n"; echo "</ul>\n"; } }

また記事の最初に出てきている以下のコードはfunctions.phpの最初に記載しています

<?php session_name("pgsession"); session_start(); add_filter('posts_orderby', 'edit_posts_orderby'); function edit_posts_orderby( $orderby ) { $seed = $_SESSION['pgsession']; if (empty($seed)) { $seed = rand(); $_SESSION['pgsession'] = $seed; } $orderby = 'RAND(' . $seed . ')'; return $orderby; } ?>

リロードした際に発火するコードはscriptタグで括られていなかったのでくくってheader.phpに記載しています。

<?php $url = $_SERVER['REQUEST_URI']; if(strstr($url,'page')==false): ?> <script>//こちらを追記 jQuery(document).ready(function( $ ) { if (window.performance) { if (performance.navigation.type === 1) { var sesid = "pgsession"; $.removeCookie(sesid); $.cookie(sesid, null); $.cookie(sesid, "", {expires: -1}); $.cookie(sesid,"",{path:"/",expires:-1}); } } }); </script>//こちらを追記 <?php endif; ?>

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

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

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

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

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

guest

回答1

0

ベストアンサー

参考にされているサイトでは jQuery との合わせ技を使っていますが、posts_orderby フィルターにフックさせる関数内で get_query_var からページ番号を取得すると PHP だけで実装可能だと思います。

php

1<?php 2 3function session_start_on_init() { 4 session_name( 'seed' ); 5 session_start(); 6} 7add_action( 'init', 'session_start_on_init' ); 8 9function order_posts_randomly( $orderby, $query ) { 10 if ( ! $query->is_main_query() ) { 11 return $orderby; 12 } 13 14 $paged = 0 === get_query_var( 'paged', 0 ) ? 1 : get_query_var( 'paged', 1 ); 15 $seed = isset( $_SESSION['seed'] ) ? $_SESSION['seed'] : null; 16 17 if ( ( empty( $seed ) || 1 === $paged ) ) { 18 $seed = rand(); 19 $_SESSION['seed'] = $seed; 20 } 21 22 return 'RAND(' . $seed. ')'; 23} 24add_filter( 'posts_orderby', 'order_posts_randomly', 10, 2 );

また投稿一覧ページでのページネーション出力ですが、WordPerss 4.1.0 以降であれば the_posts_pagination という関数が用意されていますので、そちらをご利用されてはいかがでしょうか。

投稿2019/06/10 05:23

YukiYamashina

総合スコア1011

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

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

munokura

2019/08/08 12:59

検索したらたどり着きました! 簡潔に実装できて助かりました!
TaikiNamioka

2020/02/18 19:19

回答を見落としていました! ありがとうございます! 今後の実装で活用します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問