WordPressを3.7.1に更新したらブログに不具合発生

November 9, 2013 – 11:02 am

最近このブログを動作させているWordPressのバージョンを3.7.1に更新した。更新すること自体は良いのだが、この作業に伴いブログに不具合が発生した。発生した不具合は、WordPressで提供されている関数のひとつwp-get-archives()の出力形式が微妙に変化したことによるものだった。
不具合の内容についてメモしておいた。

不具合発生と原因: このブログのサイドバーに「Monthly Archives」と表題された部分がある。ご覧ンになれるように、ここには、月別のアーカイブリストが示されている。この表示は私自身がwp-get-aruchives()の出力を編集し構成し直したものだ。編集方法は「月別アーカイブリストをコンパクトにする方法」に詳述している。

この「Monthly Archives」がWordPressのバージョンを3.7.1に上げた直後から全く表示されなくなっていた。原因を調べると、WordPressのバージョンの変化に伴いwp-get-archives() の出力が微妙に異なっていることがわかった。

wp-get-archives()の出力編集に際して、 php関数 preg_match_all() を用い、正規表現によるマッチングによりブログ作成日時を抽出している。マッチングでは、当然のことながら、wp-get-archives()の出力形式が変化しないことを前提としている。この前提が崩れれば不具合発生ということになる。

コーディングの修正: WordPressのバージョン3.6.x 以前のwp-get-archives() ではHTMLのaタグのTitle属性が指定されているかたちで出力されていたのに対し、3.7.1のそれにはTitle属性が省略されていた。

この違いをPHPのコーディングで吸収するため、正規表現によるマッチングに用いている関数 preg_match_all() を以下のように修正した。

修正前(詳細はここ):

preg_match_all("/<a href=.*Post-date\/([^>]+)\/([^>]+)\' title=.*\'>/", $buffer, $cell, PREG_PATTERN_ORDER);

修正後:

preg_match_all("/<a href=.*Post-date\/([^>]+)\/([^>]+)\'>/", $buffer, $cell, PREG_PATTERN_ORDER);

この修正により、問題なくサイドバー上の月別アーカイブリストが出力されるようになった。ただ、WordPressのバージョンが3.6.x以前のものについては修正後のコーディングではアーカイブリストが正しく出力されないことに注意のこと。

原因特定のためのデバッグに役立った話: 上述したwp-get-archives() の変化把握に多少のデバッグを必要とした。デバッグでは、HTMLのタグがそのままのかたちでブラウザ上に表示するのが最も簡単な方法だ。そうでないと、上述のaタグのTITLE属性の有無を知るのは容易ではない。

これを実現するのに便利なのが、ブラウザ上に出力したいソースを

<xmp> ~</xmp>

ではさんでやれば良い。デバックする際にはとても便利なタグといえる。

ただ、このHTMLのxmpタグは、HTMLの初期の仕様でHTML4以降では使用しないことになっている。私の環境ではなんとか動作していたが、使用に際しては注意が必要だ。


Post a Comment