WordPress のプラグイン Nginx Helper のバグ修正をする

WordPress
この記事は約7分で読めます。
この記事は最終更新日より 1 年以上経過しています。
画像やリンクが無効になっている可能性もあるのでご了承下さい。

はじめに

 Nginx Helper は Web サーバー Nginx で WordPress をホストして FastCGI Cache を用いる場合、キャッシュのパージを行う際にとても便利なプラグインである。
 ただ、ちょっと動作上問題の部分があったりで旧 Version 1.9.11 をずっと使用してきた。

 しかし、バグ有りであってもメンテナンスはされているので、セキュリティ的にも最新版をなるべく使いたいと個人的に思うところがある。
 現行最新である Version 2 系を自分で何とか出来ない物かとバグを潰してみたお話し。

バグ確認と修正

コメント投稿時に記事のキャッシュがパージされない

 Nginx Helper 1.9.11 まではコメント投稿時であっても正常にコメントの付いた記事のキャッシュをパージしてくれていた。
 しかし 2.0.3 では処理が止まってしまってパージされない。

 例えばこんな感じに “Status Changed from to approved” とログがあってその先が無い。
 つまりキャッシュのパージ処理が動作していないことになる。

2018-12-10 13:40:02  | INFO | * * * * *
2018-12-10 13:40:02  | INFO | * Blog :: ぶっちろぐ ( 1 ). 
2018-12-10 13:40:02  | INFO | * Post :: 記事タイトル ( Article ID ) 
2018-12-10 13:40:02  | INFO | * Comment :: 2082.
2018-12-10 13:40:02  | INFO | * Status Changed from  to approved

修正方法

 パージを起動するスクリプトは wp-content/plugins/nginx-helper/admin/class-purger.php となる。

 該当箇所は次に示すソースのハイライトした 105 行目となる。

case 'approved':
$this->log( "in case : approves" );
$this->log( "flag = " . $nginx_helper_admin->options['purge_page_on_new_comment'] );
if ( 1 === $nginx_helper_admin->options['purge_page_on_new_comment'] ) {
    $this->log( "in if" );
    $this->log( '* Comment ( ' . $_comment_id . ' ) approved. Post ( ' . $_post_id . ' ) purging...' );
    $this->log( '* * * * *' );
    $this->purge_post( $_post_id );

}

 問題のある記述はこれ。

if ( 1 === $nginx_helper_admin->options['purge_page_on_new_comment'] ) {

 if 文で使われている比較演算子 === の型があってないので比較結果は False となりパージを行う関数が呼ばれないのでパージがされなかったと言うことになる。
 よって次の様にキャストする事で整数として比較することで正常というか想定した動作に修正する。

if ( 1 === (int) $nginx_helper_admin->options['purge_page_on_new_comment'] ) {

 尚、同ファイルの他にも同様に比較している部分が複数存在するが、それらはしっかりキャストされているという謎。凡ミスのバグなのかなと思ってみたり。

動作確認

 適当に既存の記事へコメントを付けつつ Nginx Helper のログを眺めてみた。

2019-06-04 00:04:38  | INFO | * * * * *
2019-06-04 00:04:38  | INFO | * Blog :: ぶっちろぐ ( 1 ). 
2019-06-04 00:04:38  | INFO | * Post :: 記事タイトル ( Article ID ) 
2019-06-04 00:04:38  | INFO | * Comment :: 2134.
2019-06-04 00:04:38  | INFO | * Status Changed from  to approved
2019-06-04 00:04:38  | INFO | * Comment ( 2134 ) approved. Post ( Article ID ) purging...
2019-06-04 00:04:38  | INFO | * * * * *
2019-06-04 00:04:38  | INFO | * * * * *
2019-06-04 00:04:38  | INFO | * Blog :: ぶっちろぐ ( 1 ).
2019-06-04 00:04:38  | INFO | * Custom post type 'post' :: 記事タイトル ( Article ID ).
2019-06-04 00:04:38  | INFO | * CPT 'post' ( Article ID ) published or edited and its status is published
2019-06-04 00:04:38  | INFO | * * * * *
2019-06-04 00:04:38  | INFO | Function purge_post BEGIN ===
2019-06-04 00:04:38  | INFO | Purging homepage https://bucci.bp7.org/
2019-06-04 00:04:38  | INFO | - Purging URL | https://bucci.bp7.org/
2019-06-04 00:04:38  | INFO | - - https://bucci.bp7.org/xxxxx/ *** PURGED ***
2019-06-04 00:04:38  | INFO | - - https://bucci.bp7.org/xxxxx/feed is currently not cached
2019-06-04 00:04:38  | INFO | - - https://bucci.bp7.org/xxxxx/feed/atom is currently not cached
2019-06-04 00:04:38  | INFO | - - https://bucci.bp7.org/xxxxx/feed/rdf is currently not cached
...
..
.

 このようなログとなり、冒頭で書いた “Status Changed from to approved” で止まってその先が処理されないという問題が修正出来た。
 正常にコメントの付いた記事のキャッシュがパージされているので、コメントが即時適用されることを確認した。

 この件に関し、報告を上げておいた方が良いのかなと思って github の該当リポジトリにある issue を探していたら上記修正内容はとうに既出事項だったようで。
 素人なりのデバッグなりやって原因突き止めたのに無駄足だったようだ。楽しかったから良いけど。

Added a typecast for check on purge_page_on_new_comment option for ne… by jinschoi · Pull Request #175 · rtCamp/nginx-helper
New comments were not purging the post.Using === for equality comparisons require both operands to b...

 2 月下旬に修正コードが上げられているのになんでコミットされないのかは良く分からず。

feed などのパージ URL に関して

 Nginx Helper は WordPress の各種 feed の URL としてトレイリングスラッシュ (( URL 末尾にスラッシュを付ける事 )) 有りでパージを行う。
 しかし、WordPress のパーマリンク設定が “数字ベース” になっていると、feed の URL にトレイリングスラッシュは付かないのでパージされなくなる。
 この辺の細かい WordPress の仕様に追従出来ていないようだし対応されるのを待つあいだ、手動でコードを書き換えるのも面倒だから当ブログのパーマリンク設定をカスタム設定にして数字ベースであってもトレイリングスラッシュを付加するような動作仕様の変更を行った。
 パーマリンク設定のカスタム構造で /archives/%post_id%/ とすれば数字ベースにトレイリングスラッシュ有りとなるので変更は単純明快であるし、変更後のアドレスへ自動的に 301 リダイレクトされるから SEO 面でも大きな不安は無い。

おわりに

 Nginx の FastCGI Cache を用いればサーバーサイドで WordPress の高速化を行えるが、キャッシュ管理や Nginx Helper などプラグインのメンテナスが面倒になってしまう。
 ページの表示速度を上げるか、運用面で楽をするか何れかを選択しろと言われれば面倒でも前者をとりたいタイプなので致し方ないところかなと思った。

著者プロフィール
ぶっち

本格的に PC へ触れ始めてたのは 1990 年位から。
興味は PC 全般。OS は Windows と Linux などを嗜む。
プログラマやネットワークエンジニアを経てフリーに活動している 2 児の父な 40 代半ばのおじさんです。

ぶっちをフォローする

コメント

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.