グヌーボード フック(Hook) 使用法とイベント種類完全ガイド
グヌーボード フック(Hook) 使用法とイベント種類完全ガイド
🎯 概要
グヌーボード フックは bbs フォルダを直接修正せずに 途中でコードを挿入できる機能です。extend フォルダに PHP ファイルを作成して、希望するタイミングで関数を実行できます。
基本使用法(すぐに使用可能)
<?php
if (!defined('_GNUBOARD_')) exit; // 個別ページアクセス不可
// イベント登録
add_event('write_update_after', 'my_custom_function', G5_HOOK_DEFAULT_PRIORITY, 4);
// 実行される関数
function my_custom_function($board, $wr_id, $w, $qstr, $redirect_url)
{
global $g5;
// 投稿作成・修正後に実行されるコード
// 例:ログ記録、通知送信など
// ログ例
$log_data = "掲示板: {$board['bo_table']}, 投稿番号: {$wr_id}, 作業: {$w}";
write_log($log_data, 'board_activity');
}
?>
主要イベント例
// 1. 会員ログイン後の処理
add_event('member_login_check', 'after_login_process');
// 2. 投稿作成前の検証
add_event('write_update_before', 'validate_content');
// 3. 管理者設定変更後の処理
add_event('admin_config_form_update', 'config_changed_notify');
📚 詳細説明
グヌーボード フックの動作原理
グヌーボード フックシステムはイベント基盤で動作します。グヌーボード コアで特定のタイミングごとに run_event()
関数を呼び出して、登録されたフック関数を順次実行します。
// グヌーボード コア内部(bbs フォルダ)
run_event('event_name', $params);
この時、extend
フォルダに登録されたフック関数が実行される構造です。
フックファイル作成と登録
ステップ1:ファイル作成
/extend/my_hooks.php (ファイル名は自由)
ステップ2:基本構造作成
<?php
if (!defined('_GNUBOARD_')) exit;
// 優先順位とパラメータ数を指定
add_event('イベント名', '関数名', G5_HOOK_DEFAULT_PRIORITY, パラメータ数);
function 関数名($param1, $param2, ...)
{
// 実行するコード
}
?>
ステップ3:パラメータ活用
function write_update_handler($board, $wr_id, $w, $qstr, $redirect_url)
{
// $board: 掲示板設定配列
// $wr_id: 投稿番号
// $w: 作業区分(write/modify/reply)
// $qstr: クエリストリング
// $redirect_url: リダイレクト URL
if ($w === 'write') {
// 新しい投稿作成時のみ実行
send_notification($board['bo_table'], $wr_id);
}
}
実際の活用事例
事例1:投稿作成時の Slack 通知
<?php
if (!defined('_GNUBOARD_')) exit;
add_event('write_update_after', 'slack_notification', G5_HOOK_DEFAULT_PRIORITY, 5);
function slack_notification($board, $wr_id, $w, $qstr, $redirect_url)
{
if ($w === 'write') {
$write = get_write($board['bo_table'], $wr_id);
$message = "新しい投稿: [{$board['bo_subject']}] {$write['wr_subject']}";
send_slack_message($message);
}
}
function send_slack_message($message)
{
$webhook_url = 'YOUR_SLACK_WEBHOOK_URL';
$data = json_encode(['text' => $message]);
$ch = curl_init($webhook_url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
}
?>
事例2:会員登録時の追加処理
<?php
if (!defined('_GNUBOARD_')) exit;
add_event('register_form_update_after', 'welcome_process', G5_HOOK_DEFAULT_PRIORITY, 2);
function welcome_process($mb_id, $w)
{
if ($w === '') { // 新規登録
// ウェルカムメッセージ送信
send_welcome_message($mb_id);
// デフォルトグループ追加
add_member_to_default_group($mb_id);
// 登録ログ記録
write_log("新規会員登録: {$mb_id}", 'member_register');
}
}
?>
📋 グヌーボード フックイベント全体リスト
共通およびレイアウト
イベント名 | ファイル位置 | パラメータ | 説明 |
---|---|---|---|
common_header |
common.php | - | 共通ヘッダーロード時 |
pre_head |
head.php | - | HTML head 生成前 |
tail_sub |
tail.sub.php | - | フッターテンプレートロード時 |
管理者エリア
イベント名 | ファイル位置 | パラメータ | 説明 |
---|---|---|---|
admin_common |
adm/_common.php | - | 管理者共通ロード時 |
admin_board_form_update |
adm/board_form_update.php | $bo_table, $w | 掲示板設定変更時 |
admin_config_form_update |
adm/config_form_update.php | - | 基本設定変更時 |
admin_member_form_update |
adm/member_form_update.php | $w, $mb_id | 会員情報変更時 |
admin_member_form_add |
adm/member_form.php | $mb, $w, ‘table’ | 会員フォーム追加時 |
掲示板機能
イベント名 | ファイル位置 | パラメータ | 説明 |
---|---|---|---|
bbs_write |
bbs/write.php | $board, $wr_id, $w | 投稿フォームロード時 |
write_update_before |
bbs/write_update.php | $board, $wr_id, $w, $qstr | 投稿保存前 |
write_update_after |
bbs/write_update.php | $board, $wr_id, $w, $qstr, $redirect_url | 投稿保存後 |
bbs_delete |
bbs/delete.php | $write, $board | 投稿削除時 |
bbs_good_before |
bbs/good.php | $bo_table, $wr_id, $good | 推薦前 |
bbs_good_after |
bbs/good.php | $bo_table, $wr_id, $good | 推薦後 |
コメント機能
イベント名 | ファイル位置 | パラメータ | 説明 |
---|---|---|---|
comment_update_after |
bbs/write_comment_update.php | $board, $wr_id, $w, $qstr, $redirect_url, $comment_id, $reply_array | コメント保存後 |
bbs_delete_comment |
bbs/delete_comment.php | $comment_id, $board | コメント削除時 |
会員機能
イベント名 | ファイル位置 | パラメータ | 説明 |
---|---|---|---|
register_form_update_before |
bbs/register_form_update.php | $mb_id, $w | 会員登録処理前 |
register_form_update_after |
bbs/register_form_update.php | $mb_id, $w | 会員登録処理後 |
member_login_check |
bbs/login_check.php | $mb, $link, $is_social_login | ログイン確認時 |
member_logout |
bbs/logout.php | $link | ログアウト時 |
password_is_wrong |
bbs/login_check.php, bbs/password_check.php | ‘login’, $mb または ‘bbs’, $wr, $qstr | パスワード間違い時 |
ファイルおよびダウンロード
イベント名 | ファイル位置 | パラメータ | 説明 |
---|---|---|---|
download_file_header |
bbs/download.php | $file, $file_exist_check | ファイルダウンロード前 |
write_update_file_insert |
bbs/write_update.php | $bo_table, $wr_id, $upload[$i], $w | ファイルアップロード時 |
スキン方式との違い
既存スキン方式
// 掲示板スキン内部
// update_head.skin.php
// 特定スキンでのみ動作
フック方式の利点
- 広範囲適用:管理者ページ(/adm/)まで含む
- 中央集中管理:extend フォルダで統合管理
- スキン独立:スキン変更と無関係に動作
- 優先順位制御:複数フックの実行順序調整可能
実装のコツ
1. エラー処理
function my_hook_function($param1, $param2)
{
try {
// メインロジック
process_data($param1, $param2);
} catch (Exception $e) {
// エラーログ記録
error_log("Hook Error: " . $e->getMessage());
}
}
2. 条件付き実行
function conditional_hook($board, $wr_id, $w)
{
// 特定掲示板でのみ実行
if ($board['bo_table'] !== 'notice') {
return;
}
// 新規作成時のみ実行
if ($w !== 'write') {
return;
}
// 実際の処理ロジック
send_notification($board, $wr_id);
}
3. パフォーマンス最適化
function optimized_hook($params)
{
// 不要な DB クエリ防止
static $cache = [];
$cache_key = md5(serialize($params));
if (isset($cache[$cache_key])) {
return $cache[$cache_key];
}
// 処理ロジック
$result = expensive_operation($params);
$cache[$cache_key] = $result;
return $result;
}
結論
グヌーボード フックシステムは、コアファイル修正なしに希望する機能を追加できる強力なツールです。特に管理者エリアまで包括する広い適用範囲とイベント基盤の明確な実行タイミングが大きな利点です。
フックを効果的に活用すれば、グヌーボードサイトの機能を安全かつ体系的に拡張でき、アップデート時にも機能損失なしに維持できます。
次のステップ:実際のプロジェクトに必要な機能を把握し、適切なイベントを選択してフックを実装してみてください。小さな機能から始めて、徐々に複雑なビジネスロジックを追加していくことをお勧めします。