やったこと

webサービスを作るときに考えたことを垂れ流します

「wpdb->prepare」のプレースホルダの引数を動的にセットする!

ワードプレスでDBの検索をするときに、「wpdb->prepare()」というのを使ってSQL構文を準備しますよね。

↓こんな感じで使うやつです。

global $wpdb;

$prepared = $wpdb->prepare(
        'SELECT * FROM wp_post
        WHERE  post_type = %s AND post_status = %s AND post_author = %d',
'post', 'publish', 1);

$result = $wpdb->get_results($prepared);

上記は3つの値「post」「publish」「1」を、検索条件のプレースホルダとして渡しています。

このプレースホルダを動的に複数個設定したいときがあります。

ユーザーが自由に検索条件などをセットするときなどに、こういうのが必要になるんですね。

↓下記のようにすると、検索条件のプレースホルダを自由に追加していくこと出来ます。

global $wpdb;

$args = array();

$sql = "SELECT * FROM wp_post WHERE post_type = %s";
$args[] = $post_type;

if ($post_status){
  $sql .= " AND post_status = %s";
  $args[] = $post_status;
}
if ($post_author){
  $sql .= " AND post_author = %d";
  $args[] = $post_author;
}

$prepare_query = call_user_func_array(array($wpdb, 'prepare'), array_merge(array($sql), $args));
$result= $wpdb->get_results($prepare_query);


「call_user_func_array()」という関数を使うと、指定した関数にいくつも引数をセットして、呼び出すことことができるんですね。
(こんな便利な関数があるって知りませんでした・・)

以上!