WordPress のカスタムテーブルでデータの取得や更新をする

WordPress のカスタムテーブルに関する基礎」の記事で、テーブルを新規生成・削除する基礎について解説しました。本記事では、新規生成したテーブルのデータを操作する方法について解説します。

今回の記事を読まれる前に

ケミ

本記事内で使用されているカスタムテーブルの新規生成や、データベース操作についての wpdb クラスなどについて「WordPress のカスタムテーブルに関する基礎」の記事で解説を行っています。本記事を読まれる前に、そちらの記事を先にお読みいただければ、理解が深まるかもしれません。

サンプルコードについて

解説したソースコード全体を動作するかたちで記述しているファイルは、記事の最後からダウンロードできるようにしています。動作確認される場合は、そちらをダウンロードしてご確認ください。

カスタムテーブル内にデータを追加・更新してみよう

ブリエ

カスタムテーブルを新規生成した時は、wpdbクラスを使用したし、削除にはその query 関数を使ったんだっけ。データを作成や更新する場合もwpdbクラスの query 関数を使うのかな?

テネーブル

そうですね。wpdb クラスの query 関数で SQL構文をクエリ操作する形で、INSERT(データ追加)やUPDATE(データ更新)を行う形でもテーブル内にデータを追加・更新が可能です。しかし、今回はそれらは使わずに replace 関数と言う関数を使用する方法で解説します。

ブリエ

replace って置き換えると言う意味ですよね?データを置き換えるんですか?

テネーブル

はい。replace 関数は、指定されたデータがある場合にデータの置き換え(更新)を行います。しかし、もともとデータが無い場合は、無いデータを置き換えると言う行為をしますので、データの作成となります。

そのことは、WordPress Codex の下記のウェブページにも記載されています。

行のReplace – WordPress Codex
ルミェール

実際のコードを見ていこう。

// wpdb クラスをグローバル宣言
global $wpdb;
// テーブル名の設定
$table_name = $wpdb->prefix . 'customtable_sample';
// オプションの名前
$option_name = 'test';
// オプションの値
$option_value = maybe_serialize( 'データの値です' );
// replace 関数の実行
$result = $wpdb->replace(
	$table_name,
	[
		'option_name'  => $option_name,
		'option_value' => $option_value,
	],
	[
		'%s',
		'%s',
	]
);
テネーブル

replace 関数の第1引数として、データを操作する対象のテーブル名を指定します。

次の第2引数では、データを追加・更新するカラム名と値を設定します。

maybe_serialize 関数は、データのシリアル化が必要な場合にデータをシリアル化する関数です。PHPの配列などの値はそのままデータベースで保存できませんので、シリアル化をする形で、データベースで保存できる値に変更しているのです。

最後の第3引数は、値のフォーマット書式の指定となります。書式の値は以下の通りになります。

フォーマットで使える書式の値は:
%s – 文字列

%d – 整数(全部が数字)

%f – 浮動小数点数

参考ウェブサイト:WordPress Codexより引用
テネーブル

今回の値はシリアル化も行っておりますので、シリアル化した後の文字列型がフォーマット書式となります。その為、%s を指定しています。

ルミェール

ほとんど行わないけど、第1引数のテーブル名の指定は、カスタムテーブルだけではなく、WordPress 標準のテーブルを対象にもできるよ。ほとんど行わない理由は、WordPress 標準のテーブルの場合には、そのテーブル内のデータを安全に操作するための専用の関数が用意されているから。データを直接自由に操作するのは危険だものね!

insert や update は不要?

ブリエ

何故、insert 関数や update 関数を使わないんですか?

テネーブル

今回のような正しく一意性を持つデータのみを格納しているテーブルであれば、他に重複するデータが存在しません。そのことから replace 関数であっても他のデータが置換されない為です。

今回のテーブルでは option_name は一意となるカラム名ですので、option_name には同じ値が保存(データが重複)される事は、ありませんよね。そう言った場合は replace 関数を使う事も可能なのです。

しかし、設定するデータが重複する構造のデータであれば、replace 関数では指定した値に該当するすべてのデータが置換されてしまいます。その為、そう言ったケースでは insert 関数や update 関数を正しく使う必要があります。もし、複雑なテーブル構造を使用する場合は replace 関数を使用せずにトランザクション制御を行った上で insert 関数や update 関数を使用した方が良いでしょう。

ルミェール

今回は、トランザクション制御や、insert 関数、update 関数の説明は割愛するよ。

動作の確認をしてみよう

ブリエ

この処理の実行だけを行っても、データベースにデータが生成されてるのが確認できました。また、値を変更して実行してみると実際に変更された値が保存されるようになっていますね!

テーブル内のデータを取得してみよう

テネーブル

テーブル内のデータを取得する関数として、wpdb クラスには get_row 関数や get_results 関数が用意されています。一意性のデータであれば、データは1つしか存在しません。今回の場合であれば該当していますので、1つのデータを取得するget_row関数で取得が可能です。

global $wpdb;
// テーブル名の設定
$_table_name = $wpdb->prefix . 'customtable_sample';
// $option_nameの値を設定
$option_name = 'test';
// SQLクエリ文字列の設定
$query = $wpdb->prepare(
	"
		SELECT *
		FROM  %s
		WHERE option_name = %s
	",
	$_table_name,
	$_option_name
);
// get_row 関数の実行を行い、$option_row に結果を設定
$option_row = $wpdb->get_row( $query, ARRAY_A );
テネーブル

データを取得する為には SELECT と言った SQL 構文を使用して SQL クエリ文字列の記述を行います。しかし、そのまま記述を行うと脆弱性対策ができません。その為、wpdb クラスの prepare 関数によって SQL インジェクションといった脆弱性対策を行いましょう。prepare 関数の書き方については詳細を割愛しますが、dbDelta 関数のような制約があると思ってください。「SELECT 文を1カラム1行で記述し、変数をフォーマット書式の値で設定するという形」と覚えておけば良いです。

ルミェール

データが取得できない場合は null が返却され、取得できた場合は第2引数に ARRAY_A を設定している場合は連想配列でデータが返却されるよ。$option_row['option_value'] のように各カラムの値が扱えるんだ。

テーブル内のデータを削除してみよう

テネーブル

テーブル内データを削除するにはwpdbクラスの query 関数を使って DELETE と言った SQL 構文でクエリ操作するのも良いですが、安全にデータを削除する為に削除専用に用意された delete 関数があります。

global $wpdb;
// テーブル名の設定
$table_name = $wpdb->prefix . 'customtable_sample';
// $option_name の値を設定
$option_name = 'test';
// delete関数の実行
$result = $wpdb->delete(
	$table_name,
	[
		'option_name' => $option_name
	],
	[
		'%s'
	]
);
テネーブル

この delete 関数は、指定した条件に一致するデータをすべて削除されますのでご注意ください。引数については replace 関数の指定方法とほぼ変わりませんので、そちらをご覧ください。

ルミェール

重要なデータが消えてしまう可能性もあるので、解らない場合には WordPress が標準で用意しているテーブル名などは指定しないようにしてね!

ブリエ

正しく動作ができるとデータが削除され $result に削除された行の数値を返却されますね。エラーが発生した場合は false の値を返却されます。

サンプルコードのダウンロード

ケミ

解説したサンプルコードを実際にプラグインで動作するようにしているファイルです。勉強される時以外にはプラグインを有効化していたとしても意味ありませんので、勉強後はアンインストールと削除を忘れないようにしてください。

まとめ

ケミ

本記事も長くなりました。割愛していたinsert関数、update関数や、トランザクション制御についての解説は、別の記事で解説することにします。また、get_results関数を使用して複数のデータを処理する方法なども別の記事で解説するようにします。(現在、執筆中ですので気長にお待ちください)

この記事の筆者

Kmix39(ケミ)

電子の妖精。当ウェブサイトの記事制作などを行なっています。
金融・不動産・医療・教育などの数々の業種のシステム開発を経験を積み、スマートフォンアプリケーションと WordPress などのウェブアプリケーションを日々勉強中。