wpdbクラスを使って投稿情報を操作する
wpdbクラスで出来ること
wp query や get posts を使用して、投稿を取得・操作することが大半かもしれませんが、DBから情報の取得・操作をすることができます。
wpdbクラスは、データベースとのやりとりに必要な関数が含まれています。$wpdbオブジェクトを使うことで、投稿の検索・操作・更新・削除などが可能になります。
なお、クエリの結果はキャッシュされるので、あとから使うこと可能です
・データベースへの接続方法
$wpdbにて関数を呼び出すことでDBに接続し操作することが可能になります。
// $wpdb->posts というテーブルのpost_type 'post'の投稿を取得
$query = "SELECT * FROM $wpdb->posts WHERE post_type = 'post'";
$results = $wpdb->get_results( $wpdb->prepare( $query, 1, $type ) );
・変数1つだけ取得
変数を1つだけ取得したい場合は、get_varを使用します。
//ユーザー数を取得する場合
$user_count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->users" );
・行を取得
クエリ全体から行を取り出したい場合は、get_rowを使用します。
マッチするものがない場合はNULLを返します。
//IDが10のリンクに関する情報を取得
$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10");
出力結果は、オブジェクト、連想配列、インデックス配列のいずれかを選択することが可能です
- OBJECT オブジェクトとして出力
- ARRAY_A 連想配列として出力
- ARRAY_N インデックス配列として出力
その場合は、実行したいクエリの後に以下のように出力タイプを記述します。※初期値はOBJECT
/出力タイプが連想配列の場合
$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10",ARRAY_A);
・列を取得
列を取得する場合は、get_colを使用します。
なお、この関数は一次元配列で出力されます。
$post_id = get_the_ID();
// post_idと一致する table_name内の field_name値の配列を取得
$query = "SELECT field_name FROM table_name WHERE post_id = %d",$post_id);
$value = $wpdb->get_col($query);
・検索し情報を取得
get_resultsは、投稿情報など様々な情報を検索し結果を取得することができます。結果は、配列として返されます。
//post type 'post'の投稿を取得
$query = "SELECT * FROM $wpdb->posts WHERE post_type = 'post'";
$results = $wpdb->get_results( $query );
出力結果は、いずれかを選択することが可能です。
なお、初期値は OBJECTになります
- OBJECT インデックス配列として出力
- OBJECT_K 連想配列として出力(第1カラムの値をキー、行オブジェクトを値とする)
- ARRAY_A インデックス配列として出力(要素は1行を表す連想配列で、そのキーはカラム名)
- ARRAY_N インデックス配列として出力(要素は1行を表すインデックス配列)
・テーブルへ行を追加
テーブルへ行を追加したい場合は、insertを使用します。挿入できなかった場合は、falseを返します。
$wpdb->insert(
'table名',
//挿入するデータを設定(キー:カラム名、値:挿入する値)
array(
'カラム名1' => '値1',
'カラム名2' => 123
),
//値のフォーマットを設定('カラム名1の値','カラム名2の値')
array(
'%s',
'%d'
)
);
フォーマットは、挿入するデータの値それぞれに適用する書式を配列で設定します。
- %s 文字列
- %d 整数 (すべて数字)
- %f 浮動小数点数
・指定した行の値を置き換え
指定した行の値を置き換えるにはreplaceを使用します。
//テーブル 行10のカラム1、カラム2を置き換える場合
$wpdb->replace(
'table',
array(
'indexed_id' => 10,
'column1' => 'テキスト', //変更したい文字列
'column2' => 100000 //変更したい数値
),
//値のフォーマットを設定('indexed_idの値','column1の値','column2の値')
array(
'%d',
'%s',
'%d'
)
);
・テーブルの更新
テーブルを更新する場合は、updateを使用します。エラーが発生した場合は、falseを返し、成功すると更新された行の数を返します。
//ID 5の行を更新する場合
$wpdb->update(
//テーブル名
'table',
//データ
array(
'カラム1' => '値1',
'カラム2' => 20000
),
//whereとして使う 名前付き配列
array( 'ID' => 5 ),
//フォーマット
array(
'%s', // 値1
'%d' // 20000
),
//where のフォーマット
array( '%d' )
);
・行の削除
テーブル内のデータを削除する場合は、DELETEを使用します。
エラーの場合は、falseを返します。
//ID 5の行を削除する場合
$wpdb->delete(
//テーブル名
'table',
//削除する行の指定
array( 'ID' => 5 )
);
・クエリを実行
$wpdb->queryを使用すると、様々なSQLクエリを実行できます。
この関数は、成功するとtrueを返し、エラーの場合falseを返します。
//ID 5 の投稿から投稿メタ'type'のキーと値を削除
$wpdb->query(
$wpdb->prepare(
"
DELETE FROM $wpdb->postmeta
WHERE post_id = %d
AND meta_key = %s
",
5, 'type'
)
);
//ID 10 の固定ページを親にして、ID 20 の固定ページを下書き投稿
$wpdb->query(
"
UPDATE $wpdb->posts
SET post_parent = 10
WHERE ID = 20
AND post_status = 'draft'
"
);
・SQL インジェクション攻撃からクエリを保護
SQL インジェクション攻撃からクエリを保護するため、実行前にクエリデータをすべてSQLエスケープする必要があります。
その際に、prepareメゾットを使用します。
$sql = $wpdb->prepare(
// 実行したい SQL クエリ
$query,
//プレースホルダーへ代入する値
$value_parameter[, $value_parameter ... ]
);
・SQLエラーの確認方法
SQL文のエラーを確認する必要がある場合は、以下の関数を使用する事で確認できます。
<?php $wpdb->show_errors(); ?> //有効化
<?php $wpdb->hide_errors(); ?> //無効化
また、最後に実行されたクエリにエラーがあった場合は、
<?php $wpdb->print_error(); ?>
で表示を確認することもできます。
・マルチサイトの場合
マルチサイトのデータベースを表示する場合は、定数 DIEONDBERROR を以下のように定義する必要があります。
<?php $wpdb->print_error(); ?>
参考:関数リファレンス/wpdb Class