ゼロから始める:準備作業と環境構築
最初のプラグインを作成する前に、十分な準備をすることが必要です。これには、WordPressプラグインの基本構造を理解し、安全なローカル開発環境を設定し、プラグイン開発の核心的な考え方を把握することが含まれます。
典型的WordPressプラグインとは、WordPressのソフトウェア内に組み込まれて機能を拡張するコードのことです。そのプラグインは、通常、WordPressのディレクトリ内にある特定のフォルダやファイルとして存在します。 /wp-content/plugins/ ディレクトリ内にある独立したフォルダです。その中核となるのは、特定のファイルヘッダを持つPHPのメインファイルです。このメインファイルには、プラグインのメタ情報だけでなく、プラグインの機能全体を呼び出すためのエントリポイントも含まれています。プラグインの起動方法には2つあります。1つはプロシージャ指向の関数の組み合わせを使用する方法、もう1つはオブジェクト指向のクラス構造を採用する方法です。後者は、より優れたカプセル化とコードの組織化能力を持つため、現代のプラグイン開発ではより好まれています。
ローカル開発環境は効率的な開発にとって非常に重要です。XAMPP、Local by Flywheel、Dockerなどのツールを使用して、Apache/Nginx、MySQL、PHPが統合された開発環境を構築することをお勧めします。これにより、オンラインサイトに影響を与えることなく、自由にテストやデバッグを行うことができます。
推薦図書 ゼロから始める:WordPressプラグイン開発の完全ガイドとベストプラクティスの共有。
プラグインの骨格を構築する:構造とコアファイル
このセクションでは、WordPressの仕様に準拠した最も基本的なプラグインの骨組みをゼロから作成する方法について詳しく説明します。優れたプラグインの骨組みは、プラグインが安定して動作し、安全であり、メンテナンスが容易になるための基盤となります。
必要なメインプラグインファイルを作成します。
プラグインの「人生」(つまり、そのプラグインが実際に使用され始める瞬間)は、メインファイルから始まります。このメインファイルの名前は、通常、プラグインフォルダの名前と同じです。例えば、もしあなたのプラグインフォルダの名前が「my-plugin-folder」であれば、メインファイルの名前も「my-plugin.js」などになります。 my-custom-pluginでは、メインファイルの名前は「main_file.txt」としてもいいでしょう。 my-custom-plugin.phpこのファイルの最上部には、特定の形式に従ったコメントブロックを使用してプラグイン情報を宣言する必要があります。これはWordPressがプラグインを認識し、管理画面のリストに表示するための鍵となります。
以下は、最も基本的なプラグインファイルのヘッダー例です:
<?php
/**
* Plugin Name: 我的自定义功能模块
* Plugin URI: https://example.com/my-custom-plugin
* Description: 这是一个用于演示如何从零开始开发WordPress插件的示例模块。
* Version: 1.0.0
* Author: 你的名字
* Author URI: https://example.com
* License: GPL v2 or later
* Text Domain: my-custom-plugin
* Domain Path: /languages
*/ このコメント内の「Plugin Name」は必須項目ですが、その他のフィールドは任意ですが記入することをお勧めします。「Text Domain」と「Domain Path」はプラグインの国際化(i18n)のために使用され、後で複数の言語に翻訳する準備をするためのものです。
組織用プラグインのファイルとディレクトリ
プラグインの機能が増えるにつれて、すべてのコードをメインファイルにまとめてしまうのは望ましくありません。整理されたプラグイン構造には、通常、複数のサブディレクトリやファイルが含まれます。一般的な構造は以下の通りです:
推薦図書 WordPressプラグイン開発の完全ガイド:ゼロから実際に公開するまでの実践トレーニング。
my-custom-plugin/
├── my-custom-plugin.php # 主插件文件(入口)
├── includes/ # 核心功能类文件目录
│ ├── class-core.php # 核心逻辑类
│ └── class-admin.php # 后台管理逻辑类
├── admin/ # 后台相关文件
│ ├── css/ # 后台样式表
│ ├── js/ # 后台JavaScript
│ └── partials/ # 后台模板片段
├── public/ # 前端相关文件
│ ├── css/
│ ├── js/
│ └── partials/
├── assets/ # 公共资源(如图标、图片)
├── languages/ # 国际化语言包(.po, .mo文件)
└── uninstall.php # 插件卸载清理脚本 はい。 my-custom-plugin.php メインファイルでは、通常直接ビジネスロジックを記述することはありません。代わりに、必要なファイルを含め、コアクラスを初期化する「スターター」として機能します。
// 防止直接文件访问
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
// 定义插件路径常量,方便在其他文件中引用
define( 'MY_PLUGIN_PATH', plugin_dir_path( __FILE__ ) );
define( 'MY_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
// 包含核心类文件
require_once MY_PLUGIN_PATH . 'includes/class-core.php';
require_once MY_PLUGIN_PATH . 'includes/class-admin.php';
// 初始化插件
function my_custom_plugin_init() {
$plugin_core = new My_Plugin_Core();
$plugin_admin = new My_Plugin_Admin();
// 执行初始化操作...
}
add_action( 'plugins_loaded', 'my_custom_plugin_init' ); WordPressコアのリンク:アクションとフィルターフック
WordPressのプラグインシステムが強力な理由は、多数のイベントポイントを提供しているからです。これにより、開発者はコアコードを変更することなく、プラグインの動作を変更したり強化したりすることができます。これらの仕組みが「フック(Hooks)」であり、主に「アクション(Actions)」と「フィルター(Filters)」に分けられます。フックは、プラグインとWordPressコアとの間のやり取りを可能にする橋渡しの役割を果たしています。
アクションフックを理解し、活用する
アクションフックを使用すると、特定のイベントが発生したときにカスタムコードを実行することができます。例えば、記事が公開されたとき、ユーザーがログインしたとき、または管理画面のあるページが読み込まれたときなどです。 add_action() 関数を使用すると、自分の関数をこれらのフックに「マウント」(つまり、フックの処理の流れに組み込む)することができます。
もし記事の下部に自動的に著作権表示を追加したい場合は、以下の方法を利用できます。 the_content このアクションフック(実際にはフィルターですが、使い方はアクションに似ています。古典的な例ではこのように説明されることが多い)のより適切な使用例としては、ユーザーの登録が成功した後に歓迎メールを送信するというものがあります。
// 这是一个动作钩子的使用示例
function my_plugin_send_welcome_email( $user_id ) {
$user = get_userdata( $user_id );
$to = $user->user_email;
$subject = '欢迎加入我们的网站!';
$message = '亲爱的' . $user->display_name . ',感谢您注册!';
wp_mail( $to, $subject, $message );
}
// 将函数挂载到`user_register`这个动作钩子上
add_action( 'user_register', 'my_plugin_send_welcome_email' ); フィルターの使い方をマスターしましょう。
フィルターフックを使用すると、データを変更することができます。WordPressが特定の処理を実行する際に、そのデータが一連のフィルターを通過します。あなたのプラグインでは、これらのデータを取得して変更した後、再びWordPressに返すことができます。 add_filter() 関数を使って実現します。
最も一般的な例は、記事の内容の表示方法を変更することです。例えば、各記事の内容の前に自動的に特徴的な画像をトップ画像として表示するようにすることです。
推薦図書 WordPressプラグイン開発入門ガイド:ゼロから最初のカスタム機能モジュールを構築する。
function my_plugin_prepend_featured_image_to_content( $content ) {
// 只在主循环的单篇文章页面生效
if ( is_single() && in_the_loop() && is_main_query() ) {
$featured_image = get_the_post_thumbnail( null, 'medium', array( 'class' => 'alignleft' ) );
if ( $featured_image ) {
$content = $featured_image . $content;
}
}
return $content;
}
// 将函数挂载到`the_content`这个过滤器钩子上
add_filter( 'the_content', 'my_plugin_prepend_featured_image_to_content' ); プラグイン機能の実装:管理バックエンドとフロントエンドの統合
完全なプラグインには通常、ユーザーとのインタラクションが必要です。つまり、設定を管理するためのインターフェースを作成する必要がありますし、フロントエンドページに新しい機能やコンテンツを追加することもあるでしょう。
バックエンド設定ページを作成します。
プラグインにわかりやすいバックエンド設定ページを提供することは、良いユーザー体験の鍵となります。WordPressには、トップメニューやサブメニューを追加するためのさまざまなAPIが用意されています。このプロセスには通常、2つのステップがあります:メニューアイテムを登録すること、そしてそのメニューアイテムに対応するコールバック関数を定義してページコンテンツを出力することです。
以下は、「設定」メインメニューにサブメニュー項目を追加する例です:
class My_Plugin_Admin {
public function __construct() {
add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );
add_action( 'admin_init', array( $this, 'register_settings' ) );
}
public function add_admin_menu() {
add_options_page(
'我的插件设置', // 页面标题
'我的插件', // 菜单标题
'manage_options', // 所需权限
'my-plugin-settings', // 菜单slug
array( $this, 'render_settings_page' ) // 回调函数
);
}
public function register_settings() {
// 注册一个设置选项
register_setting( 'my_plugin_settings_group', 'my_plugin_option_name' );
// 添加一个设置区块
add_settings_section( 'my_plugin_main_section', '主要设置', null, 'my-plugin-settings' );
// 向区块中添加一个字段
add_settings_field(
'my_plugin_text_field',
'示例文本字段',
array( $this, 'render_text_field' ),
'my-plugin-settings',
'my_plugin_main_section'
);
}
public function render_settings_page() {
?>
<div class="wrap">
<h1>私のプラグイン設定</h1>
<form action="/ja/options.php/" method="post" data-trp-original-action="options.php">
<?php
settings_fields( 'my_plugin_settings_group' );
do_settings_sections( 'my-plugin-settings' );
submit_button();
?>
<input type="hidden" name="trp-form-language" value="ja"/></form>
</div>
<?php
}
public function render_text_field() {
$option = get_option( 'my_plugin_option_name' );
echo '<input type="text" name="my_plugin_option_name" value="' . esc_attr( $option ) . '" />';
}
} 機能をウェブサイトのフロントエンドに出力する。
フロントエンドの機能実現方法は多岐にわたります。ショートコード(Shortcode)、ウィジェット(Widget)、またはAPIを使用して既存の出力を変更する方法などがあります。ショートコードは、ユーザーが記事やページエディタ内で簡単なタグを入力するだけでプラグインの機能を呼び出せる、シンプルで効果的な方法です。
ショートコードを作成するには、以下のツールや方法を使用する必要があります: add_shortcode() 関数:
// 定义一个简单的短代码,用于显示一个问候语
function my_plugin_greeting_shortcode( $atts ) {
// 解析短代码属性
$atts = shortcode_atts( array(
'name' => '访客',
), $atts, 'greeting' );
// 返回输出内容
return '<p class="my-plugin-greeting">こんにちは、' . esc_html($atts['name']) . '!</p>'php
add_shortcode('greeting', 'my_plugin_greeting_shortcode'); ユーザーは記事編集器にテキストを入力するだけです。 [greeting name="张三"]その場合、フロントエンドには「こんにちは、張三!」というテキストが表示されます。
概要
WordPressプラグインの開発とは、独自のアイデアを巨大なエコシステムに組み込むプロセスです。その核心技術は、アクション(action)とフィルターフック(filter hook)の仕組みを理解し、適切に活用することにあります。成功したプラグイン開発は、明確でモジュール化されたファイル構造から始まります。この構造は、後のメンテナンスや拡張を容易にするための堅固な基盤となります。バックエンドで設定ページを作成することで、プラグインはユーザーフレンドリーで設定しやすいものになります。また、ショートコードやツール、カスタムAPIを利用することで、機能をウェブサイトのフロントエンドにシームレスに統合することができます。セキュリティ、国際化の互換性、コードの品質は、開発プロセス全体を通じて常に重視すべきポイントです。WordPressのコーディングスタンダードとベストプラクティスに従うことで、プラグインの安定した動作を保証するだけでなく、エコシステムによりスムーズに統合され、より多くのユーザーにサービスを提供することができます。
FAQ よくある質問
WordPressプラグインを開発するには、どの程度のPHPの知識が必要でしょうか?
簡単なプラグインを開発するには、PHPの基本知識(変数、関数、条件文、ループなど)があれば十分です。しかし、機能が複雑でセキュリティが高く、効率的な商用レベルのプラグインを開発するには、オブジェクト指向プログラミング(OOP)やWordPressのコアAPI(データベース操作関連のクラスなど)についてより深く理解する必要があります。 wpdbHTTPリクエストAPIなどの利用方法、セキュリティのベストプラクティス(データの検証、エスケープ処理、SQLインジェクションやCSRF攻撃の防止など)、そしてフロントエンドでのインタラクションに必要な基本的なJavaScriptおよびCSSの知識です。
まずは既存の小さなプラグインを改良したり、シンプルな機能を構築したりすることから始め、徐々に深く学んでいくことをお勧めします。
如何确保我开发的插件是安全的?
プラグインのセキュリティを確保するには、多層的な対策が必要です。まず、ユーザーや外部からのすべての入力データ(フォームデータ、URLパラメータ、Cookieなど)に対して厳格な検証とクリーニングを行う必要があります。WordPressが提供する関数を活用するとよいでしょう。 sanitize_text_field(), esc_html(), esc_url() と wp_kses() その他
次に、データベース操作を行う際には、必ず以下の点に注意してください: $wpdb クラスが提供するメソッド(例えば) prepare() SQLインジェクションを防ぐために、適切な処理(例えばエスケープ処理)を行う必要があります。フロントエンドにデータを出力する際には、必ず適切にエスケープ処理を施さなければなりません。権限に関わる操作については、常に権限チェック関数などを使用してください。 current_user_can()さらに、リクエストの意図を検証するためにCE(nonce)ではなく別の値を使用することで、クロスサイトリクエストフォージング(CSRF)を防ぐことができます。
プラグインの開発が完了したら、どのようにして配布し、更新するのでしょうか?
配布には主に2つの方法があります。1つはWordPressの公式プラグインディレクトリを通じて、もう1つは自分のウェブサイト上で直接ダウンロードを提供する方法です。プラグインをユーザーの管理画面からワンクリックでインストールでき、自動更新を受け取れるようにしたい場合は、公式ディレクトリに提出する必要があります。これには、プラグインのコードがGPLv2(またはそれ以上のバージョン)のライセンスに準拠していること、そして厳格なセキュリティおよびコード品質の審査を通過していることが求められます。
送信した後、WordPressは公式のSubversion(SVN)リポジトリからあなたのプラグインのコードを読み取ります。SVNリポジトリ内のメインファイルのヘッダーにあるコメント内の「Version」番号を更新し、バージョン番号を含む新しいタグ(Tag)を送信することで、更新通知をトリガーする必要があります。
商業用のプラグインについては、通常、自社のサーバー上で更新サービスを構築します。これには、更新チェッカーを作成することが含まれ、フック(hook)などを利用して… pre_set_site_transient_update_pluginsWordPressの更新システムと統合し、リモートサーバー上のバージョン情報を比較し、更新パッケージを提供します。
プラグイン内のクラス名や関数名が他のプラグインと衝突するのを避けるにはどうすればよいでしょうか?
命名衝突を避けることは、プロフェッショナルなプラグイン開発における基本的要求です。最善の実践方法としては、プレフィックスの使用が挙げられます。プラグイン内のすべてのクラス、関数、定数、さらにはグローバル変数(できるだけ使用しないようにしてください)に対して、一意で説明的なプレフィックスを付けましょう。このプレフィックスは、通常、会社名やプラグイン名の略称、または完全な名称になります。
例えば、もしあなたのプラグインの名前が「Awesome Gallery」だとしたら、関数の前缀(接頭辞)としては以下のようなものが考えられます: ag_ または awesome_gallery_クラス名は以下のようなものにすることができます: AG_Core または Awesome_Gallery_Admin。
より良い方法は、コードをクラス内に封じ込めることです。そうすることで、ほとんどの関数がクラスメソッドとして存在するようになります。 $this->method()これにより、グローバル名前空間の汚染を避けることができます。グローバル空間で定義する必要がある関数については、必ず長くてユニークな接頭辞を使用してください。
次はどうする?
拡大読書と実践的知識
以下は、この記事のトピックに関連しており、さらに深く読むのに適している。あなたの現在の問題に最も近い記事から優先順位をつけ、徐々に周辺のトピックに広げていく方が良い場合が多い。