2026年5月20日
2026年5月20日
WordPressプラグイン開発の基礎(フックとフィルター)
はじめに
WordPressプラグイン開発の核心は「フック」システムです。add_action() でWordPressの処理に割り込み、add_filter() でデータを変換します。この仕組みを理解すれば、コアを改変せずに機能拡張できます。
症状・原因
- WordPressのプラグインを初めて自作したい
- add_actionとadd_filterの違いが分からない
- 独自のフック(カスタムフック)を作りたい
- フックの優先度・引数の数の設定方法を知りたい
解決手順
ステップ1:最小限のプラグインを作成する
<?php
/**
* Plugin Name: My First Plugin
* Plugin URI: https://example.com
* Description: WordPressプラグイン開発のサンプル
* Version: 1.0.0
* Author: Your Name
* License: GPL-2.0-or-later
* Text Domain: my-first-plugin
*/
// 直接アクセスを禁止
if (!defined('ABSPATH')) {
exit;
}
ファイルの保存場所: wp-content/plugins/my-first-plugin/my-first-plugin.php
ステップ2:add_actionでアクションフックを使う
// アクションフック: WordPressの処理タイミングに割り込む
// add_action(フック名, コールバック, 優先度=10, 引数の数=1)
// 例1: フッターにHTMLを追加
add_action('wp_footer', function(): void {
echo '<p class="my-notice">カスタムフッターテキスト</p>';
});
// 例2: 投稿保存時に処理を実行(引数2つ)
add_action('save_post', function(int $post_id, \WP_Post $post): void {
if ($post->post_type !== 'post' || wp_is_post_autosave($post_id)) {
return;
}
// カスタム処理: メタデータを更新
update_post_meta($post_id, '_last_modified_by', get_current_user_id());
}, 10, 2); // 優先度10、引数2つ
// 例3: 初期化時にカスタム投稿タイプを登録
add_action('init', function(): void {
register_post_type('product', [
'label' => '商品',
'public' => true,
]);
});
ステップ3:add_filterでフィルターフックを使う
// フィルターフック: データを受け取り、変換して返す
// add_filter(フック名, コールバック, 優先度=10, 引数の数=1)
// 例1: 投稿タイトルに接頭辞を追加
add_filter('the_title', function(string $title): string {
if (!is_single()) {
return $title;
}
return '【公式】' . $title;
});
// 例2: 抜粋の長さを変更(引数1つ)
add_filter('excerpt_length', function(int $length): int {
return 80; // デフォルト55字 → 80字に変更
});
// 例3: メールの送信者名を変更(引数1つ)
add_filter('wp_mail_from_name', function(string $name): string {
return 'WordPress博士サポート';
});
// 例4: WooCommerceの価格表示を変更(引数4つ)
add_filter('woocommerce_price_format', function(
string $format,
string $currency_pos
): string {
return '%1$s%2$s(税込)';
}, 10, 2);
ステップ4:カスタムフックを作成する
// 自作プラグインにカスタムフックを追加
function mfp_process_data(array $data): array {
// do_action: アクションフックを発火(他のプラグインが割り込める)
do_action('mfp_before_process', $data);
// apply_filters: フィルターフックを発火(データを変換可能に)
$data = apply_filters('mfp_data', $data);
// 処理実行
foreach ($data as $key => $value) {
$data[$key] = sanitize_text_field($value);
}
do_action('mfp_after_process', $data);
return $data;
}
// 他のプラグインやテーマからカスタムフックに接続
add_filter('mfp_data', function(array $data): array {
$data['source'] = 'custom';
return $data;
});
ステップ5:フックの優先度と引数を理解する
// 優先度: 数値が小さいほど先に実行(デフォルト: 10)
add_action('wp_head', 'my_early_function', 1); // 最初に実行
add_action('wp_head', 'my_normal_function', 10); // 通常
add_action('wp_head', 'my_late_function', 99); // 最後に実行
// フックを削除する
remove_action('wp_head', 'wp_generator'); // WordPressバージョンを非表示
// 優先度を指定して削除(add_action と同じ優先度が必要)
remove_filter('the_content', 'wpautop'); // 自動pタグを無効化
// フックが登録されているか確認
if (has_action('wp_footer', 'my_function')) {
// my_function が wp_footer に登録済み
}
// 現在のフック名を取得
add_action('init', function(): void {
$hook = current_action(); // 'init'
});
ステップ6:WP-CLIでフックを確認する
# プラグインの有効化・無効化
wp plugin activate my-first-plugin
wp plugin deactivate my-first-plugin
# フックの実行状況をQuery Monitorで確認
# → 管理バー → Query Monitor → フック & アクション
# プラグインのエラーをデバッグ
wp --debug plugin activate my-first-plugin 2>&1 | head -50
注意事項
add_filterのコールバックは必ず値をreturnしてください。忘れるとnullが返り、コンテンツが消えますremove_action/remove_filterは同じ優先度でないと機能しません- グローバル変数への依存を避け、依存性注入(DI)やシングルトンパターンを使ってください
まとめ
WordPressプラグインは add_action() でタイミングに割り込み、add_filter() でデータを変換します。do_action() と apply_filters() で自作フックを追加すれば、他のプラグインからも拡張できる柔軟な設計になります。