独自データベースにおける $wpdb のプレースホルダーに関するエラーについて

はじめに

最近、自作のプラグイン Plus WebP が切っ掛けになり、Toro_Unit さんに、WordPress プラグインを、コーディング規約に合わせた方が良いとのご指摘を受け、PHPCS による検証作業をすすめています。その際に、$wpdb を使用した独自データベースで、PHPCS によるエラーが出て検索してもどこにも情報が無かったのですが、解決しましたので記します。

コード

元のコード

foreach ( $section_points as $key ) {
	$past_judge_paper_table_name = $wpdb->prefix . 'compescoring_paper_' . $key->number;
	$past_point = $wpdb->get_var( $wpdb->prepare( "SELECT $jugde_col FROM $past_judge_paper_table_name WHERE number = %d", $sheet->number ) );
	?>
	<div>
	<span style="font-size: 1.5em; font-weight: bold;">No.<?php echo esc_html( $key->number . ' ' . $key->name . ' : ' . sprintf( '%.1f', $past_point ) ); ?></span>
	</div>
	<?php
}

PHPCS のエラー

4578 | ERROR | [ ] Use placeholders and $wpdb->prepare(); found interpolated variable $jugde_col at "SELECT $jugde_col FROM $past_judge_paper_table_name WHERE number = %d"
4578 | ERROR | [ ] Use placeholders and $wpdb->prepare(); found interpolated variable $past_judge_paper_table_name at "SELECT $jugde_col FROM $past_judge_paper_table_name WHERE number = %d"

解説

SELECT と、FROM の所で、変数を利用しているので、prepare メソッドを使ってプレースホルダーを利用するようにとのメッセージです。WHERE 以降では、プレースホルダーを利用しているのですが、SELECT と、FROM の所にプレースホルダーを利用すると文字列をシングル・クォートで囲んでしまい、動きません。

修正したコード

foreach ( $section_points as $key ) {
	$wpdb->past_judge_paper_table_name = $wpdb->prefix . 'compescoring_paper_' . $key->number;
	$wpdb->judge_col = $judge_col;
	$past_point = $wpdb->get_var( $wpdb->prepare( "SELECT $wpdb->judge_col FROM $wpdb->past_judge_paper_table_name WHERE number = %d", $sheet->number ) );
	?>
	<div>
	<span style="font-size: 1.5em; font-weight: bold;">No.<?php echo esc_html( $key->number . ' ' . $key->name . ' : ' . sprintf( '%.1f', $past_point ) ); ?></span>
	</div>
	<?php
}

解説

プレースホルダーをあきらめて、PHP の基本に返って考えたら、$wpdb がオブジェクトであることに気付きました。変数を、$wpdb オブジェクトに入れて利用したら動作し、PHPCS のエラーも消えました。

この記事を書いた人