1日1プラグイン。そんな今回はWordPressのウィジェット、MySQLデータベースを使って、昔ながらのアクセスカウンターを作りたいと思います。
残念ながら私は毎日業務でプログラムを書いているわけではないので、色々やっているうちに忘れてしまう危険があります・・・!!そんなわけで、プログラム系もぼちぼち記事にしていこうと思います。
バックナンバー
- WordPress プラグイン 簡単作成 Hello Dollyをカスタマイズ
- WordPress 管理画面 プラグイン作成 Twitter APIで投稿
- WordPress ウィジェット プラグイン 作成
- WordPress DBを使ったプラグイン 作成 昔ながらのアクセスカウンターを作る
まずはいつも通りリファレンスを見ましょう。
公式のリファレンスであるCodexを覗きにてくてく遊びに行きます。
@see プラグインでデータベーステーブルを作る
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<?php global $jal_db_version; $jal_db_version = '1.0'; function jal_install() { global $wpdb; global $jal_db_version; $table_name = $wpdb->prefix . 'liveshoutbox'; $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, name tinytext NOT NULL, text text NOT NULL, url varchar(55) DEFAULT '' NOT NULL, UNIQUE KEY id (id) ) $charset_collate;"; require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); dbDelta( $sql ); add_option( 'jal_db_version', $jal_db_version ); } function jal_install_data() { global $wpdb; $welcome_name = 'Wordpress さん'; $welcome_text = 'おめでとうございます、インストールに成功しました!'; $table_name = $wpdb->prefix . 'liveshoutbox'; $wpdb->insert( $table_name, array( 'time' => current_time( 'mysql' ), 'name' => $welcome_name, 'text' => $welcome_text, ) ); } |
これを雛形に作っていきます。
1 |
dbDelta( $sql ); |
テーブル作成時にWordPressの規則にそっているかチェックしてくれる有名な関数です。テーブル作成の際はこの関数を通しましょう。
テーブル作成する場合
1 2 3 4 5 6 7 8 9 10 11 |
$sql = "CREATE TABLE $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, name tinytext NOT NULL, text text NOT NULL, url varchar(55) DEFAULT '' NOT NULL, UNIQUE KEY id (id) ) $charset_collate;"; require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); dbDelta( $sql ); |
テーブルにデータを入力する場合
1 2 3 4 5 6 7 |
$wpdb->insert( $table_name, array( 'time' => current_time( 'mysql' ), 'name' => $welcome_name, 'text' => $welcome_text, ) |
プラグインのフック
1 2 |
register_activation_hook( __FILE__, '関数名' ); // プラグイン有効化時 register_deactivation_hook( __FILE__, '関数名' ); //プラグイン停止時 |
とりあえず、テーブル作成までの流れを行ってみたいと思います。
1 2 |
# pwd /var/www/html/wp/wp-content/plugins |
1 |
# mkdir sgaccess |
1 |
# cd sgaccess |
雛形を使ってシンプルにテーブルの作成を行ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
<?php /** * @package SgAccess * @version 0.1.1 */ /* Plugin Name: SgAccess Plugin URI: http://example.com/plugins/sgaccess/ Description: Plugin development tutorial for making plugin by using widget Author: Kanehiro Yuu Version: 0.1.1 Author URI: https://sys-guard.com/ */ global $sg_access_version; $sg_access_version = '1.0'; register_activation_hook( __FILE__, 'jal_install' ); register_activation_hook( __FILE__, 'jal_install_data' ); register_uninstall_hook ( __FILE__, 'jal_delete_data' ); add_action( 'plugins_loaded', 'myplugin_update_db_check' ); function jal_install() { global $wpdb; global $sg_access_version; $table_name = $wpdb->prefix . 'sgaccess'; $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, name tinytext NOT NULL, text text NOT NULL, url varchar(55) DEFAULT '' NOT NULL, UNIQUE KEY id (id) ) $charset_collate;"; require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); dbDelta( $sql ); add_option( 'jal_db_version', $jal_db_version ); } function jal_install_data() { global $wpdb; $welcome_name = 'Wordpress さん'; $welcome_text = 'おめでとうございます、インストールに成功しました!'; $table_name = $wpdb->prefix . 'sgaccess'; $wpdb->insert( $table_name, array( 'time' => current_time( 'mysql' ), 'name' => $welcome_name, 'text' => $welcome_text, ) ); } function myplugin_update_db_check() { global $sg_access_version; if ( get_site_option( 'sg_access_version' ) != $sg_access_version ) { jal_install(); } } function jal_delete_data() { global $wpdb; $table_name = $wpdb->prefix . 'sgaccess'; delete_option('sg_access_version'); $sql = "DROP TABLE IF EXISTS {$table_name}"; $wpdb->query($sql); } |
上記のコードでデータの入れ込みを確認出来ました。このまま進めて問題なさそうですね~。
次はアクセスカウンターを具体的に作っていきますよ!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# vi ./sgaccess/sgaccess.php <?php /** * @package Access * @version 0.1.1 */ /* Plugin Name: SgAccess Plugin URI: http://example.com/plugins/sgaccess/ Description: Plugin development tutorial for making plugin with MySQL Author: Kanehiro Yuu Version: 0.1.1 Author URI: https://sys-guard.com/ */ //実行するよ! $sgAccessObj = new Sg_Access(); class Sg_Access { public function __construct() { global $sgaccess_version; $sgaccess_version = '1.0'; //初期化 $this->admin_init(); } public function admin_init() { register_activation_hook( __FILE__, array($this, 'sgaccess_install') ); // プラグイン有効化時にDB作成 register_activation_hook( __FILE__, array($this,'sgaccess_install_data') ); //プラグイン有効化時にDB初期化 register_deactivation_hook( __FILE__, array($this,'sgaccess_delete_data') ); //プラグイン停止時に実行する関数を登録 add_action( 'plugins_loaded', array($this, 'myplugin_update_db_check') );//プラグイン更新時のDB更新チェック add_shortcode( "SG-COUNTER", array($this, 'counter_start') );//カウンター作動 add_filter('widget_text', 'do_shortcode');//ウィジェットでショートコードが使用できるようにする。 } // カウンター機能作動 ============================================================= // ショートコードタグへのアクセス毎にこの関数が実行される。 public function counter_start() { $this->access_count(); $this->access_show(); } public function access_count() { global $wpdb; $table_name = $wpdb->prefix . 'sgaccess'; $sql = "UPDATE {$table_name} SET count = count + 1 WHERE id = 1;"; $wpdb->query($sql); } public function access_show() { global $wpdb; $table_name = $wpdb->prefix . 'sgaccess'; $sql = "SELECT id, count FROM {$table_name} WHERE id = 1;"; $results = $wpdb->get_results($sql); foreach($results as $row){ if($row->id == 1){ echo "<h2>あなたは<strong>{$row->count}番目のゲストです。</strong></h2>"; echo "<MARQUEE>訪問者はゲストブックに書き込みして下さい。</MARQUEE>"; } } } // カウンター機能 ここまで ===================================================== //DBの作成 ※プラグイン有効時 function sgaccess_install() { global $wpdb; $table_name = $wpdb->prefix . 'sgaccess'; $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, count int UNSIGNED NOT NULL, UNIQUE KEY id (id) ) {$charset_collate}, ENGINE=InnoDB;"; require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); dbDelta( $sql ); add_option( 'sgaccess_version', $sgaccess_version ); } //DBの初期化 ※プラグイン有効時 function sgaccess_install_data() { global $wpdb; $table_name = $wpdb->prefix . 'sgaccess'; $count_init = 0; $wpdb->insert( $table_name, array( 'time' => current_time( 'mysql' ), 'count' => $count_init, ) ); } //DB更新チェック ※プラグイン更新 function myplugin_update_db_check() { if ( get_site_option( 'sgaccess_version' ) != $sgaccess_version ) { $this->sgaccess_install(); } } //DBの削除 ※プラグイン停止時 function sgaccess_delete_data() { global $wpdb; $table_name = $wpdb->prefix . 'sgaccess'; delete_option('sgaccess_version'); $sql = "DROP TABLE {$table_name};"; $wpdb->query($sql); } }//Sg_Access |
テーブルのフックが機能しているか確認します
【有効化】を行います。
テーブルが作成されていて、1レコードもあります。
【停止】をクリックしてみます。
wp_sgaccessテーブルがなくなりました。フックが機能していることがわかります。
ウィジェットにショートコードを貼り付けよう
[SG-COUNTER]とショートコードを記述すると、カウンターが作動します。
カウンターなのでアクセスするたびに数字が増えていきます。問題なさそう。
WordPressのウィジェットを更に活用
入力します。一部HTMLを使っていますが、なくても構いません。
ウィジェットを利用して、普通の人でもこんな風にお礼を書くことも出来ます。WordPressって素晴らしいですね。更にこのカウンターはマーキーを利用しているので、文字が動きます。WEB2.0以前の世界。懐かしい。
4回の連載を使って、一通りWordPressプラグインの概要は網羅したかとは思うのですが、いかがでしょうか。PHP以外のWordPress特有の仕様はCodexに聞けば良いのです!悩む必要はありません。丁寧に書いてあります。
それに、ちょっとした機能のプラグインに必要なコードは多くありません。最初はミニマムに作って、慣れてきたら大きな機能のプラグインを作れば良いのです。WordPressのプラグインってもしかして作れるかも?と感じて頂けたら嬉しい。
お疲れ様です。