VPSサーバーでWebサイト公開 備忘録 ~Linux、MySQLからAJAXまで

WordPressのwpdbクラスを使ってテーブル操作

wpdbクラスを使ってテーブル操作を行う方法をまとめました。

※目次をクリックすると目次の下部にコンテンツが表示されます。

wpdbクラスの概要
・wp-includes/wp-db.php内に配置。
 
・PHPコードでWordPressデータベースにクエリーを実施する際にwpdbクラスを使用する。
このwpdbクラスを使用する事によってクエリを安全に実行できる。
wpdbクラスの基本的な使用方法
●グローバル$wpdbクラス
 
wpdbクラスを使用するにはグローバル変数として$wpdbを宣言しなければならない。
 
global $wpdb;
 
●get_var()関数
 
・データベースから変数を一つ返す。
・変数は一つしか返ってこないが、クエリの結果はすべてキャッシュされ、あとから使うことができる。
 
○構文
$wpdb->get_var( ‘query’, column_offset, row_offset )
 
query:実行したいSQLクエリ。パラメータを null にすると、前回のクエリ結果のキャッシュ中から指定した変数を返す。
column_offset:必要としている列のオフセット。
row_offset:必要としている行のオフセット。
 
例)
$user_count = $wpdb->get_var( “SELECT COUNT(*) FROM $wpdb->users” );
echo “<p>User count is {$user_count}</p>”;
 
●query()関数
 
○構文
$wpdb->query(‘query’);
 
一般的なSQLクエリを実行。
 
●prepare()関数
 
・SQLクエリに渡された変数をエスケープしてくれる。
・SQLインジェクション攻撃に対する備えとして重要。
・すべてのクエリはこの関数を介して実行すべき。
 
例)
$metakey = "Harriet's Adages";
$metavalue = "WordPress' database interface is like Sunday Morning: Easy.";

$wpdb->query( $wpdb->prepare( 
  "INSERT INTO $wpdb->postmeta
    ( post_id, meta_key, meta_value )
      VALUES ( %d, %s, %s )", 10, $metakey, $metavalue 
) );
wpdbクラスを使ってデータ取得、更新

1)データ取得


 
●行のSELECT get_row()
 
・クエリから行全体を取り出す。
・行がオブジェクト、連想配列、またはインデックス配列として返される。
・クエリが一つ以上の行にマッチする場合は、あとから使えるようにすべての行がキャッシュされるが、実際に返されるのは指定された行のみ。
 
○構文
$wpdb->get_row(‘query’, output_type, row_offset);
query:実行したいクエリ。
output_type:以下の定数のいずれか。初期値は OBJECT。
 OBJECT – 結果をオブジェクトとして出力。
 ARRAY_A – 結果を連想配列として出力。
 ARRAY_N – 結果をインデックス配列として出力。
row_offset:必要としている行のオフセット。
 
例)
$mylink = $wpdb->get_row(
            $wpdb->prepare(
             "SELECT * FROM $wpdb->links WHERE link_id = %d", 10
            ), ARRAY_A
          );
echo $mylink['link_id']; // "10" をプリント

 
●複数行の結果を取得 get_results()
 
・クエリの結果全体を配列として返す。
・この配列の各要素はクエリ結果の各行と対応しており、get_rowと同じくオブジェクト、連想配列、またはインデックス配列のいずれかを指定することができる。
 
○構文
$wpdb->get_results( ‘query’, output_type );
query:実行したい SQL クエリ。
output_type:以下の4つの定数のいずれか。初期値はOBJECT。
 OBJECT – 結果を行オブジェクトのインデックス配列として出力。
 OBJECT_K – 結果を行オブジェクトの連想配列として出力。
 ARRAY_A – 結果を連想配列として出力。
 ARRAY_N – 結果をインデックス配列として出力。
 
例)

$fivesdrafts = $wpdb->get_results(
                 "SELECT ID, post_title FROM $wpdb->posts
	            WHERE post_status = 'draft' 
		    AND post_author = 5"
               );
foreach ($fivesdrafts as $fivesdraft) {
  echo $fivesdraft->post_title;
}

 

2)挿入、更新、削除


 
・insert(),update(),delete()関数は、関数に渡されたクエリとデータを結合する際に内部でprepare()関数を使用しているので、prepare()関数でラップして使用する必要はない。
 
●挿入
 
○構文
$wpdb->insert( $table, $data, $format ); ?>
table:データを挿入するテーブル名。
data:(array)挿入するデータ。(column => valueペア)
format:(array|string):挿入する各カラムのフォーマット
 
例)
$wpdb->insert('table', 
	       array( 
	         'column1' => 'value1', 
		 'column2' => 123 
	       ), 
	       array( 
	         '%s', 
		 '%d' 
               )  
);

 
●更新
 
○構文
$wpdb->update( $table, $data, $where, $format, $where_format );
 
例)IDが1、TYPEが”new”で一つ目の列の値が文字列、2つ目の列の値が数値、という行を更新。

$wpdb->update('table', 
	      array( 
		'column1' => 'value1',
		'column2' => 123 
	      ), 
	      array( 
                'ID' => 1,
                'TYPE' = > "new"
              ), 
	      array( 
		'%s',
		'%d'
	      ), 
	      array(
                '%d'
                '%s'
              ) 
);

 
●削除
 
○構文
$wpdb->delete( $table, $where, $where_format = null );
 
例)
$wpdb->delete( ‘table’, array( ‘ID’ => 1 ), array( ‘%d’ ) );

wpdbクラスでSQLエラーを表示
●SQLエラーの表示・非表示
 
・show_errors()とhide_errors()を使い、エラーの出力を有効化・無効化できる。
・最後に実行されたクエリにエラーがある場合、print_error()でそのエラーを表示できる。
 
例)
$wpdb->show_errors(); //クエリ実行前に実行する
$results = $wpdb->get_results( ‘SELECT * FROM wp_options WHERE option_id = 1’, OBJECT );
$wpdb->print_error();
 
●キャッシュのクリア
 
・SQLの結果のキャッシュは、flush()でクリアできる。
・$wpdb->last_result、$wpdb->last_query、$wpdb->col_infoがリセットされる。
 
●意図した結果にならない原因究明時に有用なクラス変数
 
・$num_queries
実行されたクエリの数。
 
・$last_query
最後に実行されたクエリ。
 
・$last_error
最後に出力されたエラーメッセージ。
 
・$last_result
最後に実行されたクエリの結果。
 
・$col_info
最後に実行されたクエリの列情報。
 
・$insert_id
最後に実行されたINSERTクエリで、AUTO_INCREMENTによって生成されたID。
 
・$num_rows
最後に実行されたクエリで返された行の数。
 
・$queries
実行されたすべてのクエリを保存。wp-config.php内でdefine( ‘SAVEQUERIES’, true );を記述し、有効にする必要がある。
 
例)
var_dump( $wpdb->num_queries );
モバイルバージョンを終了