DB テーブルの作成/更新
register_activation_hook でプラグインの有効化時に DB テーブルの作成/更新を行います。
また、プラグインのアップグレードで DB テーブルの構造が変わることもあると思います。現状ではプラグインのアップグレード時に呼ばれるフックはないので、plugins_loaded アクションのフックでもチェックするようにします。
テーブルの作成/更新には dbDelta() が便利です。テーブルを作るだけでなく、すでにテーブルがある場合には ALTER TABLE を発行してくれます。ただ dbDelta() が受け付ける SQL には、一行あたり一カラム宣言、PRIMARY KEY のあとにスペースを二つ空けるなどの制限があるので注意しましょう。
参考
http://codex.wordpress.org/Creating_Tables_with_Plugins
URL を持つ
template_redirect アクションをフックすることで、特定の URL に対する処理を記述することができます。
ひな形
上記をまとめると、だいたい以下のような感じです。
<?php
/*
Plugin Name: Foo
Description: Foo plugin
Version: 1.0
Author: Foo Bar
*/
global $foo_db_version;
$foo_db_version = '1.0';
// Create/update db table for foo count
function foo_install() {
global $foo_db_version;
global $wpdb;
$installed_ver = get_option("foo_db_version");
if ($installed_ver != $foo_db_version) {
$table_name = $wpdb->prefix . 'foo';
$sql = "CREATE TABLE $table_name (
id bigint(20) NOT NULL,
...
PRIMARY KEY (id)
);";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
add_option("foo_db_version", $foo_db_version);
}
}
// Create DB table when activated
register_activation_hook(__FILE__, 'foo_install');
// Check DB version in preparation to upgrades when load
add_action('plugins_loaded', 'foo_install');
// Request handler
function foo_redirect() {
// Handle only a certain URL
if (stripos($_SERVER['REQUEST_URI'], '/foo') === FALSE) {
return;
}
// Do something and make response
status_header(200);
echo 'Hello, World!';
exit(); // Make sure to exit
}
add_action('template_redirect', 'foo_redirect', 1);
?>