WordPressプラグイン開発入門:ゼロから最初の機能拡張を構築する

3分で読了
2026-03-11
2026-06-04
1,918
以下のリンクからお買い物をしていただくと、コミッションを差し上げます。.

なぜWordPressプラグインの開発を選ぶのでしょうか?

WordPressは世界で最も人気のあるコンテンツ管理システム(CMS)であり、その強力な拡張性は主にプラグインアーキテクチャによるものです。自分でプラグインを開発することで、既存のプラグインの機能に縛られることなく、自分のウェブサイトや顧客の特定のニーズに正確に対応することができます。シンプルなショートコードの追加であれ、複雑な管理パネルの構築であれ、プラグインを使用することで機能ロジックをテーマから分離でき、テーマがアップデートされても機能に影響が出ないようにすることができます。

学習の観点から見ると、プラグイン開発を理解することはWordPressの核心に深く入り込むための必要なステップです。プラグイン開発を通じて、アクションフック(Action Hooks)とフィルターフック(Filter Hooks)という2つの重要な概念に触れることができます。これらはWordPressがモジュール化および拡張性を実現するための基盤となる要素です。プラグイン開発のスキルを身につけることで、技術的な能力が向上するだけでなく、新たな職業機会が開かれる可能性もあり、さらには販売可能なデジタル製品を作り出すこともできるでしょう。

開発前の準備作業

最初のコード行を書く前に、適切な開発環境が必要です。これには通常、ローカルサーバー環境(Local by Flywheel、XAMPP、MAMPなど)、コードエディタ(VS Code、PhpStormなど)、そしてWordPressがインストールされたテストサイトが含まれます。テスト環境のPHPバージョンが本番環境と一致していることを確認してください。これにより、互換性の問題を防ぐことができます。

推薦図書 WordPressの核心的なスキルをマスターする:構築から最適化までの完全な実践ガイド

プラグインの基本構造を理解する。

最も基本的なWordPressプラグインは、PHPファイル1つだけを含むこともあります。しかし、構造が整っているプラグインでは、より良い整理のために複数のディレクトリやファイルが含まれることが一般的です。典型的なプラグインディレクトリの構造は以下のようになります:
メインプラグインファイル(例えば) my-first-plugin.php):これはプラグインのエントリーポイントであり、プラグインのヘッダー情報が含まれています。
- includes/ 目录:存放核心功能类或函数文件。
- admin/ 目次:バックエンド管理インターフェースに関連するコードが保存されています。
- public/ 目次:ウェブサイトのフロントエンド向けのコードが保存されています。
- assets/ 目录:存放JavaScript、CSS和图片等静态资源。
- languages/ 目次:国際化翻訳ファイル(.po/.mo)を格納するためのディレクトリです。

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

必須のプラグインヘッダー情報

すべてのWordPressプラグインは、そのメインのPHPファイルの冒頭に標準的なプラグインヘッダーのコメントを含める必要があります。これはWordPressがプラグインを認識するための鍵となります。以下に最も基本的な例を示します:

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

その中で、Plugin Name これは必須項目で、その他はすべてオプションです。ただし、プラグインの完全性と保守性を考慮すると、関連するすべての情報を記入することをお勧めします。Text Domain 国際化のために使用されます。Domain Path 言語ファイルのディレクトリを指します。

自分の最初のプラグインを作ってみましょう:シンプルな挨拶機能です。

実際の例を通じて実践してみましょう。ウェブサイトの記事内容の上部に、カスタマイズ可能な挨拶メッセージを表示するプラグインを作成します。

プラグインファイルとディレクトリを作成します。

まず、WordPressのインストールディレクトリの下にある wp-content/plugins/ フォルダー内に新しいフォルダーを作成し、名前を付けます。 my-greeting-pluginその後、そのフォルダ内にメインのPHPファイルを作成し、ファイル名を「main.php」とします。 my-greeting-plugin.phpそして、上記のプラグインヘッダー情報をその場所にコピーしてください。

推薦図書 高品質なWordPressプラグインを選択し、開発する方法:入門から上級まで

フックを使用して機能を追加する

WordPressはフックシステムによって動作しています。記事の内容の前に情報を追加したい場合は、それに対応するフックを利用する必要があります。 the_content フィルターフック。メインプラグインファイルに、以下の関数とフックの呼び出しを追加してください:

/**
 * 在文章内容前添加问候语
 *
 * @param string $content 原始的文章内容。
 * @return string 修改后的文章内容。
 */
function mgp_add_greeting_to_content( $content ) {
    $greeting_text = get_option( 'mgp_greeting_text', '欢迎阅读!' ); // 从数据库获取设置,默认为“欢迎阅读!”
    $custom_greeting = '<div class="mgp-greeting"><p><strong>'`. esc_html($greeting_text).`'</strong></p></div>';

// 仅对主循环中的单篇文章页面生效
    if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
        return $custom_greeting . $content;
    }
    return $content;
}
// 将函数挂载到 `the_content` 过滤器
add_filter( 'the_content', 'mgp_add_greeting_to_content' );

このコードは、ある関数を定義しています。 mgp_add_greeting_to_contentそれは記事の内容を受け取り、その前に挨拶文が含まれたDIVコンテナを追加します。 add_filter() 関数についてですが、私たちはカスタム関数をWordPressにマウント(つまり、WordPressのシステムに関数を組み込む)する予定です。 the_content フィルターが適用されています。関数内のロジック判断により、挨拶文がフロントエンドの単一記事ページのメインループ内でのみ表示されるようになっており、ページ全体やアーカイブページ、ツールバーには影響しません。

シンプルな管理設定ページを作成します。

ユーザーが挨拶文をカスタマイズできるようにするために、簡単な設定ページを追加する必要があります。これにはWordPressの管理メニューAPIを使用する必要があります。メインプラグインファイルに以下のコードを追加してください:

hosting.com 共有ホスティング
AMD EPYC CPU、NVMe SSDストレージ、LiteSpeedによる高いパフォーマンス、24時間365日の専門家による社内サポート、SSL、ブルートフォース、マルウェア、DDoS保護などの高度なセキュリティ対策、最大73%のコスト削減
/**
 * 注册插件设置菜单和页面
 */
function mgp_register_admin_menu() {
    add_options_page(
        '问候语设置',           // 页面标题
        '问候语插件设置',       // 菜单标题
        'manage_options',      // 所需权限
        'my-greeting-plugin',  // 菜单slug
        'mgp_render_settings_page' // 用于输出页面内容的回调函数
    );
}
add_action( 'admin_menu', 'mgp_register_admin_menu' );

/**
 * 渲染设置页面的内容
 */
function mgp_render_settings_page() {
    ?&gt;
    <div class="wrap">
        <h1>挨拶文プラグインの設定</h1>
        <form method="post" action="/ja/options.php/" data-trp-original-action="options.php">
            <?php
            settings_fields( 'mgp_settings_group' ); // 输出设置组和非ce字段
            do_settings_sections( 'my-greeting-plugin' ); // 输出设置区域
            submit_button(); // 输出提交按钮
            ?>
        <input type="hidden" name="trp-form-language" value="ja"/></form>
    </div>
    <?php
}

/**
 * 初始化插件设置
 */
function mgp_initialize_settings() {
    // 注册一个设置
    register_setting(
        'mgp_settings_group', // 设置组名
        'mgp_greeting_text',  // 选项名,对应数据库中的键
        array( // 可选的验证回调函数
            'sanitize_callback' => 'sanitize_text_field',
            'default' =&gt; '欢迎阅读!'
        )
    );

// 添加一个设置区域
    add_settings_section(
        'mgp_main_section',           // 区域ID
        '主要设置',                   // 区域标题
        null,                         // 区域介绍的回调函数(此处不需要)
        'my-greeting-plugin'          // 页面slug
    );

// 向区域中添加一个字段
    add_settings_field(
        'mgp_greeting_field',         // 字段ID
        '问候语文本',                 // 字段标签
        'mgp_greeting_field_callback', // 用于输出字段HTML的回调函数
        'my-greeting-plugin',         // 页面slug
        'mgp_main_section'            // 区域ID
    );
}
add_action( 'admin_init', 'mgp_initialize_settings' );

/**
 * 渲染问候语文本输入字段
 */
function mgp_greeting_field_callback() {
    $greeting = get_option( 'mgp_greeting_text', '欢迎阅读!' );
    echo '<input type="text" name="mgp_greeting_text" value="' . esc_attr( $greeting ) . '" class="regular-text" />';
    echo '<p class="description">このテキストは、あなたのウェブサイトの各記事のトップに表示されます。</p>';
}

このコードは以下の処理を実行しました:
1. 使用方法 add_action( 'admin_menu', ... ) 「設定」メニューにサブメニューページが追加されました。
2. 使用方法 add_action( 'admin_init', ... ) 初期化設定には、データベースの登録オプション、設定エリア、および入力フィールドの設定が含まれます。
3. レンダリング設定ページのフォームやフィールドを処理する関数が定義されています。
今すぐ、WordPressの管理画面にログインしてください。「設定」メニューの中に「グリーティングプラグイン設定」があります。そこでグリーティングテキストを変更すると、すぐにフロントエンドの記事でその効果を確認できます。

プラグイン開発のベストプラクティスと上級者向けのテクニック

基本機能を完成させた後、ベストプラクティスに従うことで、プラグインをよりプロフェッショナルでセキュアに、かつメンテナンスしやすいものにすることができます。

安全性は最優先事項です。

ユーザーが入力したデータを絶対に信じてはいけません。プラグイン内では、外部から取得されるすべてのデータについて同様の注意が必要です。 $_GET$_POST$_COOKIE データベースからのクエリ結果なども、出力したり使用する前に必ず検証、クリーニング、またはエスケープ処理を行う必要があります。
- 转义输出:使用 esc_html()esc_attr()esc_url()wp_kses_post() などの関数です。
- 清理输入:使用 sanitize_text_field()sanitize_email()intval() などの関数です。
データベースのセキュリティ: を使用する $wpdb クラスのメソッドを使用して検索を行う、または利用する。 prepare() SQLインジェクションを防ぐために、パラメータ化されたクエリを使用する方法です。
- 权限检查:在管理页面或执行敏感操作前,使用 current_user_can() ユーザーの権限を確認し、それに基づいて処理を行ってください。 check_admin_referer() nonceフィールドを検証することで、クロスサイトリクエストフォージング(CSRF)を防ぎます。

推薦図書 WordPressのコアスキルをマスターし、機能性と美観を兼ね備えたプロフェッショナルなウェブサイトを制作しましょう。

国際化(i18n: Internationalization)の実現

あなたのプラグインを世界中のユーザーが利用できるようにするためには、多言語翻訳に対応する必要があります。これには、WordPressの翻訳機能を使用して、ユーザーに表示されるすべてのテキストを翻訳する必要があります。以前のコードにあるテキストの出力部分を以下のように修正してください:

// 在插件头信息中已定义 Text Domain: my-first-plugin
$greeting_text = get_option( 'mgp_greeting_text', __( '欢迎阅读!', 'my-first-plugin' ) );

// 在管理菜单函数中
add_options_page(
    __( '问候语设置', 'my-first-plugin' ),
    __( '问候语插件设置', 'my-first-plugin' ),
    'manage_options',
    'my-greeting-plugin',
    'mgp_render_settings_page'
);

その後、Poeditのようなツールを使用して、プラグインのソースコードから文字列を抽出し、それを生成することができます。 .pot テンプレートファイルを使用することで、翻訳者はそれに基づいて異なる言語のコンテンツを作成することができます。 .po.mo そのファイルをプラグインに組み込んでください。 /languages カタログ

インターサーバー共有ホスティング
共有ホスティング月$2.50米ドル, 最初の月$0.1米ドルプロモーションコードtryinterserver, 461クラウドアプリケーションスクリプト, 1クリックインストール.

コードの整理とパフォーマンスの最適化

プラグインの機能が増えていくにつれて、コードを異なるファイルに分割することは賢明な選択です。オブジェクト指向プログラミング(OOP)やクラスを使用してコードを整理することで、可読性と再利用性が向上します。リソース(CSSやJS)については、適切な方法で管理することが重要です。 wp_enqueue_style()wp_enqueue_script() 関数は正しいフック(例えば…)で実行されています。 wp_enqueue_scripts または admin_enqueue_scripts必要に応じてコンテンツをロードし、依存するバージョンを明確に指定してください。プラグイン内で高コストなデータベースクエリを直接実行するのは避け、非重要なデータのキャッシングにはTransients APIを利用することを検討してください。

概要

シンプルなPHPファイルを作成し、標準的なプラグインヘッダー情報を追加するところから始め、アクションフックやフィルターフックを利用してWordPressのライフサイクルにプラグインを統合し、管理インターフェースを構築し、セキュリティや国際化のベストプラクティスに従うまで、あなたは完全なWordPressプラグインを作成するための基本的な手順をすべて経験しました。この「グリーティングメッセージプラグイン」はシンプルですが、プラグイン開発の核心的なプロセス——機能の計画、フックの設定、データの処理、インターフェースの作成——をすべて実演しています。公式マニュアルの継続的な学習、優れたオープンソースプラグインのコードの研究、そして実践を重ねることが、プラグイン開発スキルを向上させる最良の方法です。次に作るプラグインでは、もっと複雑で興味深い実際の問題を解決できるかもしれません。

FAQ よくある質問

WordPressのプラグインには、少なくともいくつのファイルが必要ですか?

機能が完全なWordPressプラグインであれば、最低でも1つのPHPファイルが必要です。そのファイルの冒頭に正しいプラグインヘッダ情報を含めていればよいのです(少なくとも以下の内容が必要です)。 Plugin Nameその場合、WordPressはバックエンドのプラグインリストからそのプラグインを認識し、有効にすることができます。このファイルには、すべての機能コードや管理ページ用のコードなどが含まれています。もちろん、複雑なプラグインの場合は、メンテナビリティを考慮してコードを複数のファイルやディレクトリに分けることが推奨されます。

開発したプラグインが他のプラグインと衝突するのをどのように避けるか?

衝突を避けるための鍵は、すべての関数、クラス、変数、オプション名、およびアクション/フィルターホックに一意の接頭辞を使用することです。例えば、以下のような使い方は避けてください: add_greeting() このような汎用的な関数名ではなく、代わりに次のような名前を使用すべきです: mgp_add_greeting() このような名前(その中で) mgp (これはあなたのプラグインの略称です)。データベースに保存されているオプションについても、同様に一意な接頭辞を使用する必要があります。例えば: mgp_greeting_textこれにより、名前空間の衝突が発生する可能性を最大限に低減することができます。

プラグインを有効にしたり無効にしたりする際には、どのような処理を行うべきでしょうか?

プラグインを有効にすると、通常、PHPやWordPressのバージョンの確認、データベーステーブルの作成、デフォルト設定の初期化など、一度だけ実行されるタスクが必要になります。これらは以下の方法で行うことができます: register_activation_hook() 関数を使って実現します。同様に、register_deactivation_hook() プラグインが無効になったときに実行される処理を定義するためのもので、例えばスケジュールされたタスクを削除するなどが含まれます。ただし、無効化フックは通常データの削除には使用されません。データのクリーニングは、アンインストール時のフックやユーザーによる手動操作によって行われることが一般的です。

私のプラグインに設定ページを追加するにはどうすればよいですか?

プラグインに設定ページを追加するには、主に2つのWordPress APIを使用します:メニューAPIと設定APIです。まず、以下の手順に従ってください: add_action( 'admin_menu', ... ) 関数をマウント(つまり、別の場所で利用可能にする)し、その関数内で使用します。 add_menu_page() または add_submenu_page() トップレベルまたはサブレベルのメニューページを登録してください。その後、使用してください。 add_action( 'admin_init', ... ) 別の関数をマウントし、その中で使用します。 register_setting()add_settings_section()add_settings_field() 具体的な設定オプションやフォームフィールドを定義します。最後に、設定ページのHTMLフォームをレンダリングするためのコールバック関数を作成します。

私のプラグインは、どのWordPressバージョンと互換性が必要ですか?

それはあなたのターゲットユーザーグループによります。一般的には、過去3〜4バージョンの主要なWordPressとの互換性を持たせることが推奨されます。プラグインのヘッダー情報内でこれを指定することができます。 Requires at least: ここでは、WordPressの最低要件を明記します。開発過程においては、最新版のWordPressでのみサポートされている非常に新しい機能の使用は避けるべきです。 function_exists() 条件検査を行い、後方互換性のある代替案を用意することが重要です。また、古いバージョンのWordPressで定期的にテストを行うことも、互換性を確保するための良い方法です。