ようこそのお運びで、厚く御礼申し上げます。
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のプログラムはすごいんじゃないかな。
 
                   		               		  