2026年7月28日

2026年7月28日

WordPressプラグイン開発でComposerのオートローディングを使う方法

はじめに

WordPressプラグイン開発でComposerを使いたいがオートローディングの設定がわからない・require_onceだらけのコードを整理したい・外部ライブラリ(Carbon・Guzzle等)をプラグインに組み込みたいといった問題の解決方法を解説します。

症状・原因

  • composer.jsonautoload.psr-4のパスが間違っていてクラスが読み込まれない
  • composer dump-autoloadを実行し忘れてクラスが見つからないエラーが続く
  • vendor/ディレクトリがGitリポジトリに含まれてリポジトリが肥大化している
  • 複数プラグインが同じライブラリの異なるバージョンを使用してコンフリクトしている

解決手順

ステップ1:Composerをインストールしてプロジェクトを初期化する

# ✅ Composer をインストール
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer --version
# → Composer version 2.x.x

# ✅ プラグインディレクトリを作成
mkdir -p /var/www/html/wp-content/plugins/my-plugin
cd /var/www/html/wp-content/plugins/my-plugin

# ✅ composer.json を対話式で作成
composer init
# → Package name: mycompany/my-plugin
# → Description: My WordPress Plugin
# → Minimum Stability: stable
# → License: GPL-2.0-or-later

# ✅ または手動で composer.json を作成
cat > composer.json << 'EOF'
{
    "name": "mycompany/my-plugin",
    "description": "My WordPress Plugin",
    "type": "wordpress-plugin",
    "require": {
        "php": ">=8.0"
    },
    "autoload": {
        "psr-4": {
            "MyCompany\\MyPlugin\\": "src/"
        }
    },
    "require-dev": {
        "phpunit/phpunit": "^10.0"
    }
}
EOF

# ✅ オートローダーを生成
composer dump-autoload
# → Generating autoload files
# → Generated autoload files: vendor/autoload.php

ステップ2:PSR-4オートローディングを設定する

# ✅ ディレクトリ構成
mkdir -p src/{Admin,Frontend,API,Utils}
ls -la src/
# → Admin/
# → Frontend/
# → API/
# → Utils/
// ✅ src/Admin/AdminPage.php
namespace MyCompany\MyPlugin\Admin;

class AdminPage {
    public function register(): void {
        add_action('admin_menu', [$this, 'add_menu']);
    }
    
    public function add_menu(): void {
        add_menu_page(
            'My Plugin',
            'My Plugin',
            'manage_options',
            'my-plugin',
            [$this, 'render']
        );
    }
    
    public function render(): void {
        echo '<div class="wrap"><h1>My Plugin Settings</h1></div>';
    }
}
// ✅ src/Plugin.php(メインクラス)
namespace MyCompany\MyPlugin;

use MyCompany\MyPlugin\Admin\AdminPage;
use MyCompany\MyPlugin\Frontend\ShortcodeHandler;

class Plugin {
    private static ?Plugin $instance = null;
    
    public static function getInstance(): Plugin {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    public function initialize(): void {
        $admin = new AdminPage();
        $admin->register();
        
        $shortcodes = new ShortcodeHandler();
        $shortcodes->register();
    }
}
// ✅ my-plugin.php(プラグインのメインファイル)
<?php
/**
 * Plugin Name: My Plugin
 * Version: 1.0.0
 */

// Composerのオートローダーを読み込む
require_once __DIR__ . '/vendor/autoload.php';

// プラグインを初期化
add_action('plugins_loaded', function() {
    \MyCompany\MyPlugin\Plugin::getInstance()->initialize();
});

ステップ3:外部ライブラリを追加する

# ✅ よく使われるライブラリをインストール
# Carbon(日付処理)
composer require nesbot/carbon

# Guzzle(HTTPクライアント)
composer require guzzlehttp/guzzle

# Monolog(ロギング)
composer require monolog/monolog

# ✅ インストール確認
cat vendor/installed.json | python3 -c "
import json,sys
d=json.load(sys.stdin)
for p in d.get('packages', []):
    print(p['name'], p['version'])
" | head -10

# ✅ WordPress 本体のライブラリと競合しないようにする(PHP-Scoper)
composer require --dev humbug/php-scoper
# → PHP-Scoperでnamespaceをプレフィックス付きにして競合を防ぐ
# → MyCompany\MyPlugin\Guzzle\... のようにリネーム

# ✅ ライブラリをコードで使用
// ✅ Carbonで日付処理
use Carbon\Carbon;

class DateHelper {
    public static function humanReadable(\DateTimeInterface $date): string {
        return Carbon::instance($date)->diffForHumans();
        // → "3日前", "2時間後"
    }
}

// ✅ Monologでログ出力
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

class AppLogger {
    private static Logger $logger;
    
    public static function get(): Logger {
        if (!isset(self::$logger)) {
            self::$logger = new Logger('my-plugin');
            self::$logger->pushHandler(
                new StreamHandler(WP_CONTENT_DIR . '/debug.log', Logger::DEBUG)
            );
        }
        return self::$logger;
    }
}

// 使い方
AppLogger::get()->info('Plugin initialized', ['version' => '1.0.0']);

ステップ4:Gitと.gitignoreを設定する

# ✅ .gitignore で vendor/ を除外
cat > .gitignore << 'EOF'
/vendor/
.DS_Store
*.log
node_modules/
EOF

# ✅ composer.lock はコミットする(再現性のある環境構築のため)
git add composer.json composer.lock .gitignore
git commit -m "Add Composer configuration"

# ✅ デプロイ時に vendor/ を生成
ssh user@production-server
cd /var/www/html/wp-content/plugins/my-plugin
composer install --no-dev --optimize-autoloader
# → --no-dev: 開発用ライブラリを除外
# → --optimize-autoloader: classmap方式で高速化

# ✅ vendor/ のサイズ確認
du -sh vendor/
# → 12M vendor/

# ✅ GitHub Actions でデプロイを自動化
cat > .github/workflows/deploy.yml << 'EOF'
name: Deploy
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: composer install --no-dev --optimize-autoloader
      - run: rsync -avz --exclude='.git' . user@server:/var/www/html/wp-content/plugins/my-plugin/
EOF

ステップ5:オートローディングの問題を解決する

# ✅ クラスが見つからないエラーをデバッグ
wp eval "
try {
    \$obj = new \MyCompany\MyPlugin\Admin\AdminPage();
    echo 'Class loaded successfully';
} catch (\Error \$e) {
    echo 'Error: ' . \$e->getMessage();
}
" --path=/var/www/html/
# → Error: Class "MyCompany\MyPlugin\Admin\AdminPage" not found

# ✅ オートローダーを再生成
composer dump-autoload
# → Generating autoload files
# → Generated autoload files

# ✅ クラスマップを確認
cat vendor/composer/autoload_psr4.php
# → 'MyCompany\\MyPlugin\\' => array(0 => '/var/www/html/wp-content/plugins/my-plugin/src'),

# ✅ vendor/autoload.php が読み込まれているか確認
wp eval "
echo file_exists('/var/www/html/wp-content/plugins/my-plugin/vendor/autoload.php') 
    ? 'autoload.php: EXISTS' : 'autoload.php: NOT FOUND';
" --path=/var/www/html/

# ✅ Composerのクラスマップを最適化(本番環境推奨)
composer dump-autoload --optimize
# → Generated optimized autoload files containing 287 classes

注意事項

  • WordPressプラグインで外部ライブラリを使用する場合、他のプラグインが同じライブラリの異なるバージョンを使っているとコンフリクトが発生します。PHP-Scoperでnamespaceにプレフィックスを付けてライブラリをスコープ分離することを検討してください
  • composer installcomposer.lockの内容を使用して確実な再現環境を構築します。composer updateは最新バージョンに更新するため本番デプロイではinstallを使用してください

まとめ

ComposerオートローディングのWordPressプラグイン設定は①composer initでプロジェクト初期化・composer.jsonautoload.psr-4"MyCompany\\MyPlugin\\": "src/"を設定・composer dump-autoloadでautoload.php生成、②src/配下にnamespaceに合わせたクラスファイルを配置・メインプラグインファイルでrequire_once vendor/autoload.php、③composer require nesbot/carbon等で外部ライブラリを追加・PHP-Scoperで名前空間を隔離して他プラグインとの競合を防ぐ、④vendor/.gitignoreに追加・composer.lockはコミット・デプロイ時にcomposer install --no-devを実行、⑤composer dump-autoload --optimizeでclassmap方式の高速化・クラスが見つからない場合はdump-autoloadの再実行・vendor/composer/autoload_psr4.phpでパス確認の手順で設定します。

お気軽にご相談ください

お見積りへ お問い合わせへ