みんなー!WordPressでSQLゴリゴリ書いてるかーい!
しーーん
ここ半年ほどITかあさんはWordPressでQueryをゴリゴリ書いてます。
今更ながら
お!wpdbすごいぞ!SELECT文 UPDATEを直接書くよりも楽!
と驚きまして、せっかくなので
すごいぞ!今すぐ使えるwpdb
をまとめたいと思います。
なお、基本的にこの記事はCodex:Class Reference/wpdbに書いてある内容とそれほど変わらないので、そちらを見て頂いても大丈夫です。
プリペアドステートメント
SQLをゴリゴリ書く前にwpdbでqueryを書く際で最も重要なプリペアドステートメントについてです。
(プリペアドステートメントと聞いて全くピンと来ない人はブラウザをそっと閉じてください。そんな人はまだSQL書いてはいけません。ヤケドを負います。負傷します。)
$wpdb->prepare(‘query’,$vaule1,$vaule2…)
$prepared_sql = $wpdb->prepare(
”
INSERT INTO $wpdb->postmeta
( post_id, meta_key, meta_value )
VALUES ( %d, %s, %s )
“,
10,
$metakey,
$metavalue
);
プリペアドステートメントはこんな感じで、$prepared_sqlにプリペアドステートメント化されたSQLが入ります。
上記$prepared_sql(プリペアステートメントをセットした状態のSQL)をver_dumpで確認するとこんな感じ。
INSERT INTO wp_postmeta
( post_id, meta_key, meta_value )
VALUES ( 10, ‘meta_key’, ‘meta_value’ )
text型ならセットした変数の部分がコロンで囲われます。
mysqli_prepare() なんかと考え方は一緒ですね。
SELECT文
複数件取得
$myrows = $wpdb->get_results( "
SELECT * FROM $wpdb->users
" );
これだとwp_usersテーブルに存在するデータ全件取得してしまうのでプリペアドステートメントを使って条件指定をするならこんな感じ。
$prepared_sql = $wpdb->prepare( ”
SELECT *
FROM $wpdb->users
WHERE status = %d
“,
0
);
$wpdb->get_results($prepared_sql);
※statusが0のデータをwp_usersテーブルから全件取得
1件だけ取得
戻りが複数件ではなく、1件しか無い時は、get_rowが使えます。
$prepared_sql = $wpdb->prepare( ”
SELECT *
FROM $wpdb->users
WHERE ID = %d
“,
1
);
$wpdb->get_row($prepared_sql);
※user_idが1のユーザーを取得
特定のフィールドだけを指定して取得
get_rowもget_resultも、先ほどは行全体を取得していましたが、IDだけ!titleだけ!とか、特定のフィールドだけを指定して取得することもできます。
$prepared_sql = $wpdb->prepare( ”
SELECT ID
FROM $wpdb->users
WHERE user_login = %s
“,
‘hoge’
);
$wpdb->get_col($prepared_sql);
user_loginフィールド hoge のIDを取得
データの登録・削除・更新
今までINSERTやUPDATE文をSQL書いていただけだったんですが、ちゃんとupdateやdeleteに便利な関数が用意されていたんですね。ちょっとFWのような立ち居振る舞いに感激しました
INSERT
行のINSERTにも基本のフォーマットがあります
$wpdb->insert(
‘table’,
array(
‘column1’ => ‘value1’,
‘column2’ => 123
),
array(
‘%s’,
‘%d’
)
);
データの更新
global $wpdb;
//更新したい内容(post_statusを更新する)
$data = array(
‘post_status’ => $status,
);
//更新したい行の条件
$condition = array(
‘ID’ => $objct_id
);
$dataFormat = array(‘%s’);
$conditionsFormat = array(‘%d’);
$wpdb->update(‘wp_posts’, $data, $condition,$dataFormat,$conditionsFormat);
データの削除
これはとっても簡単
$wpdb->delete( ‘table’, array( ‘ID’ => 1 ), array( ‘%d’ ) );
以上です。UPDATEとDELETEがすごくフレームワークチックで大好き。functions.phpやプラグイン開発時に使って下さい。