管理画面のある WordPress プラグインの作成方法
最近日本の方の WordPress プラグインもずいぶん増えてきて、同じことをしている人間としては嬉しい限りです。 🙂
ぼくも何本か書いてきて、ようやく勘所のようなものがつかめてきたのでちょっとプラグイン作成のノウハウなんかをエントリしてみたいと思います。
いや、最初のころはずいぶん苦労したんです。。 なにができなかったって、PHP を知らなかった。 最近だいぶ”ソラ”でかけるようになってきましたが、まだまだ語彙が少なく、できる方から見ればなんだこりゃ、なんだと思うんですが…。
でまぁ、知らなくてもノリでできちゃうのがスクリプト言語の良いところ。 ここでは、「管理画面のある WordPress プラグインの作成方法」を書いてみたいと思います。
管理画面の追加の方法は分かるとして、問題はデータの保存とプログラムの構造。 経験的に以下の構造にすると、ストレス無くコードをかけるような気がします。 まずはクラスを 3 つつくります。
- WordPress とインターフェースするクラス (ex. class WpHoge)
- データを処理するクラス (ex. class WpHogeModel)
- 管理画面の HTML を出力するクラス (ex. class WpHogeView)
プログラムの構造はいわゆる MVC の構造をとるわけですが、あんまり厳格にやると、一般的な WP のプラグインの規模くらいでは逆に面倒になりますのでその辺は適当に… 😛
class WpHoge は、WordPress とのインターフェースを書きます。 プラグインメインロジックと WordPress の仲介をするコントローラクラスですが、要は WordPress のコア関数を呼ぶのはなるべくここだけにします。(たとえば、多国語化すると WpHogeView に __、_e をかかなければならないのとかは愛敬。 WpHoge でラップしてもいいけど、そこまでは…)
今回書きたかったのは、以下から。 管理画面で設定するオプションデータの保存処理の方法のノウハウです。
class WpHogeModel には、メイン処理、いわゆるビジネスロジックを書きます。
データ保存をするときのポイントは、このオブジェクトの状態をそのまんま WP のデータベースに保存すること。 オブジェクトを復元すれば、次回同じ状態(設定したオプション値など)をうまく再現できるわけです。 では仮に WpHogeModel を以下のように定義します。
- class WpHogeModel {
- // メンバ変数
- $oprion = array();
- // コンストラクタ
- function WpHogeModel() {
- $option['保存したいオプション1'] = 初期値;
- $option['保存したいオプション2'] = 初期値;
- $option['保存したいオプション3'] = 初期値;
- }
- // 処理
- function syori() {
- $this->$option['保存したいオプション1'] = 更新値;
- }
- }
保存したいオプション値をメンバ変数にして、オブジェクトを new した時唯一実行されるコンストラクタには、保存したいオプション値の初期値を書いておきます。 で、あとはオプションのメンバにアクセスしつつ適当に処理を書きます。
次に WP の領域でインスタンス化するコントローラ class WpHoge の中で、この class WpHogeModel のインスタンスをつくります。
でもって、インスタンス化した class WpHogeModel を”ごっそり”シリアライズして WP に登録してしまいます。(初回) もし、すでに WP に登録があるようであれば、シリアライズされたデータからインスタンスを復元します。(2回目以降)
2回目以降インスタンスの復元時は、new されるわけではないので class WpHogeModel のコンストラクタは働かず、オプションは初期化されずオプションのメンバ変数が WP に登録された時点のものに復元されるわけです。 あとは、また通常通り Model の処理関数をコントローラから呼び出して処理を続行するだけです。
class WpHoge のデータ取得系の処理はたとえば以下のようになるでしょう。
- class WpHoge {
- var $model;
- // コンストラクタ
- function WpHoge() {
- $this->model = $this->getModelObject();
- $this->model->syori();
- }
- // モデルオブジェクトの作成
- function getModelObject() {
- // WP からオプション所得
- $option = $this->getWpOption();
- // Model のクラスが登録されていたらそれを復元
- if(strtolower(get_class($option)) == strtolower('WpHoge')) {
- $model = $option;
- }
- // なかったら(初回) 新しく Model インスタンスつくって WP に登録(writeWpOptionは省略)
- else {
- $model = new WpHoge();
- $this->writeWpOption($model);
- }
- return $model;
- }
- function getWpOption() {
- $option = get_option('オプション登録名');
- if(!$option == false) {
- $OptionValue = $option;
- } else {
- $OptionValue = false;
- }
- return $OptionValue;
- }
- }
あとは、管理画面からの更新などをきっかけとして、コントローラが Model をコントロールしつつ適切なタイミングで WP に add_option、update_option すれば OK です。 これらの関数はオブジェクトが引数に渡されると勝手にシリアライズしてくれます。
この方式をつかうと、オプションの保存/取得が 1 query になりますし、なにより “楽” です。 wp-kumonosu がこの方式で動いていますので、興味がある方はコードをみてみてください。
wp-kumonosu では管理画面からの http リクエストをコントローラで Model に振り分け処理を進めていっています。 Model で直接 WordPress の DB に SQL 発行しちゃったりして、厳密に言うとちゃんと MVC になっていないのですが、まぁひとりで作るくらいの規模なのでいいんじゃないっすか 😛
みなさんそれぞれのコーディングスタイルがあると思うので、これがいいってわけでもないのですが、もし管理画面付きプラグインでコードが煩雑になって困っている方のご参考になったら。
9 Comments
Trackback
Comment
-
From: miyoshi - 2007/1/20 Saturday (Comment)
すばらしい 😀 すごく参考になります!
続編期待してます。
-
From: ひろまさ - 2007/1/20 Saturday (Comment)
miyoshi さん、こんにちは。 😀
どうもありがとうございます!。 ネタがふえたらまた書きますね。 😉
-
From: よしとも - 2007/1/21 Sunday (Comment)
はじめまして。ちょうど管理画面のあるプラグイン作成に初挑戦中なので、ナイスタイミングです:grin:
PHPは1年ほど経験がありますが、プラグインは未知の領域なので四苦八苦しています。やっとまともな形になってきましたが、ひろまささんが過去に書かれたプラグイン作成の記事が大いに参考になったことは間違いないと思っています。
プラグインの仕様が固まったら、この記事を参考にMVC化に挑んでみたいものです。
# 1つ目のコードの4行目にtypoが・・・。
-
From: ひろまさ - 2007/1/21 Sunday (Comment)
よしとも さん、こんにちは。 😀
実はよしともさんの記事を拝見していまして、、影響を受けてぼくも書いてみようと思ってエントリした次第でした。 😳
wp-EntryKeyword、楽しみにしています!
今後ともよろしくお願いいたします。
# へなへなになる typo ですね。。 記念に残しておきます。 😳
-
From: よしとも - 2007/1/21 Sunday (Comment)
こんばんわ
>実はよしともさんの記事を拝見していまして、、影響を受けてぼくも書いてみようと思ってエントリした次第でした。
なんと:shock:
自分の記事が新たな記事のきっかけになるのってうれしいものですね。励みになります。
プラグインのほうは、この調子だと今週末くらいにはひとまずベータ版として公開できそうな感じです。もう1つ2つ機能を足して、そのあと動作チェックといったところです。
MVC化の前に、1度まとめ記事も書きたいですね。今のだと大雑把過ぎなので。
-
From: ひろまさ - 2007/1/21 Sunday (Comment)
こんばんわ~。 😀
>MVC化の前に、1度まとめ記事も書きたいですね。今のだと大雑把過ぎなので。
おお!楽しみにしています。 😮
もしよければ、JSeries のホスティングリソースも使えますので、なにかありましたらご連絡いただければと思います!。
-
From: よしとも - 2007/2/1 Thursday (Comment)
おはようございます
すみません。先にMVC化始めちゃいました:oops:
思いついた機能がいろいろあって、そのためのリファクタリングしてたらクラスも分けたほうがいいなという結論に。
というわけで、公開は今週末か来週くらいになりそうです:mrgreen:
>もしよければ、JSeries のホスティングリソースも使えますので
始めてから1ヶ月経ってない新人デベロッパーでもよかったらお願いします:mrgreen:
-
From: ひろまさ - 2007/2/1 Thursday (Comment)
そうなんですよね~、プラグインでも大きくなると、わけたほうが便利になってきますね。 ぼくも試行錯誤の後にたどりつきました ❗
ぜひぜひ、WP プラグイン仲間になってください。
-
From: miyoshi - 2007/1/20 Saturday (Comment)
すばらしい 😀 すごく参考になります!
続編期待してます。 -
From: ひろまさ - 2007/1/20 Saturday (Comment)
miyoshi さん、こんにちは。 😀
どうもありがとうございます!。 ネタがふえたらまた書きますね。 😉
-
From: よしとも - 2007/1/21 Sunday (Comment)
はじめまして。ちょうど管理画面のあるプラグイン作成に初挑戦中なので、ナイスタイミングです:grin:
PHPは1年ほど経験がありますが、プラグインは未知の領域なので四苦八苦しています。やっとまともな形になってきましたが、ひろまささんが過去に書かれたプラグイン作成の記事が大いに参考になったことは間違いないと思っています。プラグインの仕様が固まったら、この記事を参考にMVC化に挑んでみたいものです。
# 1つ目のコードの4行目にtypoが・・・。
-
From: ひろまさ - 2007/1/21 Sunday (Comment)
よしとも さん、こんにちは。 😀
実はよしともさんの記事を拝見していまして、、影響を受けてぼくも書いてみようと思ってエントリした次第でした。 😳
wp-EntryKeyword、楽しみにしています!
今後ともよろしくお願いいたします。# へなへなになる typo ですね。。 記念に残しておきます。 😳
-
From: よしとも - 2007/1/21 Sunday (Comment)
こんばんわ
>実はよしともさんの記事を拝見していまして、、影響を受けてぼくも書いてみようと思ってエントリした次第でした。
なんと:shock:
自分の記事が新たな記事のきっかけになるのってうれしいものですね。励みになります。プラグインのほうは、この調子だと今週末くらいにはひとまずベータ版として公開できそうな感じです。もう1つ2つ機能を足して、そのあと動作チェックといったところです。
MVC化の前に、1度まとめ記事も書きたいですね。今のだと大雑把過ぎなので。 -
From: ひろまさ - 2007/1/21 Sunday (Comment)
こんばんわ~。 😀
>MVC化の前に、1度まとめ記事も書きたいですね。今のだと大雑把過ぎなので。
おお!楽しみにしています。 😮
もしよければ、JSeries のホスティングリソースも使えますので、なにかありましたらご連絡いただければと思います!。 -
From: よしとも - 2007/2/1 Thursday (Comment)
おはようございます
すみません。先にMVC化始めちゃいました:oops:
思いついた機能がいろいろあって、そのためのリファクタリングしてたらクラスも分けたほうがいいなという結論に。
というわけで、公開は今週末か来週くらいになりそうです:mrgreen:>もしよければ、JSeries のホスティングリソースも使えますので
始めてから1ヶ月経ってない新人デベロッパーでもよかったらお願いします:mrgreen: -
From: ひろまさ - 2007/2/1 Thursday (Comment)
そうなんですよね~、プラグインでも大きくなると、わけたほうが便利になってきますね。 ぼくも試行錯誤の後にたどりつきました ❗
ぜひぜひ、WP プラグイン仲間になってください。
From: tumblrの画像を表示させるウィジェットの作成。 « 乱雑モックアップ - 2010/4/24 Saturday (Pingback)
[…] hiromasa.zone ) » 管理画面のある WordPress プラグインの作成方法 […]