【WordPress】SQLによるデータベース操作【$wpdb】

WordPressで任意のテンプレートやループ外の場所で記事タイトルなどを取得したいとき、基本的には標準で用意された関数であるget_xxxなどを使用します。ただ、場合によっては、直接SQLを書いてデータベースを操作したいときがあります。そのようなときに使用するのがwpdbクラスです。wpdbクラスとは、WordPressでデータベース操作を行う一連の関数が含まれたクラスです。

クラスの詳細は関数リファレンス/wpdb Classに任せ、この記事では自分がよく使用するものを備忘録として残しておきます。

基本

wpdbクラスの使用方法

wpdbクラスの使用には、globalキーワードを使用して$wpdbを宣言する必要があります。

global $wpdb;
$wpdb->get_xxx...

SQLインジェクション対策

SQLに外部入力された値を使う際、不正な値の注入を防ぐためにプレースホルダーを利用します。

global $wpdb;

$id = 1;  // 数値なのでプレースホルダーは「%d」
$title = '%PHP%';  // 文字列なのでプレースホルダーは「%s」
$sql = "SELECT * FROM $wpdb->posts WHERE ID = %d OR post_title LIKE %s";

$posts = $wpdb->get_results($wpdb->prepare($sql, $id, $title));

取得

get_row()

取得行が一行と想定される場合はget_row()を使用します。

global $wpdb;

$id = 10;
$sql = "SELECT ID, post_title FROM $wpdb->posts WHERE ID = %d";
$post = $wpdb->get_row($wpdb->prepare($sql, $id));

var_dump($post);

// class stdClass#4419 (2) {
//   public $ID =>
//       string(2) "10"
//   public $post_title =>
//       string(12) "タイトル"
// }

get_results()

取得行が複数行と想定される場合はget_results()を使用します。

global $wpdb;

$post_title = '%wordpress%';
$sql = "SELECT ID, post_title FROM $wpdb->posts WHERE post_title LIKE %s";
$posts = $wpdb->get_results($wpdb->prepare($sql, $post_title));

var_dump($posts);

// array(2) {
//   [0] =>
//   class stdClass#4419 (2) {
//     public $ID =>
//         string(2) "20"
//     public $post_title =>
//         string(16) "WordPress ...."
//   }
//   [1] =>
//   class stdClass#4420 (2) {
//     public $ID =>
//         string(2) "25"
//     public $post_title =>
//         string(16) "... wordpress"
//   }
// }

追加・更新・削除

追加:$wpdb->insert()
更新:$wpdb->update()
削除:$wpdb->delete()

などの関数が用意されていますが、SQLを直接書きたいので$wpdb->query()を使用します。

新規追加

テーブルへ新規データ行を追加します。

global $wpdb;

$name = 'new';
$val  = 10;

$result = $wpdb->query($wpdb->prepare(
	"
	INSERT INTO $wpdb->options
	(option_name, option_value)
	VALUES (%s, %d)
	",
	$name, $val
));

// 影響を受けた行
var_dump($result); // 1

// AUTO_INCREMENTで生成されたID
var_dump($wpdb->insert_id); // 1600

更新

global $wpdb;

$id = 1500;
$name = 'new';
$val  = 15;

$result = $wpdb->query($wpdb->prepare(
	"
	UPDATE $wpdb->options
	SET option_name = %s, option_value = %d
	WHERE option_id = %d
	",
	$name, $val, $id
));

// 影響を受けた行
var_dump($result); // 1

削除

global $wpdb;

$id = 1654;

$result = $wpdb->query($wpdb->prepare(
	"
	DELETE FROM $wpdb->options
	WHERE option_id = %d
	",
	$id
));

// 影響を受けた行
var_dump($result); // 1

テーブル作成

global $wpdb;

$bool = $wpdb->query(
	"
	CREATE TABLE IF NOT EXISTS test_table (
		ID   INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
		name CHAR(255) NOT NULL,
		age  TINYINT UNSIGNED DEFAULT 1,
		memo TEXT,
		flag BOOLEAN,
		PRIMARY KEY (ID),
		INDEX id_index(name)
	);
	"
);