HOMEBLOG ⟩ wpdbクラスを使って投稿情報を操作する

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