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