WordPressプラグイン開発の概要
WordPressプラグインとは、WordPressのコア機能を拡張し強化するためのPHPスクリプトの集合です。開発者は、WordPressのコアコードを変更することなく、新しい機能やツール、管理パネルを追加したり、既存の動作を変更したりすることができます。プラグインは、1つのファイルだけで構成されている簡単なものから、複数のディレクトリやさまざまな種類のファイルを含む複雑なものまであります。
プラグインの核心を理解するためには、その「エントリーファイル」を把握することが重要です。すべてのプラグインは少なくとも1つのメインPHPファイルを含まなければならず、そのファイルの冒頭には標準的なプラグインメタ情報を記述する必要があります。これらの情報はWordPressのプラグインマネージャーによって読み取られ、管理画面のプラグイン一覧に表示されます。
あなたの最初のプラグインを作成する
基本ファイル構造を作成する
まず、プラグインのエントリーファイルを作成する必要があります。WordPressのインストールディレクトリ内にある…wp-content/plugins/フォルダ内で、新しいフォルダを作成してください。例えば、my-first-pluginそのフォルダ内に、メインのPHPファイルを作成してください。ファイル名は通常、フォルダ名と同じになります。例えば:my-first-plugin.php。
推薦図書 从零开始:创建你的第一个WordPress插件。
プラグインのヘッダー情報を作成する
このメインファイルには、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
*/ このコメントには、プラグインの基本情報が記載されています。このファイルを保存すると、WordPressの管理画面(バックエンド)の「プラグイン」ページでそのプラグインを確認することができるようになります。
シンプルな機能を実装する
次に、このプラグインに最もシンプルな機能を追加しましょう:すべての記事の内容の上部にカスタムのテキストを表示する機能です。これを実現するために、以下の方法を使用できます:the_contentこのフィルターフック(Filter Hook)を使用して実現されています。
function myplugin_add_text_to_content( $content ) {
$custom_text = '<p>この文章は、私が最初に作成したプラグインに追加された挨拶文です!</p>';
return $custom_text . $content;
}
add_filter( 'the_content', 'myplugin_add_text_to_content' ); このコードをあなたのメインプラグインファイルに追加してください。my-first-plugin.phpその中で、プラグインを保存して有効にします。これで、ウェブサイト上のどの投稿やページを閲覧しても、指定されたテキストがコンテンツの最前面に表示されるようになります。これがプラグインの最も基本的な機能です。
プラグイン開発の核心概念とAPI
フックメカニズムを理解する。
フックはWordPressプラグイン開発の核心であり、あなたのコードをWordPressのコアや他のプラグインの実行フローに「組み込む」ことを可能にします。フックには主に2種類あります:アクション(Action)とフィルター(Filter)です。
推薦図書 WordPressプラグイン開発のゼロからの学習方法:完全ガイドと実践トレーニング。
これは、特定の時間点でユーザー定義のコードを実行するためのものです。例えば、wp_footerこの機能により、ページの下部にHTMLやスクリプトを出力することができます。ご自由にご利用ください。add_action()関数を使用してアクションをマウントします。
フィルターは、データベースやブラウザに送信される前のデータを変更するために使用されます。例えば、上記の例で使用されたように…the_contentこのフィルターを使用すると、記事の内容を変更することができます。add_filter()関数を使用してフィルターを追加し、コールバック関数は修正後の値を返す必要があります。
Core database classes are used.
WordPressは強力なデータベース抽象クラスを提供しています。wpdbこれはデータベースと安全にやり取りするために使用されます。PHPのMySQL関数を直接呼び出すのではなく、このグローバルオブジェクトを直接使用するべきです。
例えば、データベース内の特定の情報を検索したい場合は、次のように行うことができます:
global $wpdb;
$results = $wpdb->get_results( "SELECT id, name FROM {$wpdb->prefix}my_custom_table" ); 使用には注意してください。$wpdb->prefix表のプレフィックスが正しいかを確認してください。挿入、更新、削除の操作を行う際には、必ず正しいプレフィックスを使用してください。wpdb提供されたものは…insert()、update()これらの方法により、データのエスケープ処理が自動的に行われ、SQLインジェクション攻撃を防ぐことができます。
管理設定ページを作成する。
プラグインにバックエンド設定ページを用意することは、プロフェッショナルなプラグインとしての基本的な要件です。WordPressには、さまざまなレベルのメニューアイテムやページを追加するための多くのAPI関数が用意されており、その中でも最もよく使用されるのは…add_menu_page() と add_options_page()。
推薦図書 WooCommerce実践ガイド:ゼロからプロフェッショナルなeコマースサイトの構築。
以下は、トップメニューと簡単な設定ページを追加した例です:
function myplugin_add_admin_menu() {
add_menu_page(
'我的插件设置', // 页面标题
'我的插件', // 菜单标题
'manage_options', // 所需权限
'myplugin-settings', // 菜单Slug
'myplugin_settings_page', // 回调函数,用于输出页面HTML
'dashicons-admin-generic', // 图标
6 // 菜单位置
);
}
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>
あなたのアカウントは有効です。あなたはログインしています。 この例では、「私のプラグイン」という名前のトップメニューが作成されます。このメニューをクリックすると、その下にあるコンテンツにアクセスできます。myplugin_settings_page関数によってレンダリングされるページです。通常、WordPressのSettings APIを併用して使用します。register_setting, add_settings_section, add_settings_fieldこれにより、設定項目を安全に処理し、保存することができます。
プロジェクト実践:メモ管理プラグインの開発
このセクションでは、上述の知識を総合的に活用して、記事編集ページで使用できるシンプルな「メモ」機能を作成します。このプラグインにより、編集者は記事にプライベートな内部メモを追加することができます。
カスタムデータベーステーブルの作成
まず、プラグインが有効になると、メモを保存するための新しいデータベーステーブルを作成する必要があります。これは、アクティベーションフックを登録することで実現できます。register_activation_hookそれを実現するために。
function my_note_plugin_activate() {
global $wpdb;
$table_name = $wpdb->prefix . 'post_notes';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
post_id bigint(20) NOT NULL,
note_content text NOT NULL,
created_by bigint(20) 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__, 'my_note_plugin_activate' ); ここでは、を使用します。dbDelta()関数を使用してテーブル構造を作成または更新することができます。これは安全で互換性の高い方法です。
記事編集画面にメタボックスを追加する
次に、記事編集ページにメタボックスを追加する必要があります。これにより、メモを表示および保存することができます。そのためには、以下の作業が必要です:add_meta_box関数を作成し、それをマウントします。add_meta_boxes行動面で。
function my_note_add_meta_box() {
add_meta_box(
'my_note_meta_box', // 元框的唯一ID
'文章内部便签', // 显示的标题
'my_note_meta_box_callback', // 渲染元框内容的回调函数
'post', // 要显示的帖子类型
'side', // 位置
'default' // 优先级
);
}
add_action( 'add_meta_boxes', 'my_note_add_meta_box' );
function my_note_meta_box_callback( $post ) {
// 从数据库获取当前文章的已有便签
global $wpdb;
$table_name = $wpdb->prefix . 'post_notes';
$notes = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $table_name WHERE post_id = %d ORDER BY created_at DESC", $post->ID ) );
wp_nonce_field( 'my_note_save_action', 'my_note_nonce_field' );
echo '<textarea name="my_new_note" rows="5" style="width:100%;" placeholder="内部備考を入力してください…."></textarea>';
echo '<p class="description">このメモは、ウェブサイトの編集者および管理者のみが閲覧できます。</p>';
if ( $notes ) {
echo '<hr><h4>歴史的なメモ:</h4>';
foreach ( $notes as $note ) {
$user = get_user_by( 'id', $note->created_by );
$username = $user ? $user->display_name : '未知用户';
echo '<p><strong>' . esc_html( $username ) . ' (' . $note->created_at . '):</strong><br>';
echo nl2br( esc_html( $note->note_content ) ) . '</p>';
}
}
} データの保存とクリア
記事が保存または更新された際には、新しいメモをデータベースに保存する必要があります。これは以下の方法で実現できます:save_postこれを実現するためのアクションが必要です。また、プラグインが削除された場合(オプション)、アンインストール用のフックも提供する必要があります。register_uninstall_hook作成したデータテーブルをクリーンアップします。
function my_note_save_post_data( $post_id ) {
// 检查非ce、权限、自动保存等
if ( ! isset( $_POST['my_note_nonce_field'] ) || ! wp_verify_nonce( $_POST['my_note_nonce_field'], 'my_note_save_action' ) ) {
return;
}
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
if ( ! empty( $_POST['my_new_note'] ) ) {
global $wpdb;
$table_name = $wpdb->prefix . 'post_notes';
$wpdb->insert(
$table_name,
array(
'post_id' => $post_id,
'note_content' => sanitize_textarea_field( $_POST['my_new_note'] ),
'created_by' => get_current_user_id(),
),
array( '%d', '%s', '%d' )
);
}
}
add_action( 'save_post', 'my_note_save_post_data' );
// 可选:卸载插件时删除数据表
function my_note_plugin_uninstall() {
global $wpdb;
$table_name = $wpdb->prefix . 'post_notes';
$wpdb->query( "DROP TABLE IF EXISTS $table_name" );
}
register_uninstall_hook( __FILE__, 'my_note_plugin_uninstall' ); ベストプラクティスとリリース準備
WordPressのコーディング基準に従う
コードの可読性、保守性、および他のプラグインとの互換性を確保するために、WordPress公式のPHPコーディングスタンダードを厳守してください。これには、以下のことが含まれますがこれに限りません:正しいインデント(スペースではなくタブを使用する)、関数名や変数名に小文字とアンダースコアを使用した命名方法(snake_case)、クラス名に大文字とアッパーカメルケースを使用した命名方法(UpperCamelCase)、そして翻訳可能なすべての文字列に国際化関数を使用することです。
国際化の実現
優れたプラグインであり、広く利用されることが期待されるものであれば、国際化(Internationalization)をサポートしていなければなりません。つまり、ユーザーに表示されるすべてのテキストは翻訳機能を利用して処理されるべきなのです。
WordPressは以下のような機能を提供しています:__()、_e()、_n()一連の関数です。まず、プラグインのヘッダー情報内でこれらの関数を正しく設定する必要があります。Text Domain(例:`my-first-plugin`)その後、文字列を出力したり使用するたびにその文字列をラップ(包装)する必要があります。
例えば:
私はこれをあなたに送ります。'<p>' . esc_html__( '这是一个演示文本。', 'my-first-plugin' ) . '</p>'; その後、Poeditのようなツールを使用して、すべてのテキストを抽出して生成することができます。.potファイル(File) – 翻訳者が異なる言語に翻訳するための資料。.moと.poファイル。
セキュリティとパフォーマンスの最適化
セキュリティはプラグイン開発において最も重要な要素です。ユーザーからの入力データについては常に検証とクリーニング(サニタイゼーション)を行い、出力データについてはエスケープ処理を施す必要があります。SQLクエリを実行する際には、必ずこれらの対策を徹底してください。prepare()注入攻撃を防ぐための対策として、操作を実行する前にユーザーの権限を確認する必要があります。current_user_can()CE(Cookie-based Authentication)を使用していない場合は、WordPressの非CEメカニズムを利用してください。wp_nonce_field(), wp_verify_nonce())。
パフォーマンスの面では、データベースクエリを最適化し、ループ内でクエリを実行することを避けてください。WordPressの「Transients」APIを適切に使用してキャッシュを行いましょう。フックを使用する必要がない場合は、タイムリーにそれを削除してください。remove_action(), remove_filter()最後に、プラグインのディレクトリには必要なファイルのみを含め、リリースする前にコードを圧縮して整理してください。
WordPressリポジトリに公開する準備ができました。
もしプラグインをWordPressの公式プラグインディレクトリに公開する予定であれば、一連の準備作業が必要です。プラグインには明確な説明文があることを確認してください。readme.txtこのファイルの形式はWordPressの規格に準拠しています。このファイルには、プラグインの説明、インストール手順、よくある質問(FAQ)、バージョンアップの履歴などを含める必要があります。また、メインのプラグインファイルのヘッダー情報も完全かつ正確であることを確認してください。さらに、プラグインがさまざまな環境やWordPressのバージョンで問題なく動作するかを入念にテストしてください。
概要
WordPressプラグインの開発とは、アイデアを強力な機能に変えていく創造的なプロセスです。プラグインの基本構造を理解し、フック(ActionsおよびFilters)の仕組みをマスターし、Settings APIやデータベース操作などの核心機能を熟知することで、シンプルなツールから高度なソリューションまで、さまざまなプラグインを構築することができます。開発の全過程においては、セキュリティ、パフォーマンス、コードの品質基準、そして国際化を常に重要な要素として考えてください。最初の「Hello World」プラグインの作成から始め、実践を重ねていくことで、最終的にはプロフェッショナルレベルで公開可能なWordPressプラグインを自信を持って作成できるようになるでしょう。
FAQ よくある質問
プラグイン開発には、どのような技術を習得する必要がありますか?
PHPの基礎がしっかりしていることが求められます。基本的なHTML、CSS、JavaScriptにも精通している必要があります。MySQLデータベースについての知識もあるとよいでしょう。最も重要なのは、WordPressのコアアーキテクチャを理解していることです。特にフック(Hook)メカニズムやテンプレート階層(Template Hierarchy)についてはよく理解しておく必要があります。オブジェクト指向プログラミング(OOP)の知識は、複雑なプラグインを構築する際に大いに役立ちます。
プラグインとテーマの機能にはどのような違いがありますか?
プラグインはウェブサイトの機能を追加したり変更したりするためのものであり、理論的にはウェブサイトの外観とは分離されているべきです。また、高い移植性を持っている必要があり、テーマを変更しても引き続き正常に動作する必要があります。テーマは主にウェブサイトの外観やレイアウトを制御しますが、現代のテーマには多くの機能コードが含まれていることもあります(ただし、これは良くない慣行とされています)。ベストプラクティスとしては、ある機能が外観の表示と密接に関連している場合はテーマ内に配置し、汎用的で独立した機能であればプラグインとして作成するべきです。
プラグインの更新や互換性にはどのように対処すればよいでしょうか?
更新を処理するためには、プラグインのヘッダー部分にあるコメントを更新する必要があります。Versionフィールドについては、重大な更新がある場合にはWordPressの更新通知機能やアップグレードプログラムを利用することを検討してください。互換性を確保するための鍵は、WordPressのコアAPIに厳密に従って開発を行い、プライベートな関数や廃止された関数の使用を避けることです。readme.txtファイルの中には、プラグインがサポートする最低のWordPressバージョンが明確に記載されています。新しいバージョンをリリースする前には、複数のWordPressバージョンで十分にテストを行う必要があります。
プラグインでは、CSSファイルとJavaScriptファイルをどのように読み込むべきでしょうか?
プラグインのPHPファイル内でCSSやJSを直接インラインで記述しては絶対にいけません。互換性とパフォーマンスを確保するためには、WordPressの`enqueue`関数を使用してスクリプトやスタイルシートを正しく読み込む必要があります。これはバックエンドで行う処理です。admin_enqueue_scriptsフック(Hook)は、フロントエンドで使用されます。wp_enqueue_scriptsフック。使用します。wp_enqueue_style()とwp_enqueue_script()関数を作成する際には、依存関係やバージョン番号の処理にも注意が必要です。
私のプラグインにカスタムの記事タイプやカスタムの分類法をどのように追加できますか?
カスタム記事タイプ(CPT)の追加方法register_post_type()関数にカスタムの分類方法を追加する方法register_taxonomy()関数です。ベストプラクティスとしては、これらの登録処理を以下のような場所に配置することです:initアクションフック内で実行されます。登録パラメータの配列を慎重に設定する必要があります。これにはタグ、公開性、サポートされる機能、アーカイブページの有無などが含まれます。これらによって、バックエンドおよびフロントエンドでの動作が決定されます。
次はどうする?
拡大読書と実践的知識
以下は、この記事のトピックに関連しており、さらに深く読むのに適している。あなたの現在の問題に最も近い記事から優先順位をつけ、徐々に周辺のトピックに広げていく方が良い場合が多い。