WordPressプラグインの基本構成
標準的なWordPressプラグインの核心となるのは、以下の場所にあるコードです: /wp-content/plugins/ ディレクトリ内にある独立したフォルダです。このフォルダには、少なくとも1つのメインのPHPファイルが含まれていなければなりません。そのPHPファイルのヘッダーにはプラグインのメタ情報が記載されており、これがWordPressがプラグインを認識するための基礎となります。
プラグインのヘッダーコメントは非常に重要です。これは特定の形式を使用して、WordPressシステムにプラグインの名前、説明、バージョン、作者などの情報を宣言します。典型的なプラグインヘッダーコメントの例は以下の通りです:
<?php
/**
* Plugin Name: 我的第一个插件
* Plugin URI: https://example.com/my-first-plugin
* Description: 这是一个用于演示的 WordPress 插件。
* Version: 1.0.0
* Author: 开发者名称
* Author URI: https://example.com
* License: GPL v2 or later
* Text Domain: my-first-plugin
*/ このコードはプラグインのメインファイルの冒頭に配置する必要があります。Plugin Name これらは必須項目であり、その他の項目はすべてオプションです。WordPressがプラグインのディレクトリをスキャンする際には、これらの情報を読み取ることで、バックエンドの管理インターフェースにプラグインの一覧を表示します。
推薦図書 WordPressプラグイン開発入門から上級者へ:初めてのカスタムプラグインの作成方法を手取り足取り教えます。
メインファイルに加えて、機能が充実したプラグインには通常、JavaScriptやCSSのリソースを格納するためのファイルやディレクトリなどが含まれています。 assets フォルダー、翻訳用のものです。 languages フォルダーは、クラスファイルを格納するためのものです。 includes フォルダーや、フロントエンドで表示するためのテンプレートファイルなどです。適切なディレクトリ構造は、プラグインのメンテナビリティ(保守性)と拡張性の基盤となります。
WordPressのコアメカニズムを理解する:フック(Hooks)
WordPressプラグイン開発の核心的な哲学は「フックとコールバック」です。フックにより、開発者はWordPressのコアコードが実行される特定のタイミングで自分のカスタムコードを実行することができ、これによりデフォルトの機能を変更したり拡張したりすることができます。ただし、コアファイルを直接変更する必要はありません。この仕組みにより、WordPressコアの純粋性が保たれ、プラグインの更新時にも安全性が確保されます。
フックには主に2つのタイプがあります:アクションフックとフィルターフックです。
アクションフックの使用方法
アクションフックは、記事の投稿、管理ページの読み込み、ユーザーのログインなど、特定のイベントが発生したときに実行されます。これらのフックは何らかの値を返すことを想定していません。主に何らかの操作を実行するために使用されます。開発者はこれらを活用しています。 add_action() この関数は、カスタム関数(コールバック関数)を指定されたアクションフックにマウントします。
例えば、すべての記事の内容の末尾に自動的に著作権表示を追加したい場合は、それを実現するための機能を利用することができます。 the_content このアクションフック(通常はフィルターとして使用されますが、ここではアクションの概念を説明するために使用しています)。より典型的な例としては、WordPressが初期化される際に何らかの処理を実行する場合があります。
推薦図書 ワードプレスのプラグイン開発を初心者から上級者まで学ぶ。自分だけの機能を作る方法を一通り説明します。
function myplugin_setup() {
// 初始化插件,例如创建数据库表
}
add_action( 'init', 'myplugin_setup' ); 上記のコードは、WordPressが以下の処理を実行する際に発生することを示しています: init このアクションを実行すると、私たちが定義したものも同時に実行されます。 myplugin_setup 関数。
フィルターフックの使用方法
フィルターフックはデータを変更するために使用されます。これらは1つの変数を受け取り、変更後の変数を返します。開発者はこれを利用します。 add_filter() この関数を使用すると、カスタムのフィルタリング関数をマウント(適用)することができます。これは、記事の内容、タイトル、リンクなどのデータを変更するために最もよく使われる方法です。
上記の例に倣い、記事内容に著作権情報を追加するには、より正確な方法として以下のように行います: the_content フィルター:
function myplugin_add_copyright( $content ) {
if ( is_single() ) {
$content .= '<p>この記事の著作権は当サイトに帰属しています。転載する場合は出典を明記してください。</p>';
}
return $content;
}
add_filter( 'the_content', 'myplugin_add_copyright' ); この例では、関数 myplugin_add_copyright 元のデータを受け取ります。 $content 変数の後にHTMLテキストが追加され、その修正後の内容が返されます。WordPressはこの返された値を元の内容の代わりに使用して出力します。
プラグイン管理ページを作成します。
多くのプラグインでは、WordPressの管理画面で設定オプションを提供する必要があります。そのためには、管理ページを作成する必要があります。WordPressには、トップメニューやサブメニューアイテムを追加するための一連の関数が用意されています。
トップメニューアイテムを追加します。
利用する add_menu_page() この関数は、プラグイン用に独立したバックグラウンドトップメニューを作成することができます。この関数には複数のパラメータが必要で、ページタイトル、メニュータイトル、権限、メニューアリアス、コールバック関数などが含まれます。
推薦図書 WordPressプラグイン開発入門ガイド:最初の機能拡張をゼロから構築する。
以下は、シンプルなトップレベルの管理ページを作成するためのサンプルコードです:
function myplugin_add_admin_menu() {
add_menu_page(
'我的插件设置', // 页面标题
'我的插件', // 菜单标题
'manage_options', // 所需权限(管理员)
'myplugin-settings', // 菜单别名(URL中的slug)
'myplugin_settings_page', // 用于输出页面内容的回调函数
'dashicons-admin-generic', // 图标(使用Dashicons)
80 // 菜单位置
);
}
add_action( 'admin_menu', 'myplugin_add_admin_menu' );
// 定义输出页面内容的回调函数
function myplugin_settings_page() {
?>
<div class="wrap">
<h1>私のプラグイン設定</h1>
<form method="post" action="/ja/options.php/" data-trp-original-action="options.php">
<?php
settings_fields( 'myplugin_settings_group' );
do_settings_sections( 'myplugin-settings' );
submit_button();
?>
<input type="hidden" name="trp-form-language" value="ja"/></form>
</div>
あなたのアカウントは有効です。あなたはログインしています。 このコードはまず、以下の手順で処理を開始します: add_action メニューを追加する関数をマウントするには… admin_menu フックです。バックエンドでメニューが読み込まれると、このフックが実行されます。 myplugin_add_admin_menu新しいトップメニュー「私のプラグイン」を登録します。このメニューをクリックすると、WordPressが関連する処理を実行します。 myplugin_settings_page 関数を使ってページの内容をレンダリングします。
フィールドとオプションの保存設定
単にページの枠組みだけでは不十分です。ページ上にフォームフィールドを作成し、ユーザーが入力したデータを安全に保存する必要があります。WordPressのSettings APIはまさにこのために設計されており、データの検証、保存、およびセキュリティトークン(nonce)の処理を自動化してくれます。
まず、設定オプションを1つ登録し、設定ブロックを1つ作成し、さらに具体的なフィールドも設定する必要があります。
function myplugin_settings_init() {
// 1. 注册一个设置选项到数据库
register_setting( 'myplugin_settings_group', 'myplugin_options' );
// 2. 在页面内添加一个设置区块
add_settings_section(
'myplugin_section_main',
'主要设置',
null,
'myplugin-settings'
);
// 3. 在区块内添加一个具体的字段
add_settings_field(
'myplugin_field_text',
'示例文本输入',
'myplugin_field_text_render', // 渲染字段HTML的回调函数
'myplugin-settings',
'myplugin_section_main'
);
}
add_action( 'admin_init', 'myplugin_settings_init' );
// 定义字段的HTML输出
function myplugin_field_text_render() {
$options = get_option( 'myplugin_options' );
$value = $options['text_field'] ?? '';
?>
<input type='text' name='myplugin_options[text_field]' value='<?php echo esc_attr( $value ); ?>'>
<?php
} このAPIを使用すると、フォームが送信された後、データは自動的に保存されます。 wp_options 表内の名称は「%s」です。 myplugin_options その記録の中には(シリアライズされた配列として)データが格納されています。開発者はこれを利用することができます。 get_option( ‘myplugin_options’ ) これらの値を、フロントエンドでもバックエンドでも、安全に取得する必要があります。
プラグインのセキュリティとベストプラクティス
人気のあるプラグインを開発するには、セキュリティとコード品質を軽視してはなりません。ベストプラクティスに従うことで、よくある脆弱性を最大限に防ぎ、ユーザー体験を向上させることができます。
データ検証、エスケープ処理、およびクリーニング
ユーザーや外部からのすべてのデータは信頼できないものです。データをブラウザ(フロントエンド)に出力する際には、クロスサイトスクリプト攻撃を防ぐためにエスケープ処理を行う必要があります。また、データをデータベース(バックエンド)に保存する際には、クリーニングと検証を行う必要があります。
WordPressには多数の補助関数が用意されています。HTMLに出力する内容に関しては、これらの関数を利用すると便利です。 esc_html(), esc_attr(), esc_url() などの関数です。JavaScriptの変数に出力する場合には、以下のように使用します: wp_json_encode()データベース操作においては、常に以下のことを守るべきです: $wpdb->prepare() パラメータ化クエリを実行するか、または以下のような方法を使用します: sanitize_text_field(), intval() などの関数が入力データをクリーニングします。
// 不安全的做法
echo $_GET['user_input'];
// 安全的做法:输出到HTML内容
echo esc_html( $_GET['user_input'] );
// 安全的做法:用于HTML属性
$url = esc_url( $_GET['url'] );
echo "<a href='/ja/$url/'>リンク</a>";
// 安全的做法:清理后存入数据库
$clean_title = sanitize_text_field( $_POST['title'] );
update_post_meta( $post_id, ‘title’, $clean_title ); 国際化(Internationalization)とローカライゼーション(Localization)の準備
プラグインを世界中のユーザーが利用できるようにするためには、国際化(インターナショナライゼーション)の準備をしっかり行う必要があります。これは、ユーザーに表示されるすべてのテキストがコード内にハードコードされてはならず、翻訳機能を使って処理されるべきだということを意味します。
WordPressはGNU gettextフレームワークを使用しています。コード内では、このフレームワークが活用されています。 __() 请将以下文本翻译成日语,并返回相应的字符串。使用指定的翻译方法(例如:“使用……方法”)。 _e() 来翻译并直接输出字符串。同时,需要在插件头部注释中定义 Text Domainそして、プラグインが読み込まれる際にそれを使用します。 load_plugin_textdomain() 翻訳ファイルを読み込むための関数です。
// 定义可翻译的字符串
$greeting = __( ‘Hello, World!', ‘my-first-plugin’ );
_e( ‘Settings saved successfully!', ‘my-first-plugin’ );
// 在插件初始化时加载翻译
function myplugin_load_textdomain() {
load_plugin_textdomain( ‘my-first-plugin’, false, dirname( plugin_basename( __FILE__ ) ) . ‘/languages/’ );
}
add_action( ‘init’, ‘myplugin_load_textdomain’ ); 開発者はPoeditのようなツールを利用してコードを生成する必要があります。 .pot テンプレートファイルは、翻訳者が異なる言語のテキストを作成するために使用されます。 .po そしてコンパイル後の .mo ファイルです。準備された言語ファイルは、プラグインの指定された場所に置く必要があります。 /languages/ ディレクトリ内にあります。これはプラグインが国際市場に進出するための重要な一歩です。
概要
WordPressプラグインの開発とは、アイデアを実際の機能に変えていくプロセスです。その核心は、フックシステムを理解し、熟知することにあります。まず、正しいヘッダーコメントを含むメインファイルを作成し、アクションフックを使って処理の流れに介入し、フィルターフックを使ってデータの出力を変更します。WordPressが提供するSettings APIを利用することで、安全かつ標準的なバックエンド管理インターフェースを作成することができます。そして、セキュリティガイドライン(検証、エスケープ処理、クリーニング)や国際化の規格を厳守することが、プラグインが成熟し、安定して広く利用されるための必要条件です。優れたプラグインとは、機能が強力であるだけでなく、安全で効率的であり、世界中のユーザーにとって使いやすいものです。
FAQ よくある質問
プラグインには、少なくともいくつのファイルが必要ですか?
プラグインを作成するには、少なくとも1つのPHPファイルが必要です。そのファイルにWordPressプラグイン用のヘッダーコメントが正しく記述されており、適切な場所に配置されていればよいのです。 /wp-content/plugins/ ディレクトリ内(直接配置してもよいし、サブフォルダ内に配置してもよい)に置くと、WordPressがそれを認識して有効にします。
私のプラグインコードのデバッグ方法は何ですか?
開発環境では、以下のことをお勧めします: wp-config.php このファイル内でWordPressのデバッグモードを有効にします。 WP_DEBUG 定数は次のように設定されています。 trueまた、設定を行うこともできます。 WP_DEBUG_LOG ために trueエラー情報を以下の場所に記録してください: /wp-content/debug.log ファイルはページ上に直接表示されないようにしてください。また、ブラウザの開発者ツールを使用してコンソールやネットワークリクエストを確認することも非常に重要です。
プラグインのオプションはどこにあるべきでしょうか?
シンプルなキー値ペアの設定については、WordPressのOptions APIを使用することを強くお勧めします。 add_option(), update_option(), get_option() 関数による処理が行われた後、データは安全に保存されます。 wp_options データベースのテーブル内です。大量の構造化データについては、カスタムのデータベーステーブルを作成することも考えられますが、これにはより複雑なライフサイクル管理(インストール時に作成し、アンインストール時に削除する)が必要になります。
どうすれば私のプラグインをより多くのWordPressバージョンで動作させることができるでしょうか?
開発時には、あまりにも新しすぎてWordPressの高バージョンでのみサポートされている関数の使用は避けましょう。使用したいような新しい関数がある場合は、実際に使用する前によく検討し、その関数が必要なシナリオが本当にあるかを確認してください。 function_exists() 検査を行い、エレガントなデグレード(代替)案を提供します。プラグインに関しては… readme.txt ファイルの中で、テストに合格したWordPressの最低バージョンが明確に記載されています。異なるバージョンのWordPressで定期的にテストを行うことは、互換性を確保するための最善の方法です。
次はどうする?
拡大読書と実践的知識
以下は、この記事のトピックに関連しており、さらに深く読むのに適している。あなたの現在の問題に最も近い記事から優先順位をつけ、徐々に周辺のトピックに広げていく方が良い場合が多い。