ようこそのお運びで、厚く御礼申し上げます。
34日目です。前回と同じく、今回もデータベースを扱います。
※注意:あくまでも検証用のスクリプト・プラグインです。
データの取得形式を選択して、SQL:select文を実行してデータベースからデータを取得・表示してみる
ということで、今回は前回のものに「データ形式の選択」をプラスして、実際にそのデータを取得してみましょう。
管理画面に「select文のデータ選択」メニューを作って
データ形式をセレクトボックスから選択
取得した値を出力します。
まずは、function.phpに書いてみます。
では、function.phpに以下のコードを書きました。
//オブジェクトを生成 new Paka3SQLSelect; //クラス定義 class Paka3SQLSelect { //コンストラクタ function __construct() { //################### //SQL global $wpdb; $this->paka3_sql="SELECT meta_key FROM {$wpdb->postmeta} GROUP BY meta_key"; //################### add_action('admin_menu', array($this, 'adminAddMenu')); } //管理メニューの設定 function adminAddMenu() { add_submenu_page("options-general.php", 'select文のデータ選択', 'select文のデータ選択', 'edit_themes', 'sqlselect_setting', array($this,'paka3_sql_page')); } //表示する内容と処理 function paka3_sql_page() { global $wpdb; $paka3_sql=$this->paka3_sql; //**管理画面SQL文を実行する(select文のみ)の処理 if(isset($_POST['r_type']) && check_admin_referer('paka3sql')){ $r_type=$_POST['r_type']; //$wpdb->get_results('query', output_type); //連想配列、またはインデックス配列のいずれかを指定 $r_type_check = mb_split('-',$r_type); if($r_type_check[0]=="results"){ $r = $wpdb->get_results( $paka3_sql, $r_type_check[1]); }elseif($r_type_check[0]=="col"){ $r = $wpdb->get_col( $paka3_sql); }elseif($r_type_check[0]=="row"){ $r = $wpdb->get_row( $paka3_sql); }elseif($r_type_check[0]=="var"){ $r = $wpdb->get_var( $paka3_sql); } $paka3_sql_result =$r; } //表示する内容(HTML) $data = array( array("$wpdb->get_results($sql,OBJECT)","results-OBJECT",""), array("$wpdb->get_results($sql,OBJECT_K)","results-OBJECT_K",""), array("$wpdb->get_results($sql,ARRAY_A)","results-ARRAY_A",""), array("$wpdb->get_results($sql,ARRAY_N)","results-ARRAY_N",""), array("$wpdb->get_col($sql)","col",""), array("$wpdb->get_row($sql)","row",""), array("$wpdb->get_var($sql)","var",""), ); $wp_n = wp_nonce_field('paka3sql'); echo <<<EOS <style type="text/css"><!-- .paka3sql b, .paka3sql h4{color:#f00} .paka3sql textarea{width:100%;} .sql_r pre{background:#fff; padding:5pt; font-size:12pt; border:1px solid #ccc} --></style> <div class="wrap"> <h2>SQL文を実行する(select文のみ)</h2> <h3><pre>{$paka3_sql}</pre></h3> <form method="post" action="" class="paka3sql"> {$wp_n} <b>取得する形式:</b><select name="r_type"> EOS; foreach($data as $d){ if($d[1]==$r_type) $d[2] ="selected"; echo <<<EOS <option value="{$d[1]}" {$d[2]}>{$d[0]} EOS; } echo <<<EOS </select> <p class="submit"><input type="submit" name="Submit" class="button-primary" value="SQL文を実行する" /></p> <div class="sql_r"> <h3>結果</h3> <pre> EOS; if(!$paka3_sql_result) { echo "<span>結果なし</span>"; }else{ print_r($paka3_sql_result); } echo <<<EOS </pre> </form> </div> EOS; } }
ポイントはどこ?
今回もデータベースを扱うので、こちらのwpdbクラスについて調べてみます。(WordPress Codex日本語版:wpdb Class)
また、今回は「Paka3SQLSelect」というクラスを作成してコードを書いていきます。
- 呼び出し:クラスオブジェクトを生成します。
//オブジェクトを生成 new Paka3SQLSelect;
-
クラスを定義します
//クラス定義 class Paka3SQLSelect{ //コンストラクタ(オブジェクト生成時呼出) function __construct() { //・SQL文の設定 //・管理メニューの呼び出し } //管理メニュー function adminAddMenu() { //・管理メニューの設定 } //表示する内容と処理 function paka3_sql_page() { //・グローバル変数 $wpdb //データベースに接続しますよ!って設定された変数 global $wpdb; //・選択した取得形式の分岐 //・$wpdbを使って、SQL分を実行してデータを取得 //・表示する内容(HTML) echo <<<EOS //ここに表示内容を記入 //セレクトボックスを追加 EOS; } }
- コンストラクタ:オブジェクト生成時に呼び出します。
・$wpdb->postmeta:接続詞付きのテーブル名を取得し、SQL文を設定。
・管理画面のメニューを呼び出します。function __construct() { //select文を設定します。 global $wpdb; $this->paka3_sql="SELECT meta_key FROM {$wpdb->postmeta} GROUP BY meta_key"; //・管理メニューの呼び出し add_action('admin_menu', array($this, 'adminAddMenu')); }
- 管理メニューの設定を行います。今回は「設定」のしたに「select文を試す」というメニューを追加します。
//管理メニューの設定 function adminAddMenu() { add_submenu_page("options-general.php", 'select文のデータ選択', 'select文のデータ選択', 'edit_themes', 'sqlselect_setting', array($this,'paka3_sql_page')); }
- グローバル変数$wpdbを設定し、SQL文を実行します。
表示形式は、$wpdb->get_resultsのそれぞれのタイプ、$wpdb->get_col、$wpdb->get_row、$wpdb->get_varから選択
表示形式については、こちらを参照してください(WordPress Codex:wpdb)function paka3_sql_page() { global $wpdb; $paka3_sql=$this->paka3_sql; //**管理画面SQL文を実行する(select文のみ)の処理 if(isset($_POST['r_type']) && check_admin_referer('paka3sql')){ $r_type=$_POST['r_type']; //$wpdb->get_results('query', output_type); //連想配列、またはインデックス配列のいずれかを指定 $r_type_check = mb_split('-',$r_type); if($r_type_check[0]=="results"){ $r = $wpdb->get_results( $paka3_sql, $r_type_check[1]); }elseif($r_type_check[0]=="col"){ $r = $wpdb->get_col( $paka3_sql); }elseif($r_type_check[0]=="row"){ $r = $wpdb->get_row( $paka3_sql); }elseif($r_type_check[0]=="var"){ $r = $wpdb->get_var( $paka3_sql); } $paka3_sql_result =$r; } //表示する内容(HTML) echo <<<EOS //※省略... EOS; }
コードをプラグイン用のファイルにします
それではfunction.phpに書いたコードを消して、
「paka3_Sql_Select.php」というファイルを作成し、以下のコードを記入します。
このファイルを[wp-content]>「plugins」ディレクトリに入れ、管理画面で有効にして完了です。
今回のまとめ
WordPressのデータベースのテーブル構造は、ほんとよくできているのですが、それにもましてデータベースを扱う関数もよくできているような気がします。データベースのpostmetaテーブルとか理想的だとおもったけど、それを実現させるWordPressのプログラムはすごいんじゃないかな。