WordPress/wordpress-develop
主な特徴
- **包括的な開発環境**: Dockerベースのローカル開発環境を提供
- **モダンなJavaScriptビルド**: Webpackを使用したブロックエディタ、Reactコンポーネント
- **幅広いテストカバレッジ**: PHP 7.2-8.4、複数のMySQL/MariaDBバージョン対応
- **現代的なアーキテクチャ**: REST API、ブロックエディタ、OOP設計
- **CI/CDパイプライン**: 40以上のGitHub Actionsワークフロー
- **コミュニティ主導**: オープンソースコミュニティによる積極的な開発
- **後方互換性**: PHP 7.2以降をサポート、慎重な非推奨プロセス
リポジトリ解析: WordPress/wordpress-develop
基本情報
- リポジトリ名: WordPress/wordpress-develop
- 主要言語: PHP
- スター数: 2,892
- フォーク数: 2,967
- 最終更新: 継続的に更新中(アクティブな開発)
- ライセンス: GNU General Public License v2.0以降
- トピックス: WordPress Core Development, CMS, PHP, JavaScript, React, Block Editor, REST API
概要
一言で言うと
wordpress-developは、世界で最も人気のあるCMSであるWordPressの公式コア開発リポジトリ。WordPressコアのすべての開発がここで行われ、リリース前の最新コードを含む。
詳細説明
このリポジトリはWordPress SubversionリポジトリのGitミラーで、WordPressコア開発の中心拠点。開発は主にTrac(core.trac.wordpress.org)で管理されているが、GitHubのプルリクエストも受け付けている。プラグインやテーマ開発ではなく、WordPressコア自体の開発に特化している。現在のバージョン6.9.0で、継続的に機能拡張と改善が行われている。
主な特徴
- 包括的な開発環境: Dockerベースのローカル開発環境を提供
- モダンなJavaScriptビルド: Webpackを使用したブロックエディタ、Reactコンポーネント
- 幅広いテストカバレッジ: PHP 7.2-8.4、複数のMySQL/MariaDBバージョン対応
- 現代的なアーキテクチャ: REST API、ブロックエディタ、OOP設計
- CI/CDパイプライン: 40以上のGitHub Actionsワークフロー
- コミュニティ主導: オープンソースコミュニティによる積極的な開発
- 後方互換性: PHP 7.2以降をサポート、慎重な非推奨プロセス
使用方法
インストール
前提条件
- Node.js 20.x および npm 10.x(公式サポートバージョン)
- Docker Desktop
- Git
- PHP 7.2以降(テスト実行時)
- MySQL 5.7以降またはMariaDB
インストール手順
# 方法1: Dockerを使用したクイックスタート
git clone https://github.com/WordPress/wordpress-develop.git
cd wordpress-develop
npm install
npm run build:dev
npm run env:start
npm run env:install
# 方法2: GitHub Codespacesを使用
# GitHub上で直接「Code」ボタンからCodespacesを開始
基本的な使い方
Hello World相当の例
// シンプルなプラグインの例(Hello Dolly風)
<?php
/**
* Plugin Name: My First Plugin
* Description: A simple WordPress plugin example
*/
// ダイレクトアクセス防止
if ( ! defined( 'ABSPATH' ) ) {
die();
}
// 管理画面にメッセージを表示
function my_admin_notice() {
echo '<div class="notice notice-success"><p>Hello from My Plugin!</p></div>';
}
add_action( 'admin_notices', 'my_admin_notice' );
実践的な使用例
// フックとフィルターの使用例
// functions.phpまたはプラグイン内で使用
// コンテンツにカスタムテキストを追加
function add_custom_content( $content ) {
if ( is_single() && in_the_loop() && is_main_query() ) {
$custom_text = '<p class="custom-message">' .
__( 'Thanks for reading!', 'textdomain' ) .
'</p>';
$content .= $custom_text;
}
return $content;
}
add_filter( 'the_content', 'add_custom_content' );
// カスタム投稿タイプの登録
function create_custom_post_type() {
register_post_type( 'product',
array(
'labels' => array(
'name' => __( 'Products', 'textdomain' ),
'singular_name' => __( 'Product', 'textdomain' )
),
'public' => true,
'has_archive' => true,
'supports' => array( 'title', 'editor', 'thumbnail' ),
'menu_icon' => 'dashicons-cart',
)
);
}
add_action( 'init', 'create_custom_post_type' );
高度な使い方
// REST APIエンドポイントの作成
class My_Custom_REST_Controller extends WP_REST_Controller {
public function __construct() {
$this->namespace = 'myplugin/v1';
$this->rest_base = 'items';
}
public function register_routes() {
register_rest_route( $this->namespace, '/' . $this->rest_base, array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array( $this, 'get_items' ),
'permission_callback' => array( $this, 'get_items_permissions_check' ),
'args' => $this->get_collection_params(),
),
'schema' => array( $this, 'get_public_item_schema' ),
) );
}
public function get_items( $request ) {
$items = array();
// カスタムロジックでアイテムを取得
$response = rest_ensure_response( $items );
return $response;
}
public function get_items_permissions_check( $request ) {
return true; // またはcurrent_user_can( 'read' )
}
}
// REST APIコントローラーの登録
function register_my_rest_routes() {
$controller = new My_Custom_REST_Controller();
$controller->register_routes();
}
add_action( 'rest_api_init', 'register_my_rest_routes' );
ドキュメント・リソース
公式ドキュメント
- README.md: プロジェクト概要、セットアップ手順
- CONTRIBUTING.md: 貢献ガイドライン、Tracの使用方法
- SECURITY.md: セキュリティポリシー、HackerOne経由の報告
- Core Handbook: make.wordpress.org/core/handbook/
- Developer Resources: developer.wordpress.org
サンプル・デモ
- wp-config-sample.php: WordPress設定ファイルのテンプレート
- src/wp-content/plugins/hello.php: Hello Dollyプラグイン(シンプルなプラグインの例)
- src/wp-content/themes/: Twenty Twentyシリーズのデフォルトテーマ
チュートリアル・ガイド
- 開発者ハンドブック: コードスタンダード、APIリファレンス
- プラグイン開発ガイド: プラグイン開発のベストプラクティス
- テーマ開発ガイド: テーマ開発の基礎
- Block Editor Handbook: ブロックエディタ開発ガイド
技術的詳細
アーキテクチャ
全体構造
WordPressはプラグインアーキテクチャを採用し、フックシステム(アクションとフィルター)を中心に拡張可能な設計。初期化フローはwp-load.php→wp-config.php→wp-settings.phpの順で実行され、コア機能、プラグイン、テーマが順次読み込まれる。
ディレクトリ構成
wordpress-develop/
├── src/ # ソースファイル(開発はここで行う)
│ ├── wp-admin/ # 管理画面インターフェース
│ ├── wp-includes/ # コアWordPressファイル
│ │ ├── blocks/ # ブロック定義
│ │ ├── rest-api/ # REST API実装
│ │ ├── js/ # JavaScriptライブラリ
│ │ └── css/ # スタイルシート
│ ├── wp-content/ # テーマ、プラグイン用ディレクトリ
│ └── *.php # コアWordPressファイル
├── build/ # ビルドされたファイル(自動生成)
├── tests/ # テストスイート
│ ├── phpunit/ # PHPユニットテスト
│ ├── e2e/ # E2Eテスト(Playwright)
│ ├── performance/ # パフォーマンステスト
│ └── qunit/ # JavaScriptテスト
├── tools/ # ビルド・開発ツール
└── .github/workflows/ # CI/CD設定(40+ワークフロー)
主要コンポーネント
-
wp-load.php: WordPress初期化のエントリポイント
- 場所:
src/wp-load.php - 依存: wp-config.php
- インターフェース: ABSPATH設定、wp-config読み込み
- 場所:
-
wp-settings.php: コア初期化処理
- 場所:
src/wp-settings.php - 依存: 全コアコンポーネント
- インターフェース: エラーハンドリング、DB初期化、プラグイン/テーマ読み込み
- 場所:
-
WP_Hookクラス: フックシステムの中核
- 場所:
src/wp-includes/class-wp-hook.php - 依存: なし
- インターフェース: add_filter(), do_action(), apply_filters()
- 場所:
-
REST APIコントローラー: モダンなAPI実装
- 場所:
src/wp-includes/rest-api/ - 依存: WP_REST_Controller基底クラス
- インターフェース: register_rest_route(), RESTエンドポイント
- 場所:
技術スタック
コア技術
- 言語: PHP 7.2-8.4(幅広いバージョンサポート)
- JavaScript: モダンJavaScript(ES6+)、React(ブロックエディタ)
- データベース: MySQL 5.7+, 8.0, 8.4 / MariaDB
- 主要ライブラリ:
- @wordpress/* packages: コアJavaScriptパッケージ
- jQuery: 後方互換性のため
- Lodash, Moment.js: ユーティリティ
- React, Redux: ブロックエディタのUI
開発・運用ツール
- ビルドツール:
- Grunt: メインビルドシステム
- Webpack: モダンJavaScriptバンドル
- npm scripts: タスク管理
- テスト:
- PHPUnit: PHPユニットテスト
- QUnit: レガシーJavaScriptテスト
- Playwright: E2Eテスト
- カバレッジ: Codecovへのレポート
- CI/CD:
- GitHub Actions: 40+ワークフロー
- マトリックステスト: 複数PHP/DBバージョン
- 自動依存関係更新
- デプロイ: Dockerベースのローカル環境
設計パターン・手法
- プラグインアーキテクチャ: フックシステムによる拡張可能な設計
- イベント駆動: アクションとフィルターによる処理
- テンプレート階層: 柔軟なテーマカスタマイズ
- オブジェクト指向: 新しいコードではOOP採用
- 国際化(i18n): __(), _e()等の翻訳関数
- セキュリティパターン:
- 直接アクセス防止:
if ( ! defined( 'ABSPATH' ) ) - 出力エスケープ: esc_html(), esc_attr()
- 入力サニタイズ: sanitize_text_field()
- 直接アクセス防止:
データフロー・処理フロー
1. HTTPリクエスト
↓
2. wp-load.php (初期化開始)
↓
3. wp-config.php (設定読み込み)
↓
4. wp-settings.php (コア初期化)
↓
5. プラグイン読み込み
↓
6. テーマ functions.php
↓
7. initアクション実行
↓
8. クエリ解析とルーティング
↓
9. テンプレート選択・読み込み
↓
10. コンテンツ出力
API・インターフェース
公開API
フックAPI
- アクション: 特定のタイミングで処理を実行
// アクションの使用
function my_init_function() {
// 初期化処理
}
add_action( 'init', 'my_init_function' );
// 優先度付き
add_action( 'wp_head', 'my_head_function', 10 );
- フィルター: 値を変更して返す
// フィルターの使用
function my_title_filter( $title ) {
return $title . ' - My Site';
}
add_filter( 'the_title', 'my_title_filter' );
// 複数パラメータ
add_filter( 'the_content', 'my_content_filter', 10, 2 );
REST API
- エンドポイント: /wp-json/wp/v2/
// カスタムエンドポイント登録
register_rest_route( 'myplugin/v1', '/data/', array(
'methods' => 'GET',
'callback' => 'my_api_callback',
'permission_callback' => '__return_true',
) );
function my_api_callback( $request ) {
return new WP_REST_Response( array( 'data' => 'value' ), 200 );
}
設定・カスタマイズ
設定ファイル
// wp-config.phpの主要設定
define( 'DB_NAME', 'database_name' );
define( 'DB_USER', 'username' );
define( 'DB_PASSWORD', 'password' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );
// セキュリティキー(必ず変更)
define( 'AUTH_KEY', 'unique phrase' );
define( 'SECURE_AUTH_KEY', 'unique phrase' );
// ... 他のキー
// デバッグ設定
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
define( 'SCRIPT_DEBUG', true );
// マルチサイト
define( 'WP_ALLOW_MULTISITE', true );
拡張・プラグイン開発
// プラグインヘッダーの標準形式
/**
* Plugin Name: My Plugin
* Plugin URI: https://example.com/
* Description: Plugin description
* Version: 1.0.0
* Author: Author Name
* License: GPL v2 or later
* Text Domain: my-plugin
*/
// アクティベーション・ディアクティベーションフック
register_activation_hook( __FILE__, 'my_plugin_activate' );
register_deactivation_hook( __FILE__, 'my_plugin_deactivate' );
// アンインストールフック
register_uninstall_hook( __FILE__, 'my_plugin_uninstall' );
パフォーマンス・スケーラビリティ
パフォーマンス特性
- キャッシュ: オブジェクトキャッシュ、ページキャッシュ対応
- 最適化手法:
- Lazy Loading: 画像、iframeの遅延読み込み
- Script/Styleの最小化と結合
- PHP OPcache対応
- データベースクエリ最適化
- パフォーマンステスト:
- Core Web Vitals対応
- Lighthouseスコア最適化
スケーラビリティ
- マルチサイト: 単一WordPressで複数サイト運用
- ロードバランシング: HyperDB等でDB分散
- CDN統合: 静的ファイルのCDN配信
- プラグインアーキテクチャ: 機能分離によるスケール
制限事項
-
技術的な制限:
- PHPのシングルスレッドモデル
- データベース依存のアーキテクチャ
- ファイルシステムへの依存
-
運用上の制限:
- 定期的なセキュリティ更新が必須
- プラグインの互換性問題
- バージョンアップグレードの慎重な計画
評価・所感
技術的評価
強み
- 成熟したエコシステム: 20年以上の歴史、幅広いプラグイン/テーマ
- 拡張性: フックシステムによる高いカスタマイズ性
- 使いやすさ: 非技術者でも管理可能なUI
- 後方互換性: 古いサイトも継続運用可能
- アクティブな開発: 継続的な機能改善とセキュリティ更新
- 充実したドキュメント: 開発者向けリソースが豊富
改善の余地
- パフォーマンス: デフォルト設定では速度が課題
- モダンなアーキテクチャ: レガシーコードの存在
- JavaScriptフレームワーク: jQuery依存からの移行途中
- テストカバレッジ: 全体的なカバレッジ向上の余地
向いている用途
- 企業サイト: 柔軟なCMSとして
- ブログ・メディア: コンテンツ管理に最適
- ECサイト: WooCommerce等で完全なEC構築
- 会員制サイト: ユーザー管理機能が充実
- 多言語サイト: 完全なi18nサポート
向いていない用途
- 大規模Webアプリケーション: CMS機能が不要な場合
- リアルタイムアプリ: WebSocket等が必要な場合
- 高度なカスタムロジック: フレームワークの制約が強い場合
総評
wordpress-developは、世界で最も成功したCMSのコア開発リポジトリ。その成功の鍵は、後方互換性を保ちながら最新技術を取り入れるバランス、プラグインアーキテクチャによる無限の拡張性、そして活発なコミュニティにある。Dockerベースの開発環境、包括的なテストスイート、GitHub ActionsによるCI/CDなど、モダンな開発手法も積極的に採用されている。コントリビュータとして参加するにはハードルがあるが、Web開発の基礎を学ぶ上でも価値のあるリポジトリ。