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

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

第二回ではテーブルを指定してカラムを読み込むショートコードを解説しましたが、第一回でプラグインに実装したテーブルを全て読み込むコードにカラムを読み込む実装をしようかと思います。

【まず実装コード】

<?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(){
        global $wpdb;//インスタンスを呼んでログイン
        $this->tables=$wpdb->get_results("SHOW TABLES FROM wordpress ");//テーブルを呼び出して$thisの中に格納しとく
        add_action('admin_menu', array($this, 'add_admin'));//管理者メニューに追加する準備
    }
    //メニューを追加する関数
    function add_admin(){
        //level_8から10が管理者
        add_menu_page('DB一覧表示','DB一覧表示','level_9', __FILE__, array($this,'show_DB'));
    }
    //DBを表示する関数
    function show_DB(){
        $tables=$this->tables;//$thisからテーブルを取り出しておく
        global $wpdb;//インスタンスを呼んで再びログイン
        echo <<<TITLE
        <h1>Show WordPress All Table<h1>
        <hr width="98%">
        <ol>
TITLE;
        for ($i=0;$i<count($tables);$i++){//カウントアップしながら配列を分解
            $tablename=$tables[$i]->Tables_in_wordpress;
            echo <<<ORITATAMI
            <div onclick="obj=document.getElementById('menu{$i}').style; obj.display=(obj.display=='none')?'block':'none';">
            <h5><li type="1"><a style="cursor:pointer;">{$tablename}</a></li></h5>
            </div>
            <div id="menu{$i}" style="display:none;clear:both;">
            <ol>
ORITATAMI;
            $colum_search = $wpdb->get_results("SHOW COLUMNS FROM $tablename ");
            for($c=0;$c<count($colum_search);$c++){
                echo "<div><h6><li type='circle'>".$colum_search[$c]->Field."</li></h6></div>";
            }
            echo "</ol></div>";
        }
        echo "</ol>";
    }
}

↑という感じで実装しました。

↑こんな感じに見えます。テーブルの中身(カラム)は折りたたんでいるのでテーブル名をクリックするとカラム一覧が表示されます。

【解説】

そのまま表示すると膨大な行数になっちゃうのでテーブル名に折りたたみました。なのでテーブル名をクリックするとそのテーブルのカラム一覧が表示されます。また、コンストラクタでインスタンスを呼ばなくても関数の中でどうせ呼ぶんだからいいかと思いますがここでは修正しませんでした。( ̄∀ ̄)

    for ($i=0;$i<count($tables);$i++){//カウントアップしながら配列を分解
        $tablename=$tables[$i]->Tables_in_wordpress;
        echo <<<ORITATAMI
        <div onclick="obj=document.getElementById('menu{$i}').style; obj.display=(obj.display=='none')?'block':'none';">
        <h5><li type="1"><a style="cursor:pointer;">{$tablename}</a></li></h5>
        </div>
        <div id="menu{$i}" style="display:none;clear:both;">
        <ol>
ORITATAMI;
        $colum_search = $wpdb->get_results("SHOW COLUMNS FROM $tablename ");//テーブルのloop中にカラムのオブジェクトを受け取る
            for($c=0;$c<count($colum_search);$c++){//テーブルのカラムの分ループして書き出す
                echo "<div><h6><li type='circle'>".$colum_search[$c]->Field."</li></h6></div>";
            }
            echo "</ol></div>";
    }
    echo "</ol>";
}

↑折りたたみ部位。CSSの折りたたみを使っています。

まず、テーブル名をループしながら分解して書き出しています。またその際にカラムのオブジェクトも受け取って分解して書き出しています。

すごい簡単でしたね。これでテーブル一覧とそのカラム一覧が受け取れました。あとは応用するといろんな事ができます。まあ、プラグインでphpMyAdminみたいなこともできますね。(工数かかるけど…)

当然ですがカラム名をクリックすると値が見れるという実装も出来ますよ。またそれをCSVに書き出すってのも出来ます。(//∇//)

取りあえずこのプラグインをインストールして動作を見てみる

リンクをクリックするとこのプラグインをダウンロードできます。ダウンロードしたら[プラグイン]>[新規追加]>[プラグインのアップロード]>showDB.zipを選択>[今すぐインストール]でインストールできますのでインストールしたら[有効にする]にしてください。

左メニューにDB一覧表示があるはずです。動かしてみましょう。

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

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

第一回目ではテーブル一覧を得る方法を解説し、プラグイン化しましたが、今度はその見つけたテーブルからカラム一覧を得る方法を解説します。

まず、簡単なショートコードで解説します。

function colum($tablename){
    global $wpdb;
    $clum_search = $wpdb->get_results("SHOW COLUMNS FROM $tablename ");
    for($i=0;$i<count($clum_search);$i++){
        //var_dump( $clum_search[$i])."<br>";
        echo $clum_search[$i]->Field."<br>";
    }
}
add_shortcode('COLUM','colum');

↑これで引数が渡されたテーブルのカラムを全て読みます。カラム名はFieldに格納されていて他は以下になります。

->Type//カラムのタイプです:varcharとか
->Key//キーの設定です:プライマリキーとか

他にもNullとかDefaultとかExtraがありますが使わないと思います。

以下はwp_postsのカラムを所得した例です。

↑こんな感じ

簡単に解説すると「SHOW COLUMNS FROM $tablename 」がSql命令文です。$tablename のカラムを見せなさいって感じですか。

で、カラム情報が$clum_searchに入ります。

ってことでさっきのテーブル一覧表示プラグインに実装してみます。・・・つづく

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

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

WordPressの管理画面にrootでログインして「プラグイン」>「インストール済みプラグイン」で表示されているプラグインを「showDB.php」として作成します。

【解説】

プラグインはインストール済みプラグインに表示される概要説明を作る場所と一回だけ実行されるコンストラクタという場所と実行される関数部で構成されます。今回試作するプラグインはwordpressのDBを全て読み込んで表示するだけのプラグインです。

プラグインは

/wordpress/wp-content/plugins

にディレクトリを作ってshowDB.phpを入れると表示されます。

↑こんな感じ

【プラグイン全体のコード】

<?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(){
        global $wpdb;//インスタンスを呼んでログイン
        $this->tables=$wpdb->get_results("SHOW TABLES FROM wordpress");//テーブルを呼び出して$thisの中に格納しとく
        add_action('admin_menu', array($this, 'add_admin'));//管理者メニューに追加する準備
    }
    //メニューを追加する関数
    function add_admin(){
        //level_8から10が管理者
        add_menu_page('DB一覧表示','DB一覧表示','level_9', __FILE__, array($this,'show_DB'));
    }
    //DBを表示する関数
    function show_DB(){
        $tables=$this->tables;//$thisからテーブルを取り出しておく
        echo <<<TABLE
        <h1>Show WordPress All Table<h1>
        <hr width="98%">
        <table width="98%" cellpadding="10" cellspacing="4" border="0" bgcolor="#888888">
TABLE;
        for ($i=0;$i<count($tables);$i++){//カウントアップしながら配列を分解
            echo <<<TABLE
            <tr><td bgcolor="#ffffff">{$i}</td><td bgcolor="#ffffff">{$tables[$i]->Tables_in_wordpress}</td></tr>
TABLE;
        }
        echo <<<TABLE
        </table>
TABLE;
    }
}

【各部解説】

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

↑がインストール済みプラグインで表示される場所

//クラスを作る
class showtables{
    //コンストラクタ
    function __construct(){
        global $wpdb;//インスタンスを呼んでログイン
        $this->tables=$wpdb->get_results("SHOW TABLES FROM wordpress");//テーブルを呼び出して$thisの中に格納しとく
        add_action('admin_menu', array($this, 'add_admin'));//管理者メニューに追加する準備
}

↑がコンストラクタ

    //メニューを追加する関数
    function add_admin(){
        //level_8から10が管理者
        add_menu_page('DB一覧表示','DB一覧表示','level_9', __FILE__, array($this,'show_DB'));
    }

↑が管理者メニューに追加している

    //DBを表示する関数
    function show_DB(){
        $tables=$this->tables;//$thisからテーブルを取り出しておく
        echo <<<TABLE
        <h1>Show WordPress All Table<h1>
        <hr width="98%">
        <table width="98%" cellpadding="10" cellspacing="4" border="0" bgcolor="#888888">
TABLE;
        for ($i=0;$i<count($tables);$i++){//カウントアップしながら配列を分解
            echo <<<TABLE
            <tr><td bgcolor="#ffffff">{$i}</td><td bgcolor="#ffffff">{$tables[$i]->Tables_in_wordpress}</td></tr>
TABLE;
        }
        echo <<<TABLE
        </table>
TABLE;
    }
}

↑が実際に表示する関数。$thisからtablesオブジェクトを取り出して配列に格納。配列分だけloopしてカウントアップしている。->Tables_in_wordpressはvar_dump()で配列の中身をみたらテーブル名はTables_in_wordpressに格納されていたから。

↑こんな感じで一覧で所得できるんで応用すればいろいろ出来ます。

WordPressショートコードを作ってみる:第二回

【第二回】WordPressの機能を追加するものにショートコードがありますが今回はこのショートコードの作り方を解説します。

【まとめ】

WordPressの記事はwp_postsにあり、

post_typeがpostまたはrevisionのものが対象である。

wp_postsを読むにはMySqlへログインする必要があるが、

global $wpdb;
//だけでログインできてしまうという超簡単仕様。

以上を踏まえてショートコードを書いてみます。

//関数名はpostCountで引数も渡せますので渡せるようにします。
//[POSTCOUNT posts post_content post revision]
//という感じで引数がない場合も作っておきます
function postCount($target){//引数はarrayで受け取る
    if(count($target)==4){//引数が4送られたら
        $table_name= $target[0];
        $count_row = $target[1];
        $target1   = $target[2];
        $target2   = $target[3];
    }else{//4以外ならデフォルト
        $table_name= "posts";
        $count_row = "post_content";
        $target1   = "post";
        $target2   = "revision";
    }
    //DBに接続;インスタンスを呼ぶ
    global $wpdb;
    //tableをSELECT
    $countrow=$wpdb->get_results( "SELECT $count_row FROM $table_name WHERE post_type='$target1' OR post_type='$target2' ",OBJECT);
    //$countrowをカウントしていくつあるか
    return "現在、記事は".count($countrow)."件あります。";
}
add_shortcode('POSTCOUNT','postCount');
//ページに書くコード[POSTCOUT]呼ぶfunctionはpostCount

という感じで追記してみると記事数が得られます。

ヒント!)SELECT $count_row FROM $table_name WHERE post_type=’$target1′ OR post_type=’$target2’はsql命令文です。post_type=’$target1’の変数を”で囲っているのは’’内がstringであるからです。

新しい投稿ページに以下を書き込みます。

[POSTCOUNT wp_posts post_content post revision]

すると以下のように表示されます。

現在、記事は358件あります。

WordPressショートコードを作ってみる:第一回

【第一回】WordPressの機能を追加するものにショートコードがありますが今回はこのショートコードの作り方を解説します。

WordPressの管理画面にrootでログインして「外観」>「テーマの編集」>「テーマのための関数」をセレクトします。

この<?からはじまるページがWordPressで使えるカスタム関数(ショートコードなど)を書き込めるシートになります。

今回はこのシートの最後尾に記事数をカウントするショートコードを追加する手順を解説します。

【手順】

①WordPressの記事はどこに格納されているか調べる

WordPressの記事はMySqlデータベースのwp_postsに格納されています。
またこのDBのレコードのpost_typeがpostまたはrevisionのものが記事で
メディアはattachmentになるようです。

なのでwp_postsをオブジェクトとして読み込んで、
post_typeがpostまたはrevisionのものをカウントすれば記事の数が解ります。

②WordPressのMySqlデータベースにアクセスする方法を知る

WordPressでMySqlにログインするのは簡単です。

global $wpdb;

これだけでMySqlにログインできてしまいます。

関数リファレンス/wpdb Class

が、WordPressから見えるのは

/wordpress/wp-includes/wp-db.php

に記載されている

var $tables = array( 'posts', 'comments', 'links', 'options', 'postmeta',
'terms', 'term_taxonomy', 'term_relationships', 'termmeta', 'commentmeta');

だけです。

と、ここまで解ったらあとはコードを書くだけです。