WordPressプラグインの基本構造と作成方法

読了時間4分
2026-03-12
2026-06-03
2,764
以下のリンクからお買い物をしていただくと、コミッションを差し上げます。.

WordPressプラグインの基本構造と作成方法

WordPressプラグインの開発は、シンプルなPHPファイルから始まります。このメインファイルには、WordPressがプラグインとして認識できるようにするための特定のヘッダーコメントを含める必要があります。最も基本的なプラグインは、たった1つのファイルで構成されることもあります。 my-first-plugin.php

<?php
/**
 * Plugin Name: 我的第一个插件
 * Plugin URI:  https://example.com/my-first-plugin
 * Description: 这是一个用于演示的简单WordPress插件。
 * Version:     1.0.0
 * Author:      开发者姓名
 * License:     GPL v2 or later
 * Text Domain: my-first-plugin
 */

ファイルヘッダのコメント内に「Plugin Name」を記述することは必須ですが、その他の情報はオプションです。プラグインが有効になると、適切なタイミングでPHP関数を実行することによってその機能が実現されます。最も一般的な方法の一つが「アクションフック」の使用です。例えば、ウェブページのフッターにテキストを追加したい場合には、アクションフックを利用することができます。 wp_footer フック。

// 在页脚输出自定义内容
function myplugin_add_footer_text() {
    echo '<p style="text-align:center;">私のプラグインをご利用いただき、ありがとうございます!</p>';
}
add_action( 'wp_footer', 'myplugin_add_footer_text' );

add_action これはWordPressのコア関数で、カスタム関数を指定されたアクションフックにマウントするために使用されます。プラグインのディレクトリは通常、以下の場所に配置することが推奨されます: /wp-content/plugins/your-plugin-name/ 下にあるファイルには、メインファイルの他に、CSS、JavaScript、画像などのリソースファイルも含めることができます。

推薦図書 WordPressテーマの究極のガイド:選択、カスタマイズ、開発までの完全なソリューション

如何为插件添加管理菜单

プラグインにWordPressの管理画面で設定を行うためのページを提供するには、管理メニューを追加する必要があります。これは通常、以下の手順で行われます: admin_menu アクションフックを使用して実現します。

UltaHostのWordPressホスティングサービス
30日間の返金保証、無制限の帯域幅とデータベースサービス、無料のDDoS防御機能が付きます。3年契約をすると、501TPから4Tまでのプランで割引が適用されます。

Core Functions add_menu_page バックエンドのサイドバーにトップレベルのメニューアイテムとそれに対応する設定ページを追加するためのものです。

function myplugin_add_admin_menu() {
    add_menu_page(
        '我的插件设置',      // 页面标题
        '我的插件',          // 菜单标题
        'manage_options',    // 所需权限
        'myplugin-settings', // 菜单slug
        'myplugin_settings_page', // 显示页面的回调函数
        'dashicons-admin-generic', // 图标(可选)
        6                    // 菜单位置(可选)
    );
}
add_action( 'admin_menu', 'myplugin_add_admin_menu' );

// 设置页面的HTML内容
function myplugin_settings_page() {
    ?&gt;
    <div class="wrap">
        <h1></h1>
        <form action="/ja/options.php/" method="post" data-trp-original-action="options.php">
            <?php
            settings_fields( 'myplugin_options' ); // 输出安全字段
            do_settings_sections( 'myplugin-settings' ); // 输出设置区域
            submit_button(); // 输出提交按钮
            ?>
        <input type="hidden" name="trp-form-language" value="ja"/></form>
    </div>
    あなたのアカウントは有効です。あなたはログインしています。

メニューを作成した後、次のステップはWordPressの設定APIを使用して、具体的な設定可能なオプションを定義することです。

プラグインの設定を保存するには、設定APIを利用します。

フォームの送信処理やセキュリティチェックを手動で行うのは面倒で、エラーが発生しやすいです。WordPressの設定APIは、設定情報の登録、表示、保存を行うための標準化された方法を提供しています。これには主に3つの関数が関与しています:register_setting, add_settings_sectionadd_settings_field

以下の例では、オプショングループを登録し、テキストフィールドを追加する方法を示しています。

推薦図書 ワードプレスのウェブサイトのパフォーマンス最適化ガイド:深い分析と実践的な戦略

function myplugin_settings_init() {
    // 注册一个新的设置项到数据库 `wp_options` 表中
    register_setting( 'myplugin_options', 'myplugin_settings' );

    // 在设置页面添加一个新的区域
    add_settings_section(
        'myplugin_section_basic', // 区域ID
        '基础设置',                // 区域标题
        'myplugin_section_callback', // 区域说明的回调函数
        'myplugin-settings'       // 对应的页面slug
    );

    // 在区域中添加一个字段
    add_settings_field(
        'myplugin_field_text',    // 字段ID
        '示例文本',                // 字段标题
        'myplugin_field_text_cb', // 字段HTML输出的回调函数
        'myplugin-settings',      // 页面slug
        'myplugin_section_basic'  // 区域ID
    );
}
add_action( 'admin_init', 'myplugin_settings_init' );

// 区域说明的回调函数
function myplugin_section_callback() {
    echo '<p>こちらはプラグインの基本設定エリアです。</p>';
}

// 文本字段的回调函数
function myplugin_field_text_cb() {
    // 从数据库中获取之前保存的设置值
    $options = get_option( 'myplugin_settings' );
    $value = $options['myplugin_field_text'] ?? ''; // 使用空合并运算符提供默认值
    // 输出HTML输入框
    echo '<input type="text" name="myplugin_settings[myplugin_field_text]" value="' . esc_attr( $value ) . '" class="regular-text">';
    echo '<p class="description">いくつかの例文を入力してください。</p>';
}

この方法で保存された設定値は、プラグインのコード内のどの部分でも使用することができます。 get_option('myplugin_settings') 安全に取得し、使用すること。

プラグイン開発におけるセキュリティとベストプラクティス

セキュリティはプラグイン開発において最も重要な要素です。セキュリティに欠けるプラグインは、ウェブサイト全体の脆弱性の原因となる可能性があります。最も基本的な原則は、「ユーザーの入力を絶対に信頼してはならない」ということです。ユーザーや外部からのすべてのデータは、データベースやファイルシステムに保存されたり、ページに表示されたりする前に、必ず検証、クリーニング、またはエスケープ処理を行う必要があります。

データ検証とクリーニング

検証とは、入力されたデータが期待される形式に合致しているかを確認するプロセスのことです。例えば、メールアドレスであるか、数字であるか、または特定の範囲内にあるかなどです。WordPressでは、メールアドレスの検証や数字の範囲チェックなどに役立つ一連の補助関数が用意されています。 is_email(), absint()「クリーニング」とは、検証の結果に基づき、データ内の不正な文字や安全でない文字をすべて削除する処理です。テキストフィールドの場合には、以下のような方法を使用することができます: sanitize_text_field()

hosting.com 共有ホスティング
AMD EPYC CPU、NVMe SSDストレージ、LiteSpeedによる高いパフォーマンス、24時間365日の専門家による社内サポート、SSL、ブルートフォース、マルウェア、DDoS保護などの高度なセキュリティ対策、最大73%のコスト削減
// 在处理表单提交时
$user_input = $_POST['some_field'] ?? ''; // 使用空合并运算符避免未定义索引警告
// 清理输入
$clean_input = sanitize_text_field( $user_input );
// 验证是否是正整数
$clean_id = absint( $_POST['post_id'] );
if ( $clean_id <= 0 ) {
    // 处理无效ID的错误
}

出力前のデータのエスケープ処理

エスケープとは、データを異なる環境(HTML、JavaScript、URLなど)に安全に出力するための処理です。これは、クロスサイトスクリプティング(XSS)攻撃を防ぐために非常に重要です。WordPressには強力なエスケープ関数が用意されています:
* esc_html()「:」はHTMLコンテンツをエスケープするために使用され、その中に含まれるHTMLタグが解析されるのを防ぎます。
* esc_attr()`:`は、HTMLタグの値をエスケープするために使用されます。
* esc_url()`: URLをエスケープするために使用されます。
* wp_kses_post()定義されたルールセットに基づいて、一部のHTMLコードを安全に出力することが許可されています。

// 在设置页面或前端输出用户数据时
echo '<div class="notice">'`. esc_html($clean_input)`.'</div>'; echo '
エコー '<input type="hidden" value="' . esc_attr( $clean_input ) . '">'; echo '
エコー '<a href="/ja/' . esc_url( $user_url ) . '/">リンク</a>';
echo wp_kses_post( $allowed_html_content ); // 允许文章级别的HTML标签

また、データベースクエリを処理する際には、常にWordPressのデータベースクラスを使用するべきです。 $wpdb の前処理方法、またはより高度なAPI(例:)を使用する方法 WP_QueryこれらにはSQLインジェクションからの保護機能が組み込まれています。ファイル操作を行う際には、その機能を利用してください。 wp_upload_dir()wp_handle_upload() APIを使用してパスの安全性を確保します。

フック(Hooks)を利用することで、高い拡張性を実現する。

WordPressのプラグインシステムの核心はフック(hook)メカニズムであり、これは「アクション(action)」と「フィルター(filter)」で構成されています。フックにより、プラグインはWordPressのコアコードを変更することなく、WordPressの動作やデータを変更することができます。また、他の開発者もあなたのプラグインを拡張することが可能になります。

推薦図書 WordPressテーマ開発入門ガイド:最初のカスタムテーマをゼロから構築する

アクションフックの用途と作成方法

アクションフックは、特定のタイミングでコードを実行しますが、返り値を期待しません。プラグインでは、WordPressが提供する何千もの内蔵フックを使用することができます。 init, wp_enqueue_scripts, save_postまた、他の開発者が使用できるように、自分専用のフック(hook)を作成することもできます。

フックにマウントされたコードは以下の通りです:

インターサーバー共有ホスティング
共有ホスティング月$2.50米ドル, 最初の月$0.1米ドルプロモーションコードtryinterserver, 461クラウドアプリケーションスクリプト, 1クリックインストール.
// 在文章内容前自动添加一个横幅
function myplugin_prepend_content( $content ) {
    if ( is_single() ) {
        $custom_text = '<div class="myplugin-banner">これは広告枠です。</div>';
        $content = $custom_text . $content;
    }
    return $content;
}
add_filter( 'the_content', 'myplugin_prepend_content' );

注意:ここでは内容を変更しましたが、使用されているのはフィルターフックです。 the_contentそれは、修正後の値を返すことを要求しているからです。

カスタムアクションフックの作成方法について do_action 関数:

// 在你的插件代码中定义一个动作点
function myplugin_complete_task() {
    // ... 执行一些任务 ...
    // 发出自定义动作,允许其他代码在此处添加功能
    do_action( 'myplugin_after_task_complete', $task_id, $result );
}

その他のプラグインやテーマは、以下の方法で追加することができます: add_action('myplugin_after_task_complete', 'callback', 10, 2) このアクションに応答するために。

フィルターフックの原理と例

フィルターフックは、データが使用される前にそれを変更するために使用されます。このフックは値を受け取り、(変更された可能性のある)値を返す必要があります。これは、プラグインがテキスト、オプション、またはクエリ結果を変更するための一般的な方法です。

内蔵フィルターを使用する:

// 修改文章摘要的长度
function myplugin_excerpt_length( $length ) {
    return 20; // 将摘要字数限制改为20字
}
add_filter( 'excerpt_length', 'myplugin_excerpt_length' );

カスタムフィルターフックを作成して使用する方法 apply_filters 関数:

function myplugin_get_price( $product_id ) {
    $base_price = get_post_meta( $product_id, 'price', true );
    // 应用过滤器,允许其他代码动态修改价格(例如添加税费、折扣)
    $final_price = apply_filters( 'myplugin_product_price', $base_price, $product_id );
    return $final_price;
}

この方法により、あなたのプラグインは柔軟なインターフェースを提供しており、他の開発者はあなたのプラグインのソースコードを直接変更することなく、価格計算のロジックを簡単に修正することができます。

プラグインの国際化とスクリプトリソースの管理

成熟したWordPressプラグインは国際化をサポートしている必要があり、異なる言語に翻訳されることができるようになっているべきです。また、フロントエンドおよびバックエンドのCSSやJavaScriptリソースを適切に管理する機能も備えている必要があります。

プラグインの国際化を実現する

国際化は、翻訳が必要なすべてのテキスト文字列を特定の関数でラップすることによって実現されます。これには2つの主要なステップがあります:テキストドメインを使用して翻訳ファイルを読み込むこと、およびコード内で翻訳可能な文字列にマークを付けることです。

まず、プラグインのメインファイルのヘッダー部分で定義されているものです。 Text Domain(例えば) my-first-plugin)これがあなたのテキストエリアです。次に、プラグインが初期化される際に(通常は…) init フックを使用する load_plugin_textdomain 翻訳ファイルを読み込むための関数です。

function myplugin_load_textdomain() {
    load_plugin_textdomain(
        'my-first-plugin', // 文本域,必须与文件头一致
        false, // 已弃用参数
        dirname( plugin_basename( __FILE__ ) ) . '/languages' // 语言文件存放的相对路径
    );
}
add_action( 'init', 'myplugin_load_textdomain' );

コード内で使用するには、該当する部分にそのコードを記述します。具体的な方法は、使用しているプログラミング言語やフレームワークによって異なります。 __() 请将以下文本翻译成日语,并返回相应的字符串。使用指定的翻译方法(例如:“使用……方法”)。 _e() 来翻译并直接输出字符串。

$settings_title = __( 'My Plugin Settings', 'my-first-plugin' );
_e( 'Hello World!', 'my-first-plugin' );

開発者はこれを使用することができます。 Poedit これらのツールはソースコードからこれらの文字列を抽出し、生成します。 .pot テンプレート・ファイルを .po.mo そのファイルは、プラグイン内に保存されています。 /languages/ ディレクトリ内にあります。

CSSおよびJavaScriptを正しく導入する方法

PHPファイル内にデータを直接ハードコードすることは絶対に避けてください。 <link> または <script> リソースを導入するにはタグを使用します。WordPressでは、リソースの依存関係の管理、バージョン管理、および読み込みタイミングの制御を行うための統一されたキュー(enqueue)システムが提供されています。

バックエンドリソースについては、以下の方法を使用してください: admin_enqueue_scripts フック。

function myplugin_admin_scripts( $hook ) {
    // 只在特定插件设置页面加载
    if ( $hook != 'toplevel_page_myplugin-settings' ) {
        return;
    }
    wp_enqueue_style(
        'myplugin-admin-style', // 句柄
        plugins_url( 'css/admin-style.css', __FILE__ ), // 文件URL
        array(), // 依赖
        '1.0.0'  // 版本号,可用于强制浏览器更新缓存
    );
    wp_enqueue_script(
        'myplugin-admin-script',
        plugins_url( 'js/admin-script.js', __FILE__ ),
        array( 'jquery' ), // 依赖jQuery
        '1.0.0',
        true // 在页脚加载
    );
}
add_action( 'admin_enqueue_scripts', 'myplugin_admin_scripts' );

フロントエンドリソースについては、以下の方法を使用します: wp_enqueue_scripts フック(hook)の仕組みも同様です。これにより、リソースのロードが順序良く行われ、競合が避けられるとともに、ブラウザのキャッシュを活用することができます。

概要

WordPressプラグインの開発は、体系的な工程です。標準に準拠したメインファイルの作成から始まり、バックエンドインターフェースの構築、データセキュリティの処理、コアフックの活用、国際化対応など、多くの側面をカバーします。ベストプラクティスに従い、特に厳格なデータセキュリティ規格とフックメカニズムへの深い理解が、安定した、安全で拡張性のある商用レベルのプラグインを開発するための鍵となります。設定APIや管理スクリプトリソースを適切に利用することで、プラグインの専門性とユーザー体験を大幅に向上させることができます。開発者は常にコード内で翻訳のための準備をしておくべきであり、これによりプラグインの適用範囲を広げることができます。

FAQ よくある質問

最もシンプルなWordPressプラグインには、以下の要素が含まれる必要があります:

最もシンプルなプラグインは、PHPファイル1つだけで構成されており、そのファイルには標準的なプラグインヘッダーのコメントが含まれていなければなりません。中でも最も重要なコメント行は「Plugin Name」です。このファイル内で、直接PHPコードを記述することも、フックを利用して機能を追加することもできます。

例えば、「Hello World」という出力のみを行う短いコードを含むプラグインであっても、実行するためにはこのようなファイル1つだけで十分です。

プラグインはどのようにしてWordPressのデータベースとやり取りを行うのでしょうか?

WordPressに内蔵されているデータベース操作クラスの使用をお勧めします。 $wpdbそれは安全なデータ照会方法を提供しており、特にその… prepare この方法は、SQLインジェクション攻撃を効果的に防ぐことができます。

ほとんどのデータ操作(記事の取得やメタデータの操作など)には、WordPressの高度にカプセル化された関数を使用することをお勧めします。 get_posts(), WP_Query, get_post_meta(), update_post_meta() これらの関数は、内部でセキュリティやキャッシングの問題をすでに処理しています。カスタムデータ構造については、開発者はプラグインを有効にする際にカスタムデータテーブルを作成することができます。

どこで利用可能なすべてのアクションやフィルターホックを見つけることができますか?

WordPressの公式開発ドキュメントは、フックを探すのに最適な場所です。さらに、開発者はWordPressのコアソースコードを直接検索することでもフックを見つけることができます。

コードエディタでWordPressのルートディレクトリを開き、検索してください。 do_action または apply_filters 関数呼び出しにより、定義されているすべてのフックとその引数を検出することができます。多くのオンラインリファレンス資料では、よく使われるフックの一覧も整理されています。

私のWordPressプラグインのコードをどのようにデバッグするのか。

まず、ご自身の環境で以下のことを確認してください: wp-config.php ファイル内でデバッグモードが有効になっています。 define( 'WP_DEBUG', true );これにより、PHPのエラーや警告を表示することができます。訪問者にエラーメッセージが表示されないようにするには、同時に設定を行うことができます。 define( 'WP_DEBUG_DISPLAY', false ); そして、エラーをログファイルに記録してください:define( 'WP_DEBUG_LOG', true );

次に、使用する方法は… error_log() この関数は、カスタムのデバッグ情報をログファイルに記録します。配列やオブジェクトなどの複雑なデータ構造については、それらを適切に処理しながらデバッグ情報を記録することができます。 print_r() または var_dump() 情報を出力する際には、管理者がログインしている場合にのみ閲覧できるようにしてください。そうすることで、情報の漏洩を防ぐことができます。Xdebugのような専門的なPHPデバッグツールを使用すると、より効率的にブレークポイントの設定やスタックトレースの確認が行えます。