先日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));
これだけでワーニングは消えてくれます。