WordPress では記事やコメントなどを取得するための関数が多数用意されているため、それらを利用してテーマやプラグインの開発を行うことが一般的だと思う。しかし、複雑な処理を行おうとするとどうしても SQL を直接実行しなければならないこともある。
このページでは WordPress 内で SQL を実行する方法を紹介しよう。
wpdb クラスと $wpdb を用いて SQL を実行する方法
WordPress で SQL を実行するには wpdb クラスを利用しよう。デフォルトでは wpdb クラスをインスタンス化した $wpdb というグローバルオブジェクトが用意されており、通常はこちらを利用するのが手っ取り早い。
例えば以下のように利用する。
global $wpdb;
$results = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE post_id = 1", OBJECT );
テーブル名はサイトによってはプレフィックスが異なる値が設定されているため、$wpdb->posts のような形式で指定するのが良いと思う。ちなみにプレフィックスは $wpdb->prefix で取得できる。
SQL インジェクションを防止する
SQL を実行する際には SQL インジェクションへの対策が必須だ。wpdb を利用する場合は prepare メソッドを利用して入力文字列をエスケープすることができる。
global $wpdb;
$wpdb->get_row(
$wpdb->prepare(
"SELECT * from $wpdb->postmeta WHERE meta_key = %s AND meta_value = %d",
'sample_key',
12345
), OBJECT
);
引数は配列にすることもできる。例えば以下のような感じ。
global $wpdb;
$wpdb->get_row(
$wpdb->prepare(
"SELECT * from $wpdb->postmeta WHERE meta_key = %s AND meta_value = %d",
array( 'sample_key', 12345)
), OBJECT
);
値の数が動的に変わる場合にはこちらのほうが良さそうだ。
wpdb を利用して値を取得する
いわゆる SELECT 文を実行するのに使えるメソッドがいくつかある。代表的なのが get_row と get_results だ。get_row は一行のみを、get_results は結果全てを取得する。
$ret = $wpdb->get_row( $wpdb->prepare( "SELECT * from $wpdb->posts "), OBJECT);
var_dump($ret); // 投稿一つのみ
$ret = $wpdb->get_results( $wpdb->prepare( "SELECT * from $wpdb->posts "), OBJECT);
var_dump($ret); // 全ての投稿が表示される
末尾についている OBJECT は返り値の種類を示している。デフォルトは OBJECT だが、配列でほしい場合には ARRAY_A(連想配列), ARRAY_N(数値インデックス配列) も利用できる。
他には変数を取得する get_var や列を選択する get_col などもある。
wpdb を利用してデータの INSERT や UPDATE, DELETE を行う
データの挿入や更新を行う場合 SQL 文を直接書いても良いが、insert や replace, update といった便利なメソッドも用意されている。
データを挿入するなら insert を利用する。以下のような感じで一つ目に挿入するテーブル名、二つ目に挿入するレコードの内容を記述する。
$wpdb->insert(
$wpdb->postmeta,
array(
'post_id'=>1,
'meta_key'=> 'test_key',
'meta_value'=> 'test_value'
)
);
replace では値が無ければ挿入、あれば更新を行う。多分主キーが必要。
$wpdb->replace(
$wpdb->postmeta,
array(
'meta_id'=>131,
'post_id'=>2,
'meta_key'=> 'test_key',
'meta_value'=> 'test_value'
)
);
update では値の更新ができる。三つ目の引数で更新対象を指定できる。
$wpdb->update(
$wpdb->postmeta,
array( 'meta_value'=> 'test_value update!'),
array( 'meta_key' => 'test_key') // where
);
値を削除するには delete を利用する。こちらは二つ目が where となっている。
$wpdb->delete(
$wpdb->postmeta,
array( 'meta_value'=> 'test_value update!'),
);
wpdb で SQL を直接実行する
上記メソッドで実行できない複雑な処理はやはり SQL を直接記述する必要がある。SQL を実行する場合は、query メソッドを利用しよう。
$wpdb->query(
$wpdb->prepare(
"UPDATE $wpdb->postmeta SET meta_value = %d WHERE meta_key = test",
1
)
);
wpdb で SQL のエラーを表示する
SQL の実行に失敗したらその原因を表示できると効率よく開発できる。wpdb では show_errors を利用するとエラーを表示できる。例えば以下のような感じ
$wpdb->show_errors();
$wpdb->query($wpdb->prepare("select * from a $wpdb->postmeta WHERE meta_key = test", 1));
// WordPress database error: [Table 'local.a' doesn't exist] と表示される
wpdb まとめ
このように wpdb を利用するとより複雑な処理を行うことができる。複雑なことができる分セキュリティ上のリスクもあるため、気を付けながら利用しよう。