奈良県でソフトウェア開発・Webサイトの運営をしているフリーランスのエンジニアです

ロジカルアーツ研究所

PHP

WordPress 3.5にアップデートするとwarningが表示される問題への対処

投稿日:2012年12月14日 更新日:

先日WordPress 3.5がリリースされました。このサイトもすでにアップデートを行っていますが、今までになかったワーニングメッセージがヘッダーやフッターの部分に表示されることに気づきました。それは次のようなものです。

Warning: Missing argument 2 for wpdb::prepare(), called in ・・・

このワーニングの意味は、関数wpdb::prepare()の2番目の引数が足りないということです。今まで出なかったということは、WordPress 3.5でこの関数の仕様が変更されたと考えられます。


ワーニングが出るか出ないかは使用しているテンプレートに依存します。また特定のプラグインで発生するケースもあるようです。このサイトで使用している'iNove'テンプレートもそうなのですが、コピーライトの部分に表示される年号を取得するために上述のwpdb::prepare()関数が用いられています。この関数はwp-includes/wp-db.phpの中で定義されており、任意のSQL文を発行して結果を抽出する役割を果たします。その定義は次のようになっています。

function prepare( $query, $args )

ここで$queryは任意のSQL文、$argsは任意の数の引数です。これはちょうどPHPのsprintf()関数のように、$queryに'%s'や'%d'などの書式指定子を含め、$argsに列挙した引数で置換するというものです。従来は引数が1つしかなかったのですが、WordPress 3.5で2つの引数を取るようになったため、そのままではwarningになってしまうわけです。

このwarningを表示しないようにするには、もちろんPHPの設定でwarningを抑制してもいいのですが、それだと他の問題に気づかないケースも増えて、あまり好ましい方法ではありません。そこで根本的に解決するには、テンプレート側で修正するのが一番です。テンプレートによっても異なりますが、ほぼheader.phpかfooter.phpの中に問題の箇所があるはずです。その部分を探し出し、強制的に2番目の引数を付けてしまえばいいわけです。

たとえば、この'iNove'の場合ですと、footer.phpの中に次の一文がありますので、

$post_datetimes = $wpdb->get_row($wpdb->prepare("SELECT YEAR(min(post_date_gmt)) AS firstyear, YEAR(max(post_date_gmt)) AS lastyear FROM $wpdb->posts WHERE post_date_gmt > 1970"));

最も簡単に修正するには、prepare()関数の2番目の引数として、カンマで区切って0などの適当な数値を追加します。

$post_datetimes = $wpdb->get_row($wpdb->prepare("SELECT YEAR(min(post_date_gmt)) AS firstyear, YEAR(max(post_date_gmt)) AS lastyear FROM $wpdb->posts WHERE post_date_gmt > 1970", 0));

これだけでワーニングは消えてくれます。

-PHP
-

Copyright© ロジカルアーツ研究所 , 2024 All Rights Reserved Powered by STINGER.