SQL:select文を実行してデータを取得・表示してみる。その2:【34日目】WordPress1日1プラグイン

ようこそのお運びで、厚く御礼申し上げます。
34日目です。前回と同じく、今回もデータベースを扱います。
※注意:あくまでも検証用のスクリプト・プラグインです。

データの取得形式を選択して、SQL:select文を実行してデータベースからデータを取得・表示してみる

ということで、今回は前回のものに「データ形式の選択」をプラスして、実際にそのデータを取得してみましょう。
管理画面に「select文のデータ選択」メニューを作って
140220-0001
データ形式をセレクトボックスから選択
140220-0003
取得した値を出力します。
140220-0004

まずは、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のプログラムはすごいんじゃないかな。

wordpress1日1プラグイン

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です