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() で自作フックを追加すれば、他のプラグインからも拡張できる柔軟な設計になります。

お気軽にご相談ください

お見積りへ お問い合わせへ