徹底的なWordPressプラグイン開発:最初のカスタムプラグインをゼロから作る

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

WordPressプラグインの基礎と開発環境

コードを書き始める前に、WordPressプラグインの基本概念を理解し、適切な開発環境を設定することが重要です。WordPressプラグインは基本的に、WordPressが提供する豊富なAPIを通じてコア機能を拡張するPHPコードを含むフォルダです。プラグインは、短いコードを追加する程度の小規模なものから、完全な管理システムを構築するような大規模なものまであります。核となる考え方は、「コアのコードはそのままにしておく」ことで、WordPressがアップグレードされたときにカスタマイズが失われないようにします。

効率的な開発のためには、ローカルな開発環境が必要です。XAMPP、MAMP、Local by Flywheel、Dockerなどのツールを使って、PHPとMySQLを備えたサーバーを素早くセットアップできます。次に、最新のWordPressインスタンスをインストールします。開発中はwp-config.phpファイル内で有効にするWP_DEBUGエラーをタイムリーに明らかにするためだ。

プラグインの「心臓部」はメインのPHPファイルです。WordPressはこのメタ情報を読み込んでプラグインを識別し、バックグラウンドで管理します。標準的なプラグインのメインファイルのヘッダーコメントを以下に示します:

推薦図書 WordPressテーマとは

<?php
/**
 * Plugin Name: 我的第一个自定义插件
 * Plugin URI:  https://example.com/my-first-plugin
 * Description: 这是一个用于学习插件开发的简单插件,它将在文章末尾添加自定义内容。
 * Version:     1.0.0
 * Author:      开发者名称
 * License:     GPL v2 or later
 * Text Domain: my-first-plugin
 */

最初の機能プラグインを作成しましょう。

実際の機能から始めましょう:ウェブサイトの各投稿コンテンツの最後に、カスタムテキストの段落を自動的に追加します。この例では、プラグイン開発の中核となるプロセスを実行します。

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

プラグインマスターファイルと初期化

まず、WordPressの中で…wp-content/pluginsカタログの下に新しいフォルダを作成してください。例えば、my-first-pluginそのフォルダ内に、メインのPHPファイルを作成してください。ファイル名は自由に決めてかまいません。my-first-plugin.php.上のヘッダー・コメントコードをコピーしてください。

次に、プラグインの初期化コードを安全に実行する方法が必要です。ベストプラクティスは、すべての機能をクラスでラップするか、名前空間の関数を使うことです。ここでは、シンプルなクラスを使ってコードを整理します。メイン・ファイルのヘッダー・コメントの後に、以下のクラス定義を追加します:

if ( ! defined( 'ABSPATH' ) ) {
	exit; // 防止直接访问文件
}

class My_First_Plugin {
    public function __construct() {
        // 构造函数,在这里挂载钩子
    }
}

// 初始化插件
new My_First_Plugin();

if ( ! defined( ‘ABSPATH’ ) )このコード行はWordPressプラグイン開発のセキュリティ標準であり、ユーザーがURLを通して直接プラグインファイルにアクセスするのを防ぐために使用されます。

フックを使って記事フッターのコンテンツを追加する

WordPressのプラグイン・アーキテクチャは、アクションとフィルターに分けられる「フック」(Hooks)のシステム上に構築されています。アクションは特定の瞬間にコードを実行することができ、フィルターはデータを変更することができます。

推薦図書 WordPressウェブサイトのパフォーマンス最適化のための究極ガイド:基本設定からキャッシュプラグインまでの徹底解説

私たちの目標は、記事の内容の後にテキストを追加することであり、これは内容を「フィルタリング」する作業である。そのためthe_contentこのフィルタークラスのコンストラクタとメソッドを以下のように修正する:

クラス My_First_Plugin {
    パブリック関数 __construct() {
        // カスタムメソッドを ‘the_content' フィルタにマウントする
        add_filter( 'the_content', array( $this, 'add_footer_to_content' ) ); } 。
    }

/**
     * 記事コンテンツの後にカスタムフッターを追加する
     *
     * @param string $content オリジナルの記事コンテンツ。
     * @return string 変更された記事コンテンツ。
     */
    public function add_footer_to_content( $content ) { // 記事コンテンツにのみ表示されるようにします。
        // メインループの単一記事ページにのみ表示されるようにする
        if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) { // メインループの単一記事ページにのみ表示されるようにする。
            $custom_footer = '<div class="my-plugin-footer"><p>この記事を読んでくれてありがとう!私の最初のプラグイン]によって生成されました。</p></div>'.
            $content .= $custom_footer。
        }
        return $content。
    }
}

add_filter()関数はクラスメソッドadd_footer_to_content登録するthe_contentフィルター。私たちのメソッドは、WordPressが投稿コンテンツを出力する準備ができたときに呼び出され、生のコンテンツを渡します。条件判定を使用して、フッターが個々の投稿ページにのみ追加されるようにし、トップページとアーカイブページに重複して追加されないようにしています。最後に、カスタム HTML をコンテンツに追加して返します。

プラグインに管理者用バックエンドオプションを追加

本格的なプラグインは通常、ユーザーがバックエンドでこれを設定できるようになっています。ここでは、先ほど見たフッターテキストに簡単な設定オプションを追加し、ユーザーが表示されるテキストをカスタマイズできるようにします。

hosting.com 共有ホスティング
AMD EPYC CPU、NVMe SSDストレージ、LiteSpeedによる高いパフォーマンス、24時間365日の専門家による社内サポート、SSL、ブルートフォース、マルウェア、DDoS保護などの高度なセキュリティ対策、最大73%のコスト削減

セットアップメニューページの作成

WordPress管理画面バックエンドの設定メニューの下にサブページを追加する必要があります。これはadd_options_page()関数は、通常admin_menuフックでのアクション。

まず、メニューとページを登録するための新しいメソッドをプラグインクラスに追加します:

class My_First_Plugin {
    // ... 之前的构造函数和方法 ...

public function __construct() {
        add_filter( 'the_content', array( $this, 'add_footer_to_content' ) );
        // 挂载后台管理菜单
        add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );
        // 挂载初始化设置选项
        add_action( 'admin_init', array( $this, 'settings_init' ) );
    }

public function add_admin_menu() {
        add_options_page(
            '我的第一个插件设置', // 页面标题
            '自定义页脚设置',     // 菜单标题
            'manage_options',     // 所需权限
            'my-first-plugin',    // 菜单slug
            array( $this, 'options_page_html' ) // 回调函数,用于输出页面HTML
        );
    }
}

登録設定フィールドとレンダリングページ

次に、WordPress Settings APIを使用して、オプションを安全に登録、保存、検証する必要があります。これにはregister_setting(), add_settings_section()add_settings_field()などの関数です。

推薦図書 WooCommerceとは何でしょうか?その核心機能と使用シナリオについて詳しく解説します。

public function settings_init() {
    // 設定オプショングループを登録する
    register_setting( 'my_first_plugin_settings', 'my_first_plugin_options' );

// ページに設定セクションを追加する
    add_settings_section(
        'my_first_plugin_section'.
        'Footer Content Configuration'、
        array( $this, 'section_callback' )、
        'my-first-plugin'
    ).

// この領域にフィールドを追加する
    add_settings_field(
        'footer_text'.
        'footer_text_rendering'、
        array( $this, 'footer_text_field_render' )、
        'my_first_plugin'、
        'my_first_plugin_section' です。
    );
}

パブリック関数 section_callback() {
    echo '<p>記事の最後に表示するテキストコンテンツをここで設定する。</p>';
}

public function footer_text_field_render() { フッターテキストフィールドのレンダリング。
    $options = get_option( 'my_first_plugin_options' );
    $value = $options['footer_text'] ???????! 'この記事を読んでくれてありがとう!my_first_plugin]によって生成されました。; // デフォルト値
    ?&gt;
    <input type='text' name='my_first_plugin_options[footer_text]' value='<?php echo esc_attr( $value ); ?>' style='width: 400px;'>
    <p class="description">以下のようなシンプルなHTMLタグをサポートしている。 <strong>, <em>, <a>。</p>
    }
    <div class="wrap">
        <h1></h1>
        <form action='/ja/options.php/' method='post' data-trp-original-action="options.php">
            <?php
            settings_fields( 'my_first_plugin_settings' );
            do_settings_sections( 'my-first-plugin' );
            submit_button();
            ?>
        <input type="hidden" name="trp-form-language" value="ja"/></form>
    </div>
    あなたのアカウントは有効です。あなたはログインしています。

最後に、フロントエンド出力関数を修正する。add_footer_to_contentデータベース・オプションからテキストを読み込むようにする:

public function add_footer_to_content( $content ) { { { { add_footer_to_content( $content )
    if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) { (
        $options = get_option( 'my_first_plugin_options' );
        $footer_text = $options['footer_text'] ????? ? 'この記事を読んでくれてありがとう!私の最初のプラグイン]によって生成されました。;
        $custom_footer = '<div class="my-plugin-footer"><p>' . wp_kses_post( $footer_text ) . '</p></div>'.
        $content .= $custom_footer。
    }
    return $content。
}

wp_kses_post()機能は、ユーザーが入力したテキストに安全なHTMLタグだけが許されるようにするもので、これは重要なセキュリティ対策である。

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

插件国际化与最佳实践

プラグインを世界中のユーザーに使ってもらうために、国際化(i18n)は不可欠なステップです。 WordPressは翻訳のためにGNU gettextフレームワークを使います。

テキスト領域と翻訳機能

まず、プラグインのヘッダーコメントでText Domain例えばmy-first-plugin.次に、プラグイン内の翻訳が必要な文字列をすべて、特定の関数でラップします。

先ほどのコードを修正し、出力テキストの翻訳サポートを追加する:

// コンストラクタで翻訳ファイルを読み込む
パブリック関数 __construct() {
    // ... その他のフック ...
    add_action( 'plugins_loaded', array( $this, 'load_textdomain' ) );
}

public function load_textdomain() { 以下のようにします。
    load_plugin_textdomain(
        'my-first-plugin'.
        false, dirname( plugin_basename( __FILE__ ) ) .
        dirname( plugin_basename( __FILE__ ) ) . '/languages/'
    );
}

// 設定ページの文字列を変更する
パブリック関数 section_callback() {
    echo '<p>' . esc_html__( '投稿の最後に表示されるテキストコンテンツをここで設定します。' ., 'my-first-plugin' ) . '</p>';
}

public function footer_text_field_render() { フッターテキストフィールドのレンダリング。
    $options = get_option( 'my_first_plugin_options' );
    $value = $options['footer_text'] ????! __( 'この記事を読んでいただきありがとうございます!my-first-plugin]によって生成されました。, 'my-first-plugin' ); ?
    ?&gt;
    <input type='text' name='my_first_plugin_options[footer_text]' value='<?php echo esc_attr( $value ); ?>' style='width: 400px;'>
    <p class="description">&lt;?php esc_html_e( &#039;<strong>、<em>、<a>のようなシンプルなHTMLタグをサポートします。, 'my-first-plugin' ); ?&gt;</p>
    &lt;?php
}

// 注意:フロントエンドでユーザーが入力した「フッターテキスト」は、管理者によって設定されたコンテンツに固有のものなので、通常はそれ自体を翻訳する必要はありません。

__()文字列を翻訳して返す。esc_html__()HTML出力の翻訳とエスケープを行う。_e()文字列を直接翻訳して表示するために使用する。関数の第2引数はテキストフィールドで、プラグインの定義と一致していなければなりません。

セキュリティー、パフォーマンス、コード編成

国際化に加えて、以下のベストプラクティスに従う必要がある:
1.セキュリティ:すべてのユーザー入力を検証し、クリーンにして、エスケープする。使用方法sanitize_text_field(), esc_html(), wp_kses_post()などの関数を使用します。wp_nonce_field()CSRF攻撃を防ぐ。
2.パフォーマンス:フックを賢く使い、ページロードのたびに不必要なデータベースクエリを実行しないようにする。出力の一時的なキャッシュを考慮する。
3.コードの構成:複雑なプラグインでは、機能モジュールごとにファイルを分割する。メインファイルはブートストラップを担当し、クラスとメソッドはincludes/ディレクトリに、フロントエンドのアセット(CSS、JS)はassets/カタログ
4.アンインストール時のクリーンアップ:プラグインがデータベーステーブルやオプションを作成する場合、データをクリーンアップするためのアンインストール機能を提供する必要があります。これは別のuninstall.phpファイルを使用して実現します。

概要

このチュートリアルで、基本的な機能を持つWordPressカスタムプラグインの完全な開発プロセスを完了しました:環境のセットアップから、プラグインのスケルトンの作成、フックシステムを使用した機能の追加、バックエンドの設定ページの実装、そして最後に国際化とセキュリティの実践まで。プラグインの使用方法add_filteradd_actionWordPressコアとのやりとり、Settings APIを使った信頼性の高いオプションページの作成方法、そしてload_plugin_textdomainプラグインを多言語に対応させる。プラグインを開発する際には、セキュリティ、保守性、ユーザーエクスペリエンスを第一に考慮することを忘れないでください。これを基礎として、カスタム投稿タイプ、メタデータ、ショートコード、REST APIエンドポイント、その他より高度な機能を探求し続け、より強力なWordPress拡張機能を構築することができます。

FAQ よくある質問

私のプラグインがバックエンドのメニューに表示されないのはなぜですか?

これは通常、パーミッションの問題やコードのエラーが原因です。まずadd_options_pageまたはadd_menu_page関数で指定されたパーミッションパラメータ(例えば‘manage_options’)は、現在ログインしているユーザー・ロールに一致します。次にadmin_menuフックが適切にマウントされ、コールバック関数に PHP の実行を中断させるような構文エラーがないこと。これを行う最も簡単な方法は、WordPressバックエンドのWP_DEBUG関連するエラーメッセージが出力されるかどうかを確認する。

プラグインにカスタムCSSとJavaScriptファイルを追加するには?

正しい方法は、以下のように使用することです:wp_enqueue_style()wp_enqueue_script()機能。フロントエンドのリソースはwp_enqueue_scriptsアクションフックにマウントされる。admin_enqueue_scriptsフックに。

プラグイン・クラスに以下のメソッドを追加します:

public function enqueue_frontend_assets() {
    wp_enqueue_style( ‘my-plugin-style’, plugin_dir_url( __FILE__ ) . ‘assets/css/style.css’, array(), ‘1.0.0’ );
}

そして、コンストラクタでadd_action( ‘wp_enqueue_scripts’, array( $this, ‘enqueue_frontend_assets’ ) );登録します。これにより、依存関係が正しく管理され、他のプラグインやテーマと競合することがなくなります。

ユーザーがプラグインをアンインストールしたときに、作成したデータオプションをクリーンアップするにはどうすればよいですか?

WordPressでは、主に2つの方法が用意されている。ひとつはアンインストールフックを登録する方法ですが、オブジェクト指向のプラグインではあまり使われません。より推奨される標準的な方法はuninstall.phpファイルは、メインのプラグインファイルと同じ階層にあります。

WordPressは、ユーザーがWordPressのバックエンドからプラグインを削除する際に、このファイルを自動的にチェックして実行します。このファイルはuninstall.phpをチェックする必要があります。WP_UNINSTALL_PLUGIN定数が定義されているかどうかを確認し、すべてのオプション、カスタムデータベーステーブル、およびプラグインによって作成されたその他のデータを安全に削除します。例

if ( ! defined( ‘WP_UNINSTALL_PLUGIN’ ) ) {
    exit;
}
delete_option( ‘my_first_plugin_options’ );
// 如果有自定义表:$wpdb->query( “DROP TABLE IF EXISTS {$wpdb->prefix}my_table” );

プラグインはどのようにWordPressの他のバージョンと互換性がありますか?

互換性を維持するための鍵は、新しいバージョンの関数や機能を注意深く使用し、古いバージョンの代替機能を提供することです。新しいバージョンにしか存在しないかもしれない関数を呼び出す前にfunction_exists()チェックを行う。例えば、導入した5.0バージョンを使用する場合wp_date関数がある:

if ( function_exists( ‘wp_date’ ) ) {
    $date = wp_date( get_option( ‘date_format’ ), $timestamp );
} else {
    $date = date_i18n( get_option( ‘date_format’ ), $timestamp );
}

また、プラグインのヘッダーコメントやReadmeファイルに、テスト済みのWordPressの最低バージョンを明記してください。古いバージョンのWordPressで定期的にテストすることが、互換性を確保する最善の方法です。