WordPressプラグインの基礎と開発環境
WordPressプラグインを開発するには、まずその仕組みを理解することが必要です。プラグインとは、本質的には1つまたは複数のPHPファイルで構成され、特定の形式のヘッダーコメントを含んでおり、それによってWordPressに自分自身を認識させます。プラグインは、WordPressが提供する豊富なAPI(アクションフック、フィルター、データベース関数など)を利用して、コアコードを変更することなく、WordPressの機能を拡張したり修正したりすることができます。
開発を始めるには、ローカル開発環境が必要です。これには通常、ローカルサーバー(XAMPP、MAMP、またはLocal by Flywheelなど)、PHP(WordPressの要件に合ったバージョン)、MySQLデータベース、そしてコードエディタ(VS Code、PhpStormなど)が含まれます。オンラインサイトに影響を与えないように、できるだけローカル環境で開発とデバッグを行うことを強くお勧めします。
プラグインの基本的なファイル構造
最もシンプルなプラグインは、1つのファイルだけで構成されることもあります。しかし、コードの可読性と保守性を高めるためには、ある程度の構造に従うことをお勧めします。典型的なプラグインディレクトリには、以下のようなファイルが含まれることがあります:your-plugin-name.php)、一つincludesフォルダ(コア機能や関数を格納するためのもの)、1つadminフォルダ(バックエンド関連のコードを保存するためのもの)、1つpublicフォルダ(フロントエンド関連のコードを保存するためのもの)、1つassetsJavaScript、CSS、画像を格納するフォルダーのほか、オプションとして言語パックやテンプレートフォルダーも含まれます。
推薦図書 WordPressプラグイン開発の完全ガイド:ゼロから上級実践までのチュートリアル。
メインプラグインファイルはプラグインのエントリーポイントであり、そのヘッダー部分にあるコメントは非常に重要です。WordPressはこれらのコメントを読み取ることで、管理画面にプラグインの情報を表示します。
あなたの最初のプラグインを作成する。
まずは古典的な「Hello World」の例から始めましょう。これにより、プラグインの作成における基本的な流れや規範に慣れることができます。
メインプラグインファイルを作成する
まず、WordPressのインストールディレクトリの下にあるwp-content/pluginsフォルダ内で新しいフォルダを作成してください。例えば、my-first-pluginそのフォルダ内に、PHPファイルを作成してください。ファイル名は「example.php」としてください。my-first-plugin.php。
このファイルを開いて、以下のコードを入力してください。冒頭のプラグイン情報ブロック(Plugin Header)は必須であり、これによってWordPressにこのファイルがプラグインであることが伝えられます。
<?php
/**
* Plugin Name: 我的第一个插件
* Plugin URI: https://example.com/my-first-plugin
* Description: 这是一个学习插件开发的示例插件,它将在文章内容顶部显示“Hello World!”。
* Version: 1.0.0
* Author: 你的名字
* Author URI: https://example.com
* License: GPL v2 or later
* Text Domain: my-first-plugin
* Domain Path: /languages
*/
// 防止直接访问文件
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* 在文章内容前添加“Hello World”
*
* @param string $content 原始文章内容。
* @return string 修改后的文章内容。
*/
function mfp_add_hello_world( $content ) {
if ( is_single() && in_the_loop() && is_main_query() ) {
$custom_text = '<p style="background-color:#f0f0f0; padding:10px;"><strong>こんにちは、World!これが私の最初のプラグインです。</strong></p>';
return $custom_text . $content;
}
return $content;
}
add_filter( 'the_content', 'mfp_add_hello_world' ); ファイルを保存した後、WordPressの管理画面にログインし、「プラグイン」ページに移動してください。そこでは「My First Plugin」というプラグインがプラグインリストに表示されているはずです。それを有効にしてから、ウェブサイトの記事を開いてみてください。すると、「Hello World!」というテキストが記事の冒頭に追加されているはずです。
推薦図書 WordPressプラグイン開発の基礎から応用まで、手取り足取り教えます。。
コード内の重要な要素を理解すること
このコードは、WordPress開発の核心概念である「フィルター(Filter)」を示しています。私たちはある関数を定義しました。mfp_add_hello_worldそれは記事の内容を受け取ります。$contentこれをパラメータとして受け取り、修正後の内容を返します。その後、私たちはそれを使用します。add_filter()この関数は、このカスタム関数をWordPressコアにマウントします。the_contentこのフィルターは「フック」に設定されています。WordPressが実行される際に…the_content()その時、このフックにマウントされているすべての関数が順番に実行されるため、出力を変更することができます。
コード内の条件判断is_single() && in_the_loop() && is_main_query()これは、私たちの変更がメインクエリ内の単一の記事にのみ適用され、記事一覧ページや他の場所に影響を与えないようにするためのものです。これは、効率的で副作用のないプラグインを作成する上で重要な慣行です。
プラグインのコア開発技術
機能豊富なプロフェッショナルなプラグインを開発するには、WordPressが提供するいくつかのコアAPIをマスターする必要があります。
アクションフックとフィルターフックの使用
フック(Hooks)はWordPressのプラグインアーキテクチャの基盤となる要素です。フックには2種類あります:アクション(Action)とフィルター(Filter)です。アクションフックは、記事の投稿や管理画面の読み込みなど、特定の実行ポイントでトリガーされ、コードを実行することができます。一方、フィルターフックを使用すると、記事の内容やタイトルなどのデータを変更した後に、それをWordPressが使用できるようになります。
利用するadd_action()マウント処理についてです。例えば、プラグインが有効になったときにデータベーステーブルを作成するというのはよくある要求です。
function mfp_create_custom_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'my_custom_data';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
data varchar(255) NOT NULL,
created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
register_activation_hook( __FILE__, 'mfp_create_custom_table' ); ここでは「%s」が使用されています。register_activation_hookこれは特別な登録関数で、プラグインがアクティブになったときに実行されるアクションを指定するために使用されます。
推薦図書 ゼロから始める:なぜWordPressプラグイン開発を選ぶのか。
管理メニューと設定ページの作成
プラグインにバックエンド設定ページを用意することは、プロフェッショナルなプラグインの証です。WordPressのSettings APIを使用することで、安全かつ規格に則ったオプションページを作成することができます。
以下のコードは、「設定」メインメニューにサブメニューページを追加する方法を示しています:
// 在管理后台初始化时添加菜单
add_action( 'admin_menu', 'mfp_add_admin_menu' );
function mfp_add_admin_menu() {
add_options_page(
'我的插件设置', // 页面标题
'我的插件', // 菜单标题
'manage_options', // 所需权限
'my-plugin-settings', // 菜单slug
'mfp_render_settings_page' // 用于渲染页面的回调函数
);
}
function mfp_render_settings_page() {
?>
<div class="wrap">
<h1></h1>
<form action="/ja/options.php/" method="post" data-trp-original-action="options.php">
<?php
settings_fields( 'mfp_settings_group' ); // 输出安全字段
do_settings_sections( 'my-plugin-settings' ); // 输出设置区域
submit_button( '保存设置' );
?>
<input type="hidden" name="trp-form-language" value="ja"/></form>
</div>
<?php
}
// 初始化设置
add_action( 'admin_init', 'mfp_settings_init' );
function mfp_settings_init() {
register_setting( 'mfp_settings_group', 'mfp_options' ); // 注册一个设置选项组
add_settings_section(
'mfp_section_basic',
'基本设置',
null,
'my-plugin-settings'
);
add_settings_field(
'mfp_field_text',
'示例文本框',
'mfp_field_text_render',
'my-plugin-settings',
'mfp_section_basic'
);
}
function mfp_field_text_render() {
$options = get_option( 'mfp_options' );
?>
<input type='text' name='mfp_options[text_field]' value='<?php echo esc_attr( $options['text_field'] ?? '' ); ?>'>
<p class="description">これは例となるテキストボックスです。</p>
あなたのアカウントは有効です。あなたはログインしています。 プラグインのセキュリティ、国際化、リリース準備
開発が完了したプラグインは、セキュリティ強化や国際化対応を行い、適切にパッケージ化された上で、一般ユーザーに公開する必要があります。
データ検証、エスケープ処理、およびセキュリティ
ユーザーが入力したデータや外部からのデータを絶対に信じてはいけません。すべてのデータについては、入力時や取得時に慎重に検証を行う必要があります。$_GET、$_POST、$_REQUESTデータベースから取得したデータも、使用する前に必ず検証(Validation)とエスケープ処理(Escaping)を行う必要があります。
- 検証:データが期待される形式(メールアドレス、数字など)に合致しているかを確認します。関連する関数を使用してください。
is_email()、intval()、sanitize_text_field()。 - エスケープ処理:データをHTML、JavaScript、またはURLに出力する際には、特殊な文字が正しく処理されていることを確認し、XSS攻撃を防ぎましょう。そのためには、以下のような関数を使用するとよいでしょう。
esc_html()、esc_js()、esc_url()、wp_kses_post()。
SQLクエリでは、必ず以下の要素を使用する必要があります:$wpdb->prepare()SQLインジェクションを防ぐために、メソッドを使用してパラメータを適切に準備する必要があります。
プラグインの国際化を実現する
国際化(i18n)により、あなたのプラグインを他の言語に翻訳することが可能になります。これには2つのステップが必要です:翻訳可能な文字列をマークすること、およびテキストデータを読み込むことです。
まず、メインプラグインファイルのヘッダー部分にすでに定義がされています。Text DomainとDomain Pathその後、プラグイン内で翻訳が必要なすべての文字列について、翻訳関数を適用してください。例えば:__('Hello World', 'my-first-plugin')PHPで翻訳結果を表示するために使用されます。esc_html_e('Settings', 'my-first-plugin')エスケープ処理を行い、その内容をそのまま表示するために使用されます。
プラグインが初期化される際に(例えば、使用される際に)initアクション)には、翻訳ファイルの読み込みが必要です:
function mfp_load_textdomain() {
load_plugin_textdomain( 'my-first-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
}
add_action( 'init', 'mfp_load_textdomain' ); その後、Poeditのようなツールを使用して作成することができます。.potテンプレートファイル:翻訳者が使用するためのものです。.po/.mo言語ファイル。
最終チェックとパッケージング
公開する前に、以下のチェックを行ってください:
1. このコードはWordPressのコーディング基準に準拠しています。
2. すべての機能は十分にテストされており、アクティベート(有効化)、ディアクティベート(無効化)、アンインストール(削除)の操作も含まれます。register_uninstall_hook(データのクリーニングを行います。)
3. すべてのデバッグコードおよび一時的な出力が削除されました。
4. 詳細な内容が作成されました。readme.txtファイルの形式はWordPressの公式要件に準拠していなければなりません。そのファイルはプラグインディレクトリのページに表示されます。
5. プラグインのディレクトリ名およびメインファイルの名前は一意であることを確認し、他のプラグインとの衝突を避けてください。
最後に、プラグインのフォルダー全体をZIPファイルに圧縮します。これでWordPressの管理画面から直接アップロードしてインストールするか、WordPressの公式プラグインディレクトリにアップロードすることができます。
概要
WordPressプラグインの開発とは、アイデアを実際の機能に変えるプロセスであり、その基盤となるのはWordPressのコアアーキテクチャ(特にフックAPI)に対する深い理解です。まずはシンプルな「Hello World」プラグインの作成から始め、徐々に管理インターフェースの構築方法、データの安全な処理方法、データベースとのやり取りの方法を学び、最終的には国際化(多言語対応)を実現していきます。これがすべてのプラグイン開発者の成長の道です。セキュアなコーディング規格の遵守やSettings APIなどの標準的なインターフェースの使用は、プラグインの品質、互換性、安全性を保証するための鍵となります。継続的な実践とコアコードや他の優れたプラグインの参考を通じて、プロフェッショナルで信頼性が高く、ユーザーに愛されるWordPress拡張機能を作り上げることができるでしょう。
FAQ よくある質問
WordPressプラグインを開発するには、どのような前提知識が必要ですか?
PHPの基本的なプログラミング知識が必要であり、HTML、CSS、JavaScriptにも精通している必要があります。WordPressの基本的な操作に慣れていることが望ましく、記事やページ、メニューの管理などができることが求められます。また、記事タイプ、カテゴリ、メタデータといったWordPressのコアコンセプトについても理解していると開発に役立ちます。MySQLデータベースについての基本的な知識もあるとよいでしょう。
私のWordPressプラグインをどのようにデバッグすればいいのでしょうか?
まず、確認してください。wp-config.phpファイルを開くWP_DEBUGとWP_DEBUG_LOGこのようにすると、エラーメッセージはログファイルに記録され、訪問者に直接表示されることはありません。次に、以下の方法を利用することができます:error_log()この関数は、カスタムのデバッグ情報をログに書き出します。複雑なロジックについては、Xdebugのような専門的なデバッグツールをIDE(例:PhpStorm)と組み合わせて使用することが最も効率的な方法です。
私のプラグインは、どのようにして第三者サービス(例えばAPI)と通信するのでしょうか?
WordPressは強力なHTTP APIを提供しています(例えば:wp_remote_get()、wp_remote_post())このライブラリはHTTPリクエストを処理するために使用され、ネイティブのPHP関数よりも優れています。file_get_contents()また、cURLの方がより安全で互換性も高い場合があります。これらの関数を使用する際には、発生しうるエラーに対処し、適切なタイムアウト設定を行うことを忘れないでください。頻繁に呼び出されるAPIについては、パフォーマンスを向上させるために「トランジエント(Transient)API」を使用してキャッシングを行うことを検討してください。
プラグイン内のクラスや関数の名前は、どのように命名すれば衝突を避けることができるでしょうか?
他のプラグインやテーマの関数名、クラス名と衝突を避けるためには、一意の接頭辞を使用する必要があります。一般的には、プラグインの略称や正式名称を接頭辞として使用することが推奨されます。例えば、あなたのプラグインの名前が「Super Tool」であれば、関数名は次のようになります:stool_save_data()クラス名は、次のように表記することができます:Super_Tool_Adminもう一つの、より現代的で安全な方法としてはPHPの名前空間(Namespaces)の使用があります。これには、プラグインが動作する環境がPHP 5.3以降をサポートしている必要があります。
次はどうする?
拡大読書と実践的知識
以下は、この記事のトピックに関連しており、さらに深く読むのに適している。あなたの現在の問題に最も近い記事から優先順位をつけ、徐々に周辺のトピックに広げていく方が良い場合が多い。