word press plugin開発にオートロードを使ってみた話
TRANSCRIPT
WordPress Plugin 開発にオートロードを使ってみた話2016/12/11 Tomoyuki Sugita
杉田 知至@tomotomobile
クックビズ株式会社開発部マネージャProject ManagerWP 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 tomotomobile\WPCampaignManager\AdminTheme;use tomotomobile\WPCampaignManager\ShortCode;
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 src\ShortCode;
# src/AdminTheme.phpで、 src/ShortCode.phpを使いたいときuse src\ShortCode;
※分かりやすくするため、変な書き方してます
さっきの書き方# 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 src\ShortCode;
# src/AdminTheme.phpで、 src/ShortCode.phpを使いたいときuse src\ShortCode;
※分かりやすくするため、変な書き方してます
注意点require_once 'src/ShortCode.php'; ↓use src\ShortCode;
スラッシュ (/)がバックスラッシュ (\)に変わりました。.phpが無くなりました。
src/ShortCode.php を少し改造<?phpnamespace src;
class ShortCode {
※ファイルの先頭に一行追加
ネームスペースといいますuse src\ShortCode;
て書いたら、 src/ShortCode.phpのクラスを呼び出します。
ネームスペースは何でも OK
<?phpnamespace tomotomobile\WPCampaignManager;
class ShortCode {
※PSR-4のルールですが説明は省略
use の後ろはネームスペースuse tomotomobile\WPCampaignManager\ShortCode;
て書いたら、 src/ShortCode.phpのクラスを呼び出します。
さっきのuse src\ShortCode;
て書いたら、 src/ShortCode.phpのクラスを呼び出します。
今回のuse tomotomobile\WPCampaignManager\ShortCode;
て書いたら、 src/ShortCode.phpのクラスを呼び出します。
利点• いっぱい requireしなくて良い• requireの速度が早くなる(たいてい)• クラス名が短くて済む
余談終わり!
解決策 1Composer 使えばいいじゃん
確かにできる!require_once __DIR__ . '/vendor/autoload.php';
use tomotomobile\WPCampaignManager\AdminTheme;use tomotomobile\WPCampaignManager\ShortCode;
$instance = new WPCampaignManager();$instance->execute();
composer.pharって 1.7MBもあるんだぜ。オートロード使いたいだけなのに、はっきり言ってオーバースペック。
解決策 2Autoloader 自分で作っちゃえ
できちゃった!require_once __DIR__ . '/autoloader.php';
use tomotomobile\WPCampaignManager\AdminTheme;use tomotomobile\WPCampaignManager\ShortCode;
$instance = new WPCampaignManager();$instance->execute();
さっきのrequire_once __DIR__ . '/vendor/autoload.php';
use tomotomobile\WPCampaignManager\AdminTheme;use tomotomobile\WPCampaignManager\ShortCode;
$instance = new WPCampaignManager();$instance->execute();
今回のrequire_once __DIR__ . '/autoloader.php';
use tomotomobile\WPCampaignManager\AdminTheme;use tomotomobile\WPCampaignManager\ShortCode;
$instance = new WPCampaignManager();$instance->execute();
https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.mdほぼサンプルコードのコピペで作れました。
元のコード
作った (?)コード
変更点$prefix = 'Foo\\Bar\\'; ↓$prefix = 'tomotomobile\\WPCampaignManager\\';
自分で決めたネームスペースを書くだけ。バックスラッシュ (\)は 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
• Composerhttps://getcomposer.org/