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)