Categories: MySQLWordPress開発

WordPressでデータベースを使う

WordPressはそもそもMySQLを利用しているシステムなので当然かもしれませんが、データベースへのアクセスに便利なクラス$wpdbが用意されています。  

投稿、または固定ページの一つ(postIDが一番ちいさいもの)を取得します。

$query = "SELECT * FROM $wpdb->posts";
	$select_result = $wpdb->get_row($query);
	echo "

$select_result->ID : $select_result->post_title

";

  $wpdb は関数内で使うときは、globalで利用できるようにします。

function myFirstPosts(){
	global $wpdb;
	$query = "SELECT * FROM $wpdb->posts";
	$select_result = $wpdb->get_row($query);
	echo "

$select_result->ID : $select_result->post_title

"; } myFirstPosts();

  get_row の代わりに、get_results をつかうと複数行を取り出すことが出来ます。
というか、こっちが普通のSELECTですね。

function myAllPosts(){
	global $wpdb;
	$query = "SELECT * FROM $wpdb->posts";
	$select_result = $wpdb->get_results($query);
	foreach ($select_result as $row){
		echo "

$row->ID : $row->post_title

"; } } myAllPosts();

  独自のテーブルを作成するときは、$wpdb->query を使ってCREATE文できますが、dbDelta を使ったほうがいいです。
$wpdb->prefix でWPのプレフィックスを取得できます。

function createMyCustamTable($tableName){
	global $wpdb;
	$sql = "CREATE TABLE " . $wpdb->prefix . $tableName . " (
	id bigint(20) unsigned  PRIMARY KEY  AUTO_INCREMENT,
	name varchar(250)
	) " . $wpdb->get_charset_collate() . ";";
	dbDelta($sql);
}
createMyCustamTable("testTable");

ただし、dbDeltaを利用する場合、

・1行につき1つのフィールドを定義する。
・PRIMARY KEYと主キーの定義の間には二つのスペースが必要。
・INDEXという言葉ではなく、KEYという言葉を使う必要がある。

という制約があるので、これらを知らずにつかおうとすると、SQL文そのものがMySQL的にバッチリでもCREATEできなくて、ハマります。  

独自のテーブルからSELECTする場合。

function myAllCustamTable($tableName){
	global $wpdb;
	$query = "SELECT * FROM " . $wpdb->prefix . $tableName;
	$select_result = $wpdb->get_results($query);
	foreach ($select_result as $row){
		echo "

$row->id : $row->name

"; } } myAllCustamTable("testTable");

 

DELETEなど、データを取得しないクエリの場合、$wpdb->query を使う。(ただし、普通に削除する場合は後述の$wpdb->deleteがあるので、そっちを使う)

function deleteMyCustamTable($tableName , $id){
	global $wpdb;
	$query = "DELETE FROM " . $wpdb->prefix . $tableName . " WHERE id=$id";
	$wpdb->query($query);
}
deleteMyCustamTable("testTable" , 1);

 

行を追加する場合も、$wpdb->queryが使えますが、ユーザーの入力内容をSQL文に入れる場合など、SQLインジェクション攻撃対策が必要な場合は、$wpdb->prepareを使う。

function insertMyCustamTable($tableName , $id , $name){
	global $wpdb;
	$query = "INSERT INTO
	INSERT INTO " . $wpdb->prefix . $tableName
	(id, name)
	VALUES (%d , %s)";
	$wpdb->prepare($query , $id , $name);
}
insertMyCustamTable("testTable" , 1 , "TEST1");

 

行を追加するには、$wpdb->insertを使うと便利な上に、SQLインジェクション攻撃対策も同時になされるので安心。

$wpdb->insert('testTable', array( 'id' => 2, 'name' => 'TEST2' ));

 

更新も$wpdb->updateが用意されています。

$wpdb->update('testTable', array( 'id' => 2, 'name' => 'TEST' ));

 

行を削除するには、$wpdb->deleteを使います。

$wpdb->delete( $wpdb->posts, array( 'ID' => 2 ) );

 

取得したデータのカラム名など調べたければ、SELECTなどのあとに $wpdb->get_col_info で調べられます。

	$query = "SELECT * FROM $wpdb->posts";
	$select_result = $wpdb->get_results($query);
	$colInfo = $wpdb->get_col_info('type', offset);
	foreach ($colInfo as $col){
		echo "

$col

"; }

 

SELECTするまえにカラム名を調べたければ、wpdb->get_col で取得したほうが手っ取り早い。

	$query = "DESC $wpdb->posts";
	$colInfo = $wpdb->get_col($query);
	foreach ($colInfo as $col){
		echo "

$col

"; }

ちなみに、DESC は、DESCRIBE と同じ。(MySQL DESCRIBE)  

$wpdbのメソッド一覧 https://developer.wordpress.org/reference/files/wp-includes/wp-db.php/  
$wpdbの中身を見てみますと。。。

object(wpdb)[1]
  public 'show_errors' => boolean false
  public 'suppress_errors' => boolean false
  public 'last_error' => string '' (length=0)
  public 'num_queries' => int 21
  public 'num_rows' => int 0
  public 'rows_affected' => int 0
  public 'insert_id' => int 0
  public 'last_query' => string 'SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = 'nav_menu' AND t.name = 'メインメニュー' LIMIT 1' (length=175)
  public 'last_result' => 
    array (size=0)
      empty
  protected 'result' => resource(131, mysql result)
  protected 'col_meta' => 
    array (size=1)
      'wp_terms' => 
        array (size=4)
          'term_id' => 
            object(stdClass)[2267]
              ...
          'name' => 
            object(stdClass)[2268]
              ...
          'slug' => 
            object(stdClass)[2262]
              ...
          'term_group' => 
            object(stdClass)[2406]
              ...
  protected 'table_charset' => 
    array (size=1)
      'wp_terms' => string 'utf8' (length=4)
  protected 'check_current_query' => boolean true
  private 'checking_collation' => boolean false
  protected 'col_info' => null
  public 'queries' => null
  protected 'reconnect_retries' => int 5
  public 'prefix' => string 'wp_' (length=5)
  public 'base_prefix' => string 'wp_' (length=5)
  public 'ready' => boolean true
  public 'blogid' => int 0
  public 'siteid' => int 0
  public 'tables' => 
    array (size=9)
      0 => string 'posts' (length=5)
      1 => string 'comments' (length=8)
      2 => string 'links' (length=5)
      3 => string 'options' (length=7)
      4 => string 'postmeta' (length=8)
      5 => string 'terms' (length=5)
      6 => string 'term_taxonomy' (length=13)
      7 => string 'term_relationships' (length=18)
      8 => string 'commentmeta' (length=11)
  public 'old_tables' => 
    array (size=3)
      0 => string 'categories' (length=10)
      1 => string 'post2cat' (length=8)
      2 => string 'link2cat' (length=8)
  public 'global_tables' => 
    array (size=2)
      0 => string 'users' (length=5)
      1 => string 'usermeta' (length=8)
  public 'ms_global_tables' => 
    array (size=7)
      0 => string 'blogs' (length=5)
      1 => string 'signups' (length=7)
      2 => string 'site' (length=4)
      3 => string 'sitemeta' (length=8)
      4 => string 'sitecategories' (length=14)
      5 => string 'registration_log' (length=16)
      6 => string 'blog_versions' (length=13)
  public 'comments' => string 'wp_comments' (length=13)
  public 'commentmeta' => string 'wp_commentmeta' (length=16)
  public 'links' => string 'wp_links' (length=10)
  public 'options' => string 'wp_options' (length=12)
  public 'postmeta' => string 'wp_postmeta' (length=13)
  public 'posts' => string 'wp_posts' (length=10)
  public 'terms' => string 'wp_terms' (length=10)
  public 'term_relationships' => string 'wp_term_relationships' (length=23)
  public 'term_taxonomy' => string 'wp_term_taxonomy' (length=18)
  public 'usermeta' => string 'wp_usermeta' (length=13)
  public 'users' => string 'wp_users' (length=10)
  public 'blogs' => null
  public 'blog_versions' => null
  public 'registration_log' => null
  public 'signups' => null
  public 'site' => null
  public 'sitecategories' => null
  public 'sitemeta' => null
  public 'field_types' => 
    array (size=34)
      'post_author' => string '%d' (length=2)
      'post_parent' => string '%d' (length=2)
      'menu_order' => string '%d' (length=2)
      'term_id' => string '%d' (length=2)
      'term_group' => string '%d' (length=2)
      'term_taxonomy_id' => string '%d' (length=2)
      'parent' => string '%d' (length=2)
      'count' => string '%d' (length=2)
      'object_id' => string '%d' (length=2)
      'term_order' => string '%d' (length=2)
      'ID' => string '%d' (length=2)
      'comment_ID' => string '%d' (length=2)
      'comment_post_ID' => string '%d' (length=2)
      'comment_parent' => string '%d' (length=2)
      'user_id' => string '%d' (length=2)
      'link_id' => string '%d' (length=2)
      'link_owner' => string '%d' (length=2)
      'link_rating' => string '%d' (length=2)
      'option_id' => string '%d' (length=2)
      'blog_id' => string '%d' (length=2)
      'meta_id' => string '%d' (length=2)
      'post_id' => string '%d' (length=2)
      'user_status' => string '%d' (length=2)
      'umeta_id' => string '%d' (length=2)
      'comment_karma' => string '%d' (length=2)
      'comment_count' => string '%d' (length=2)
      'active' => string '%d' (length=2)
      'cat_id' => string '%d' (length=2)
      'deleted' => string '%d' (length=2)
      'lang_id' => string '%d' (length=2)
      'mature' => string '%d' (length=2)
      'public' => string '%d' (length=2)
      'site_id' => string '%d' (length=2)
      'spam' => string '%d' (length=2)
  public 'charset' => string 'utf8' (length=4)
  public 'collate' => string '' (length=0)
  protected 'dbuser' => string 'root' (length=4)
  protected 'dbpassword' => string 'password' (length=12)
  protected 'dbname' => string 'wordpress' (length=9)
  protected 'dbhost' => string 'host' (length=2)
  protected 'dbh' => resource(21, mysql link)
  public 'func_call' => string '$db->query("SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = 'nav_menu' AND t.name = 'メインメニュー' LIMIT 1")' (length=189)
  public 'is_mysql' => boolean true
  protected 'incompatible_modes' => 
    array (size=5)
      0 => string 'NO_ZERO_DATE' (length=12)
      1 => string 'ONLY_FULL_GROUP_BY' (length=18)
      2 => string 'STRICT_TRANS_TABLES' (length=19)
      3 => string 'STRICT_ALL_TABLES' (length=17)
      4 => string 'TRADITIONAL' (length=11)
  private 'use_mysqli' => boolean false
  private 'has_connected' => boolean true
  public 'categories' => string 'wp_categories' (length=15)
  public 'post2cat' => string 'wp_post2cat' (length=13)
  public 'link2cat' => string 'wp_link2cat' (length=13)
nakaike