WordPress Plugin開発に
オートロードを使ってみた話
2016/12/11 Tomoyuki Sugita
杉田 知至
@tomotomobile
クックビズ株式会社
開発部マネージャ
Project Manager
WP Campaign Manager作者
自己紹介
“趣味で”
WordPressプラグインを開発して
公開しています
キャンペーン管理が驚くほどカンタン
に
https://wordpress.org/plugins-wp/wp-campaign-manager/
記事の途中に唐突に出てくるバナーを管理する
ためのプラグインです。
アフィリエイターさん必見!
バナーはショートコードで管理しているため、
元のコードを修正すれば、サイト内の全バナー
を差し替えできます。
キャンペーンを非公開にすれば、記事内のバナ
ーも非表示になります。バナーの予約投稿も可
。
実際に自分で使ってみて
不便だと思ったこと
アフィリエイトの支払い条件とか、キャンペー
ン期間が分からないので、詳細URLが欲しい。
こういう枠を管理画面に追加するとコード量が
一気に増える。
管理画面の機能、ショートコードの機能などを
別のファイル(クラス)に分けたくなる。
Require地獄は嫌だ!
require_once __DIR__ . 'src/AdminTheme.php';
require_once __DIR__ . 'src/ShortCode.php';
オートロード使いたい!
use tomotomobileWPCampaignManagerAdminTheme;
use tomotomobileWPCampaignManagerShortCode;
PHPのオートロードの紹介
わかり易さ優先で雑に解説
PHPで別ファイルにあるクラスを使いたいとき
# wp-campaign-mager.phpで、src/ShortCode.phpを使いたい
とき
require_once 'src/ShortCode.php';
# src/AdminTheme.phpで、src/ShortCode.phpを使いたいとき
require_once './ShortCode.php';
※分かりやすくするため、変な書き方してます
requireいっぱい使うと面倒くさい!
実行速度も遅くなる!
そこで使うのがPHP5.3から登場した
オートロード
PHPで別ファイルにあるクラスを使いたいとき
# wp-campaign-mager.phpで、src/ShortCode.phpを使いたい
とき
use srcShortCode;
# src/AdminTheme.phpで、src/ShortCode.phpを使いたいとき
use srcShortCode;
※分かりやすくするため、変な書き方してます
さっきの書き方
# wp-campaign-mager.phpで、src/ShortCode.phpを使いたい
とき
require_once 'src/ShortCode.php';
# src/AdminTheme.phpで、src/ShortCode.phpを使いたいとき
require_once './ShortCode.php';
※分かりやすくするため、変な書き方してます
オートロード使ったときの書き方
# wp-campaign-mager.phpで、src/ShortCode.phpを使いたい
とき
use srcShortCode;
# src/AdminTheme.phpで、src/ShortCode.phpを使いたいとき
use srcShortCode;
※分かりやすくするため、変な書き方してます
注意点
require_once 'src/ShortCode.php';
↓
use srcShortCode;
スラッシュ(/)がバックスラッシュ()に変わりました。
.phpが無くなりました。
src/ShortCode.php を少し改造
<?php
namespace src;
class ShortCode {
※ファイルの先頭に一行追加
ネームスペースといいます
use srcShortCode;
て書いたら、src/ShortCode.phpのクラスを呼び出します。
ネームスペースは何でもOK
<?php
namespace tomotomobileWPCampaignManager;
class ShortCode {
※PSR-4のルールですが説明は省略
useの後ろはネームスペース
use tomotomobileWPCampaignManagerShortCode;
て書いたら、src/ShortCode.phpのクラスを呼び出します。
さっきの
use srcShortCode;
て書いたら、src/ShortCode.phpのクラスを呼び出します。
今回の
use tomotomobileWPCampaignManagerShortCode;
て書いたら、src/ShortCode.phpのクラスを呼び出します。
利点
• いっぱいrequireしなくて良い
• requireの速度が早くなる(たいてい)
• クラス名が短くて済む
余談終わり!
解決策1
Composer使えばいいじゃん
確かにできる!
require_once __DIR__ . '/vendor/autoload.php';
use tomotomobileWPCampaignManagerAdminTheme;
use tomotomobileWPCampaignManagerShortCode;
$instance = new WPCampaignManager();
$instance->execute();
composer.pharって1.7MBもあるんだぜ。
オートロード使いたいだけなのに、はっきり言
ってオーバースペック。
解決策2
Autoloader自分で作っちゃえ
できちゃった!
require_once __DIR__ . '/autoloader.php';
use tomotomobileWPCampaignManagerAdminTheme;
use tomotomobileWPCampaignManagerShortCode;
$instance = new WPCampaignManager();
$instance->execute();
さっきの
require_once __DIR__ . '/vendor/autoload.php';
use tomotomobileWPCampaignManagerAdminTheme;
use tomotomobileWPCampaignManagerShortCode;
$instance = new WPCampaignManager();
$instance->execute();
今回の
require_once __DIR__ . '/autoloader.php';
use tomotomobileWPCampaignManagerAdminTheme;
use tomotomobileWPCampaignManagerShortCode;
$instance = new WPCampaignManager();
$instance->execute();
https://github.com/php-fig/fig-
standards/blob/master/accepted/PSR-4-
autoloader-examples.md
ほぼサンプルコードのコピペで作れました。
元のコード
作った(?)コード
変更点
$prefix = 'FooBar';
↓
$prefix = 'tomotomobileWPCampaignManager';
自分で決めたネームスペースを書くだけ。
バックスラッシュ()は2回書きます。
まとめ
レガシーコードの集合体WordPressにも、オ
ートロードを実装できることが分かりました
!
ご清聴ありがとうございました
Appendix
参考サイト
• Example Implementations of PSR-4
https://github.com/php-fig/fig-
standards/blob/master/accepted/PSR-4-autoloader-
examples.md
• PHPでクラスのincludeを自動化するautoloadの速度を
測ってみた。
http://blog.katty.in/1942
• Composer
https://getcomposer.org/

Word press plugin開発にオートロードを使ってみた話