WordPressプラグインを作ってみる:第五回

【第五回WordPressの機能を追加するものにプラグインがありますが今回はこのプラグインの作り方を解説します。

第四回ではテーブル名とカラム名配列をサーバーに送って受け取る処理の解説をしましたが、今回は受け取ったテーブル名とカラム名配列で実際にデーターベースにアクセスして読み込んでみようかと思います。

【必要な事項】

①テーブル名とカラム名配列を受け取ったらデーターベースにSELECT命令を出す

②テーブルにカラム名が存在していたら読み込んで表示

③テーブルにカラム名が存在していない場合はエラー

以上になるかと思います。

        //POSTされたデータが選ばれたテーブル名とカラムの配列だったら
        }else if(isset($_POST['post_tablename']) && isset($_POST['post_columname'])){

            //で、テーブル名をゲットしとく
            $get_table=$_POST['post_tablename'];

            //まず、post_columnameの配列分の変数を作っておく
            $get_columns=$_POST['post_columname'];

            //配列が複数だった場合
            if(count($get_columns)>1){
                $get_column=implode(",",$_POST['post_columname']);//配列を,で区切って文字列にする
            }else{//配列が一つだった場合
                $get_column=$get_columns[0];
            }

            //じゃ、テーブルからカラムをSELECTする
            global $wpdb;//インスタンスを呼んでログイン
            $reading=$wpdb->get_results("SELECT $get_column FROM $get_table");

            if(!$reading){
                echo <<<TABLE
                <h1>SQL COMMAND : SELECT {$get_column} FROM {$get_table}</h1>
                <h2 style="color:red;">POSTしたTABLEのカラムは存在していません!</h2>
                <hr width='98%'>
                不正なテーブル情報がPOSTされています。
TABLE;
            }else{
                echo <<<TABLE
                <h1>SQL COMMAND : SELECT {$get_column} FROM {$get_table}</h1>
                POSTしたTABLEのカラムの内容を表示しています。
                <hr width='98%'>
                <table  border='1' cellpadding='5' bordercolor='#ffffff' width='98%'>
                <tr>
TABLE;

                //こっちはカラムの名前を表示
                for($r=0;$r<count($get_columns);$r++){
                    //変数を文字に変換しとかないとダメなもよう
                    $name=strval($get_columns[$r]);
                    echo "<td width='10%' bgcolor='#EEcccc'>".$name."</td>";
                }
                echo "</tr>";
                //OBUJECTなのでまず、$readingの配列数だけ繰り返す
                for($i=0;$i<count($reading);$i++){
                    echo "<tr>";
                    //次にカラム数だけ繰り返してカラムを抜き出す
                    for($c=0;$c<count($get_columns);$c++){
                        //変数を文字に変換しとかないとダメなもよう
                        $name=strval($get_columns[$c]);
                        echo "<td width='10%' bgcolor='#eeeeee'>".$reading[$i]->$name."</td>";
                    }
                    echo "</tr>";
                }
                echo "</table>";
            }

POSTされたカラム名が2つ以上の場合は配列を,で区切って文字に変換しています。1つしかない場合は最初の配列を入れています。また、カラムの変数は文字に変換しないとそのままではOBUJECTから抜き出せませんので注意です。

これでSELECT {$get_column} FROM {$get_table}のSQLコマンドを送信できます。$reading=$wpdb->get_results(“SELECT $get_column FROM $get_table”);してみましょう。

ちゃんと読み込めましたね。これでデータベースの内容を把握することができるようになりました。データベースの中身を覗いてみましょう。

【コード全般】

<?php
/*
Plugin Name: Show WordPress DataBase
Plugin URI: https://wspri.dip.jp/?p=155
Description: wordpress.*データベースを読んで一覧を表示するプラグイン
Author: jack.Amano
Version: 0.0
Author URI:https://wspri.dip.jp
*/

//オブジェクトを作成
new showtables;

//クラスを作る
class showtables{
    //コンストラクタ
    function __construct(){
        add_action('admin_menu', array($this, 'add_admin'));//管理者メニューに追加する準備
    }
    //メニューを追加する関数
    function add_admin(){
        if(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)=="ja"){
            $menuname="DB一覧表示";
        }else{
            $menuname="DB list display";
        }
        //level_8から10が管理者
        add_menu_page($nenuname,$menuname,'level_9', __FILE__, array($this,'show_DB'));
    }

    //DBを表示する関数
    function show_DB(){
        //non post
        if(isset($_POST['table_name']) && isset($_POST['colum_name'])){
            if(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)=="ja"){
                $massage02="テーブルのカラムが送信されないとカラムの内容を読み込めません。ここに表示されているテーブル名のカラムか確認してから[Read Table & Columns]ボタンを押してください。";
            }else{
                $massage02="If the table column is not sent, the contents of the column can not be read. Confirm that the table name column is displayed here, and then click the [Read Table & Columns] button.";
            }
            $table_mono=$_POST['table_name'];
            $colum_array=$_POST['colum_name'];
            echo <<<FORM
            <h1>Show WordPress Table & Columns</h1>
            {$massage02}
            <hr width="98%">
            <form method="post" action="" >
            <h2>TABLE NAME:<input type="text" name="post_tablename" value="{$table_mono}" style='font-size:20px;font-weight:900;'></h2>
FORM;

            for ($i=0;$i<count($colum_array);$i++){
                $c=$i+1;
                echo "<h4>&raquo; COLUMN{$c}:<input type='text' name='post_columname[]' value='{$colum_array[$i]}'></h4>";
            }
            echo <<<FORM
            <input type="submit" value="Read Table & Columns">
            </form>
FORM;
            $this->readDB();//選びなおせるようにしますね
        //POSTされたデータが選ばれたテーブル名とカラムの配列だったら
        }else if(isset($_POST['post_tablename']) && isset($_POST['post_columname'])){
            if(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)=="ja"){
                $errormsg1="POSTしたTABLEのカラムは存在していません!";
                $errormsg2="不正なテーブル情報がPOSTされています。";
                $massage03="POSTしたTABLEのカラムの内容を表示しています。";
            }else{
                $errormsg1="The column of TABLE that has been posted does not exist!";
                $errormsg2="Incorrect table information has been POSTed.";
                $massage03="Displays the contents of the posted TABLE column.";
            }
            //で、テーブル名をゲットしとく
            $get_table=$_POST['post_tablename'];
            //まず、post_columnameの配列分の変数を作っておく
            $get_columns=$_POST['post_columname'];
            //配列が複数だった場合
            if(count($get_columns)>1){
                $get_column=implode(",",$_POST['post_columname']);//配列を,で区切って文字列にする
            }else{//配列が一つだった場合
                $get_column=$get_columns[0];
            }
            //じゃ、テーブルからカラムをSELECTする
            global $wpdb;//インスタンスを呼んでログイン
            $reading=$wpdb->get_results("SELECT $get_column FROM $get_table");
            if(!$reading){
                echo <<<TABLE
                <h1>SQL COMMAND : SELECT {$get_column} FROM {$get_table}</h1>
                <h2 style="color:red;">{$errormsg1}</h2>
                <hr width='98%'>
                {$errormsg2}
TABLE;
            }else{
                echo <<<TABLE
                <h1>SQL COMMAND : SELECT {$get_column} FROM {$get_table}</h1>
                {$massage03}
                <hr width='98%'>
                <table  border='1' cellpadding='5' bordercolor='#ffffff' width='98%'>
                <tr>
TABLE;
                //こっちはカラムの名前を表示
                for($r=0;$r<count($get_columns);$r++){
                    //変数を文字に変換しとかないとダメなもよう
                    $name=strval($get_columns[$r]);
                    echo "<td width='10%' bgcolor='#EEcccc'>".$name."</td>";
                }
                echo "</tr>";
                //OBUJECTなのでまず、$readingの配列数だけ繰り返す
                for($i=0;$i<count($reading);$i++){
                    echo "<tr>";
                    //次にカラム数だけ繰り返してカラムを抜き出す
                    for($c=0;$c<count($get_columns);$c++){
                        //変数を文字に変換しとかないとダメなもよう
                        $name=strval($get_columns[$c]);
                        echo "<td width='10%' bgcolor='#eeeeee'>".$reading[$i]->$name."</td>";
                    }
                    echo "</tr>";
                }
                echo "</table>";
            }
        }else{
            $this->readDB();//このクラス内の関数を呼びます
        }
    }
    private function readDB(){
        if(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)=="ja"){
            $massage01="テーブル選択のラジオボタンをオンにして、そのテーブルのカラムを選択します。確認できたら[Set Form]ボタンを押してください。<br>テーブルまたはカラム名だけ送信することはできません。ラジオボタンがオフになっているテーブルのカラムを送信するとエラーになります。";
        }else{
            $massage01="Select the table selection radio button and select the columns for that table. After confirmation, please press the [Set Form] button. <br>You can not send only table or column names. It is an error to send a table column where the radio button is off.";
        }
        global $wpdb;//インスタンスを呼んでログイン
        $tables=$wpdb->get_results("SHOW TABLES FROM wordpress ");
        echo <<<TITLE
        <h1>Show WordPress All Tables</h1>
        {$massage01}
        <hr width="98%">
        <form method="post" name="form1" action="" >
TITLE;
        for ($i=0;$i<count($tables);$i++){//カウントアップしながら配列を分解
            $tablename[$i]=$tables[$i]->Tables_in_wordpress;
            echo <<<ORITATAMI
            <div onclick="obj=document.getElementById('menu{$i}').style; obj.display=(obj.display=='none')?'block':'none';">
            <h2><input type="radio" name="table_name" value="{$tablename[$i]}">{$tablename[$i]}</h2>
            </div>
            <div id="menu{$i}" style="display:none;clear:both;">
ORITATAMI;
            $colum_search = $wpdb->get_results("SHOW COLUMNS FROM $tablename[$i] ");
            for($c=0;$c<count($colum_search);$c++){
                echo <<<ORITATAMI
                <div>
                <h3>
                &raquo; <input type="checkbox" name="colum_name[]" value="{$colum_search[$c]->Field}">{$colum_search[$c]->Field}</h3></div>
ORITATAMI;
            }
            echo "</div>";
        }
        echo "<input type='submit' value='Set Form'></form>";
    }
}

 

こんな感じです。日本語環境でない場合は英語になります。このプラグインは更にCSV出力機能などを付けてWordPressプラグインとして配布しますので(そのうち)使ってみてくださいね。

このプラグインを使ってみる。(日本語設定でない場合は英語表示)

ダウンロードしたzipファイルをプラグインページからインストールして有効化するとあなたのwordpressのMysqlデータベース一覧が見え、カラムの内容が所得できます。

 

コメントを残す

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