
1日1プラグイン。そんな今回はWordPressのウィジェット、MySQLデータベースを使って、昔ながらのアクセスカウンターを作りたいと思います。
残念ながら私は毎日業務でプログラムを書いているわけではないので、色々やっているうちに忘れてしまう危険があります・・・!!そんなわけで、プログラム系もぼちぼち記事にしていこうと思います。
バックナンバー
- WordPress プラグイン 簡単作成 Hello Dollyをカスタマイズ
- WordPress 管理画面 プラグイン作成 Twitter APIで投稿
- WordPress ウィジェット プラグイン 作成
- WordPress DBを使ったプラグイン 作成 昔ながらのアクセスカウンターを作る
まずはいつも通りリファレンスを見ましょう。
公式のリファレンスであるCodexを覗きにてくてく遊びに行きます。
@see プラグインでデータベーステーブルを作る
<?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,
)
);
}
これを雛形に作っていきます。
dbDelta( $sql );
テーブル作成時にWordPressの規則にそっているかチェックしてくれる有名な関数です。テーブル作成の際はこの関数を通しましょう。
テーブル作成する場合
$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 );
テーブルにデータを入力する場合
$wpdb->insert(
$table_name,
array(
'time' => current_time( 'mysql' ),
'name' => $welcome_name,
'text' => $welcome_text,
)
プラグインのフック
register_activation_hook( __FILE__, '関数名' ); // プラグイン有効化時 register_deactivation_hook( __FILE__, '関数名' ); //プラグイン停止時
今回はプラグイン有効化時にテーブルを作成するので、上記のフックが必要です。フックの引数で関数を指定すると、フックのタイミングで関数を呼び出すことが出来ます。上記はプラグイン有効時、停止時に動作するフックです。
とりあえず、テーブル作成までの流れを行ってみたいと思います。
# pwd /var/www/html/wp/wp-content/plugins
# mkdir sgaccess
# cd sgaccess
雛形を使ってシンプルにテーブルの作成を行ってみます。
<?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);
}
上記のコードでデータの入れ込みを確認出来ました。このまま進めて問題なさそうですね~。
次はアクセスカウンターを具体的に作っていきますよ!
# 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テーブルがなくなりました。フックが機能していることがわかります。
ウィジェットにショートコードを貼り付けよう


カウンターなのでアクセスするたびに数字が増えていきます。問題なさそう。
WordPressのウィジェットを更に活用

入力します。一部HTMLを使っていますが、なくても構いません。

ウィジェットを利用して、普通の人でもこんな風にお礼を書くことも出来ます。WordPressって素晴らしいですね。更にこのカウンターはマーキーを利用しているので、文字が動きます。WEB2.0以前の世界。懐かしい。
4回の連載を使って、一通りWordPressプラグインの概要は網羅したかとは思うのですが、いかがでしょうか。PHP以外のWordPress特有の仕様はCodexに聞けば良いのです!悩む必要はありません。丁寧に書いてあります。
それに、ちょっとした機能のプラグインに必要なコードは多くありません。最初はミニマムに作って、慣れてきたら大きな機能のプラグインを作れば良いのです。WordPressのプラグインってもしかして作れるかも?と感じて頂けたら嬉しい。
お疲れ様です。
