ワイヤード・パンチ

元・大阪人が、岡山の山奥でも生きていけることを証明するためのブログ。

WordPressの検索結果の2ページ目以降がおかしいときの対処法。

以前はTumblrで運営していた、アイカツスターズのカードの画像保管庫ですが、昨日wordpressに乗り換えました

そもそも保管庫を建てた理由は自慢目的なのですが、wordpressに変えたことでどのカードをすでに持っているか検索できるようになり、ぼく自身の役に立つサイトとなりました。

様々な条件でカードを検索できるようにしているのですが、2ページ目以降になるとなぜか検索結果がおかしくなっている不具合が出ておりました。

広告

どのような不具合?

まず、特に検索条件を入れていない場合は、カードに記された日付の新しい順に、一覧が表示されています。

(日付がないカードでなおかつ、いつ手に入れたかわからないものは、年月日不明と表示させているものの、実質は1970年1月1日扱い。)

一覧ページの下の方には検索ボックスが設置されており、フリーワード検索に加えて、カードごとに割り当てられたカテゴリごとに絞り込んで検索も可能です。

たとえば上の写真は、検索条件として「トップス」という名前が含まれているアイテムのみを絞り込み、なおかつ1ページ目を表示した状態です。

全部で84件ヒットしていますが、1ページに表示されるのは15件までなので、右下には次のページへのリンクが表示されています。

ところが、次のページへのリンクをクリックしてみると…。

なぜか、名前に「トップス」が入ってないアイテムが一覧に含まれています。上の写真で名前が表示されているもの以外にも、検索対象外のものが多数含まれています。

この並び、どこかで見たことある…。そう思って、検索をいったんとりやめて、何も検索条件がない状態で2ページ目に入ってみると…。

先程と全く同じ結果が出てきました。

フリーワード検索だけでなく、カテゴリで絞り込み、あるいは両方でやってみても、2ページ目以降になると全く同じ状態です。

つまり、どんな検索条件を入れていても、なぜか2ページ目以降は検索条件が適用されないという状態になっています。

ヒット件数の表示もなくなっているので、やはり検索ページ扱いになっていないようです。

原因および解決方法。

検索処理の方法として、URLパラメータから$_GETで値を取得して、pre_get_postsで絞り込みを行っています。

しかし、2ページ目以降に入ると、なぜか$_GETを行っても、全く値が返ってきません

値が取得できないので、これでは当然絞り込みができないわけです。

それではなぜ値が取得できなくなったのか。

テーマを変えてみてもダメ、プラグインを止めてみてもダメ。

思いつく方法はいろいろとやってみたのですがなかなか解決せず、このまま行き詰まるのかと思ったところに、下記のサイトを発見。

【nginx】WordPress 用のパーマリンク設定を修正しました♪ – oki2a24

最近になってwordpressを設置しているサーバのwebの機能を、apacheからnginxに乗り換えています。

どうやらnginxで動かしており、なおかつパーマリンク設定が標準以外のときに、検索の2ページ目以降の不具合が出ることがわかりました。

WordPress – Nginx Configuration File (with SSL) –> https://github.com/LeCoupa/awesome-cheatsheets · GitHub

なお、nginx用のconfファイルは、上記サイトのコードをもとに作成したのですが、このままだと今回の件になるので、これではダメのようです。

よって、以下の部分を修正することにしました。

try_files $uri $uri/ /index.php;
↓
try_files $uri $uri/ /index.php?q=$uri&$args;

confファイル全体としては、以下のようになります。

##
# @server studio
# @host hackisition.com
# @desc nginx host rules
# @author Julien Le Coupanec 
##

# HTTP Server
server {
	listen 80;
	server_name pink.wiredpunch.com;
	rewrite ^ https://$server_name$request_uri permanent;
}

# HTTPS Server
server {
	listen 443;
	server_name pink.wiredpunch.com;

	root /var/www/html/wordpress;
	index index.php;
	error_log /var/log/nginx/pink.wiredpunch.com.log crit;

	ssl on;
	ssl_certificate /etc/letsencrypt/live/pink.wiredpunch.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/pink.wiredpunch.com/privkey.pem;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # do not use SSLv3 ref: POODLE

	client_max_body_size 20M;

	location / {
		# try_files $uri $uri/ /index.php;
		try_files $uri $uri/ /index.php?q=$uri&$args; # 今回の修正部分。
	}

	location ~ \.php$ {
		fastcgi_split_path_info ^(.+\.php)(/.+)$;
		fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
	}

	location /doc/ {
		alias /usr/share/doc/;
		autoindex on;
		allow 127.0.0.1;
		deny all;
	}

	location ~/\.ht {
		deny all;
	}

}

confファイルを書き換えたあと、nginxをrestartすることで、ようやくパーマリンクが標準以外でも、検索の2ページ目以降が正常に表示されるようになりました。

URLを見たら/page/2/なので2ページということですし、検索ワードの「トップス」もちゃんと入ったままです。

というわけで、うちのかわいいマイキャラちゃんたちを、心ゆくまで堪能していってください。名前はひどいけど…。

余談。

数日前まで、amazonでアイカツスターズの商品を検索してみると、公式ではまだ未発表の、来年の4月30日発売のバインダーなどが、なぜか見つかりました。写真は無し。

今は検索に出てこなくなったので、まだ秘密だったものをうっかりポロリしてしまったので慌てて消したと思われますが、逆に言うと来年もまだまだアイカツスターズが続くということでしょうか。

(ちなみにバインダーの同梱物として、今の筐体には存在しないはずのICカードとなぜか書かれていましたが、たぶんミスでしょう…。)

去年と比べると関連商品が少なく、ストーリーもだんだんクライマックス感が強くなっているので、ちょっと心配ではあったのですが、ひとまず安心しておくことにします。