WordPressとは、膨大なプラグインを作ることのできる高度にカスタマイズが可能な優れたプラットフォームのことです。これらのプラグインはシンプルな関数から、膨大なタスクをこなす難解なプラグインまであります。
WordPressは、WordPress内にある投稿コンテンツを読み込む、新しいカテゴリーを創り出すというようなWordPressのデータベース内にある読み書きデータに異なるタスクを行う膨大な数の関数を提供しています。
これらの関数は、主にWordPressをベースに築いたプラグインのニーズを十分に満たしています。しかし、時には、直接データベースにクエリやオペレーションを行うために、データベースへの直接のアクセスが必要になります。このようなケースでは、WordPressはデータベースとの連動を許可しません。この記事では、どうすればデータベースと直接連動させることができるのかをみていきます。
wpdbと $wpdbを理解する
データベースの操作を行うために、WordPressはファイル(wp-includes\wp-db.php)の中にあるwpdbというクラスを提供しています。このクラスは、WordPressのためのデータベース関数とWordPressの関数が直接もしくは間接的にこのクラスを使用する関数のほとんどをまとめています。
このクラスは、ezSQLクラスを基本としています。データベースオペレーションを行うために、このクラスのオブジェクトを作れますが、WordPressはロード中にだけこのクラスのオブジェクトを作ります。
このオブジェクトは$wpdbでかつ、グローバルオブジェクトです。その為、データベースの操作を行いたい場合、このグローバル$wpdbオブジェクトを使用し、関数を呼ぶ出すのが適切です。いくつかの関数の中にある$wpdbを使用したい場合には、使用する前にグローバル変数を宣言する必要があります。
データベースから値を読み込む
$wpdbには、データベースから値を読み込む関数がたくさんあります。これらのうち、いくつかの関数は、データベースから1つの値、1行または1コラムを得ることに特化しています。
get_var
get_var関数は、クエリを読み込み、変数と直接結びつけることができる値に返す関数です。
投稿テーブル中の行の数を調べる場合には、get_varを使用する下記のコードを使うことができます。get_varは1つの値を戻すだけですが、クラスの$last_result変数の中の行全体をキャッシュします。
get_row
この方法は、クエリから完全な行を取り出すのに役に立ちます。クエリの中に取り込み、表示するためのパラメータをアウトプットすべきフォーマットにします。
ID = 1で列を投稿テーブルからフェッチする場合には、get_rowを使用して下記のようにできます。
get_rowするための最初のパラメータは、あるクエリと2番目のパラメータが下記のいずれかの値になります。
OBJECT (こちらがディフォルトの値) – この場合、オブジェクトとはオブジェクトの構成要素としてテーブルのコラムをもつオブジェクトのことです。
ARRAY_A – 結果を連想配列に戻します。
ARRAY_N – 結果を数的に割り出した配列にします。
get_col
この方法は、クエリから一つのコラムを抜き出すのに役に立ちます。この関数のアウトプットは、配列です。投稿のタイトルすべてを抜き出したい場合、下記のコードを使用できます。
get_results
この方法は、複数の列や複数のコラムの中から、ジェネリッククエリのアウトプットを得るために使用されます。この関数のためのディフォルトアウトプットは、それぞれのオブジェクトが結果の一行を示している場合のオブジェクトの配列です。その為、定義された特定のメタキーを含むすべての投稿情報を読み込むためのクエリを書きたい場合には、下記のようにget_resultsを使用できます。
Prepareメソッドを使用する
フォームなどでユーザーからデータを受け取り、クエリの一部にする場合があります。これが、クエリの中にSQLインジェクションがある場合には、問題を引き起こしかねません。
SQLインジェクションの中で、アタッカーがクエリをデータベースクエリを作るフォーム値の中にインジェクションします。このクエリはすべてのデータベースを削除するダンプと同じくらい危険です。
SQLインジェクションについてのより詳細な内容は、http://en.wikipedia.org/wiki/SQL_injectionをご覧ください。
wpdbプリペアーメソッドは、オーナーをSQLインジェクションから守るために使用されます。このプリペアーメソッドは、クエリを取り入れてパラメータ値に置換するprintfメソッドとよく似ています。
フォームフィールドから得た特定のIDの投稿の詳細な情報を得るためには、以下に示したクエリをサ二タイズするprepare関数を使用するとよいです。
$wpdbを使用しての挿入とアップデート
wpdbクラスを使用してどのようにWordPressのデータベースからデータを検索するかをみてきました。ここからは、$wpdbクラスによって、データを挿入、アップデートするためのwpdbによって提供される関数にはどのようなものがあるのかを見ていきましょう。
Insert関数
wpdbのinsert関数は、データベーステーブルに1列挿入します。insert関数は、表の名前、値の配置や自由なフォーマット配置のような因数を可能にします。
特定の書き込みのためのmeta value追加するinsert関数を使用するためには、下記のコードで可能です。
上のコードは、post_idが1、meta_keyがprice、meta_valueは500とし、postmetaテーブルの中に行を挿入します。
Update関数
wpdbは、データベーステーブルで値をアップデ―トするのに使用するアップデートメソッドを提供している。アップデート関数は、表題、変更のための値の配置、where句に使う値の配置、値を変更するためのオプションフォーマーット、where句のオプションフォーマットの引数を行います。
Postmetaテーブルの上部に挿入したmeta valueを変更したい場合には、下記のように行います。
ここでは、meta valueを750、post_idを1、meta_keyをpriceとしています。
その他役に立つ関数やwpdb
このwpdbクラスもまた下記のような役立つ関数を提供しています。
この関数は現在の情報をフラッシュするために使用されます。
show_errors –この関数はデータベースのエラーを見えるようにするために使用されます。
hide_errors –この関数は、データベースのエラーを見えなくするために使用されます。
tables –この関数は、WordPressの全てのテーブルを戻します。
replace –この関数は、データベーステーブルの中の行を置き換える為に使用されます。
delete –この関数は、データベーステーブルから行を消す為に使用されます。
クエリは注意しておこなうように
広くさまざまな関数と機能を持つWordPressはデータベース上でクエリや操作を行う際に不十分な特定のタスクを残しています。プラグインが新しいテーブルを作らなければならない場合、 $wpdbオブジェクトを使用したテーブル上に操作を行います。データベースでの操作は十分に注意していなければ、非常に危険なものとなる可能性があります。そこで直接データベースを操作する場合には、十分注意して行う必要があります。WordPressによってインストールされたテーブルについては、WordPressによって提供されている関数を使用することを強く推奨します。データベースクエリをライティングする場合には、インターネットでWordPressの電子フォーラムを検索してWordPress の同じ関数が利用可能かを調べるのが好ましいです。ダイレクトクエリはより良いオプションが無い場合のみ行うようにしましょう。