hiromasa.zone : o)

2007/1/20 Saturday 投稿時の月齢:1.0  月名:二日月  潮汐:大潮 Moon:1.0[二日月]今日の心技体 : 低調期低調期好調前不安定期

管理画面のある WordPress プラグインの作成方法 このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加

日記 - 晴時々雪(0/-4) ひろまさ @ 3:53

最近日本の方の WordPress プラグインもずいぶん増えてきて、同じことをしている人間としては嬉しい限りです。 🙂

ぼくも何本か書いてきて、ようやく勘所のようなものがつかめてきたのでちょっとプラグイン作成のノウハウなんかをエントリしてみたいと思います。

いや、最初のころはずいぶん苦労したんです。。 なにができなかったって、PHP を知らなかった。 最近だいぶ”ソラ”でかけるようになってきましたが、まだまだ語彙が少なく、できる方から見ればなんだこりゃ、なんだと思うんですが…。

でまぁ、知らなくてもノリでできちゃうのがスクリプト言語の良いところ。 ここでは、「管理画面のある WordPress プラグインの作成方法」を書いてみたいと思います。

管理画面の追加の方法は分かるとして、問題はデータの保存とプログラムの構造。 経験的に以下の構造にすると、ストレス無くコードをかけるような気がします。 まずはクラスを 3 つつくります。

  1. WordPress とインターフェースするクラス (ex. class WpHoge)
  2. データを処理するクラス (ex. class WpHogeModel)
  3. 管理画面の HTML を出力するクラス (ex. class WpHogeView)

プログラムの構造はいわゆる MVC の構造をとるわけですが、あんまり厳格にやると、一般的な WP のプラグインの規模くらいでは逆に面倒になりますのでその辺は適当に… 😛

class WpHoge は、WordPress とのインターフェースを書きます。 プラグインメインロジックと WordPress の仲介をするコントローラクラスですが、要は WordPress のコア関数を呼ぶのはなるべくここだけにします。(たとえば、多国語化すると WpHogeView に __、_e をかかなければならないのとかは愛敬。 WpHoge でラップしてもいいけど、そこまでは…)

今回書きたかったのは、以下から。 管理画面で設定するオプションデータの保存処理の方法のノウハウです。

class WpHogeModel には、メイン処理、いわゆるビジネスロジックを書きます。

データ保存をするときのポイントは、このオブジェクトの状態をそのまんま WP のデータベースに保存すること。 オブジェクトを復元すれば、次回同じ状態(設定したオプション値など)をうまく再現できるわけです。 では仮に WpHogeModel を以下のように定義します。

  1.  class WpHogeModel {
  2.     
  3.    // メンバ変数
  4.      $oprion = array();
  5.     
  6.    // コンストラクタ
  7.      function WpHogeModel() {
  8.          $option['保存したいオプション1'] = 初期値;
  9.          $option['保存したいオプション2'] = 初期値;
  10.          $option['保存したいオプション3'] = 初期値;
  11.      }
  12.     
  13.    // 処理
  14.      function syori() {
  15.          $this->$option['保存したいオプション1'] = 更新値;
  16.      }
  17.     
  18.  }

保存したいオプション値をメンバ変数にして、オブジェクトを new した時唯一実行されるコンストラクタには、保存したいオプション値の初期値を書いておきます。 で、あとはオプションのメンバにアクセスしつつ適当に処理を書きます。

次に WP の領域でインスタンス化するコントローラ class WpHoge の中で、この class WpHogeModel のインスタンスをつくります。

でもって、インスタンス化した class WpHogeModel を”ごっそり”シリアライズして WP に登録してしまいます。(初回) もし、すでに WP に登録があるようであれば、シリアライズされたデータからインスタンスを復元します。(2回目以降)

2回目以降インスタンスの復元時は、new されるわけではないので class WpHogeModel のコンストラクタは働かず、オプションは初期化されずオプションのメンバ変数が WP に登録された時点のものに復元されるわけです。 あとは、また通常通り Model の処理関数をコントローラから呼び出して処理を続行するだけです。

class WpHoge のデータ取得系の処理はたとえば以下のようになるでしょう。

  1.  class WpHoge {
  2.     
  3.      var $model;
  4.     
  5.    // コンストラクタ
  6.      function WpHoge() {
  7.         
  8.          $this->model = $this->getModelObject();
  9.          $this->model->syori();
  10.         
  11.      }
  12.     
  13.    // モデルオブジェクトの作成
  14.      function getModelObject() {
  15.         
  16.        // WP からオプション所得
  17.          $option = $this->getWpOption();
  18.         
  19.        // Model のクラスが登録されていたらそれを復元
  20.          if(strtolower(get_class($option)) == strtolower('WpHoge')) {
  21.              $model = $option;
  22.          }
  23.        // なかったら(初回) 新しく Model インスタンスつくって WP に登録(writeWpOptionは省略)
  24.          else {
  25.              $model = new WpHoge();
  26.              $this->writeWpOption($model);
  27.          }
  28.         
  29.          return $model;
  30.         
  31.      }
  32.     
  33.      function getWpOption() {
  34.         
  35.          $option = get_option('オプション登録名');
  36.         
  37.          if(!$option == false) {
  38.              $OptionValue = $option;
  39.          } else {
  40.              $OptionValue = false;
  41.          }
  42.         
  43.          return $OptionValue;
  44.         
  45.      }
  46.  
  47.  }

あとは、管理画面からの更新などをきっかけとして、コントローラが Model をコントロールしつつ適切なタイミングで WP に add_option、update_option すれば OK です。 これらの関数はオブジェクトが引数に渡されると勝手にシリアライズしてくれます。

この方式をつかうと、オプションの保存/取得が 1 query になりますし、なにより “楽” です。 wp-kumonosu がこの方式で動いていますので、興味がある方はコードをみてみてください。

wp-kumonosu では管理画面からの http リクエストをコントローラで Model に振り分け処理を進めていっています。 Model で直接 WordPress の DB に SQL 発行しちゃったりして、厳密に言うとちゃんと MVC になっていないのですが、まぁひとりで作るくらいの規模なのでいいんじゃないっすか 😛

みなさんそれぞれのコーディングスタイルがあると思うので、これがいいってわけでもないのですが、もし管理画面付きプラグインでコードが煩雑になって困っている方のご参考になったら。

9 Comments

Trackback

  1. From: tumblrの画像を表示させるウィジェットの作成。 « 乱雑モックアップ - 2010/4/24 Saturday Morning (Pingback)

    […] hiromasa.zone ) » 管理画面のある WordPress プラグインの作成方法 […]

Comment

  1. From: miyoshi - 2007/1/20 Saturday Morning (Comment)

    すばらしい 😀 すごく参考になります!
    続編期待してます。

  2. From: ひろまさ - 2007/1/20 Saturday Nighttime (Comment)

    miyoshi さん、こんにちは。 😀

    どうもありがとうございます!。 ネタがふえたらまた書きますね。 😉

  3. From: よしとも - 2007/1/21 Sunday Nighttime (Comment)

    はじめまして。ちょうど管理画面のあるプラグイン作成に初挑戦中なので、ナイスタイミングです:grin:
    PHPは1年ほど経験がありますが、プラグインは未知の領域なので四苦八苦しています。やっとまともな形になってきましたが、ひろまささんが過去に書かれたプラグイン作成の記事が大いに参考になったことは間違いないと思っています。

    プラグインの仕様が固まったら、この記事を参考にMVC化に挑んでみたいものです。

    # 1つ目のコードの4行目にtypoが・・・。

  4. From: ひろまさ - 2007/1/21 Sunday Daytime (Comment)

    よしとも さん、こんにちは。 😀

    実はよしともさんの記事を拝見していまして、、影響を受けてぼくも書いてみようと思ってエントリした次第でした。 😳

    wp-EntryKeyword、楽しみにしています!
    今後ともよろしくお願いいたします。

    # へなへなになる typo ですね。。 記念に残しておきます。 😳

  5. From: よしとも - 2007/1/21 Sunday Daytime (Comment)

    こんばんわ

    >実はよしともさんの記事を拝見していまして、、影響を受けてぼくも書いてみようと思ってエントリした次第でした。

    なんと:shock:
    自分の記事が新たな記事のきっかけになるのってうれしいものですね。励みになります。

    プラグインのほうは、この調子だと今週末くらいにはひとまずベータ版として公開できそうな感じです。もう1つ2つ機能を足して、そのあと動作チェックといったところです。
    MVC化の前に、1度まとめ記事も書きたいですね。今のだと大雑把過ぎなので。

  6. From: ひろまさ - 2007/1/21 Sunday Nighttime (Comment)

    こんばんわ~。 😀

    >MVC化の前に、1度まとめ記事も書きたいですね。今のだと大雑把過ぎなので。

    おお!楽しみにしています。 😮
    もしよければ、JSeries のホスティングリソースも使えますので、なにかありましたらご連絡いただければと思います!。

  7. From: よしとも - 2007/2/1 Thursday Daytime (Comment)

    おはようございます

    すみません。先にMVC化始めちゃいました:oops:

    思いついた機能がいろいろあって、そのためのリファクタリングしてたらクラスも分けたほうがいいなという結論に。
    というわけで、公開は今週末か来週くらいになりそうです:mrgreen:

    >もしよければ、JSeries のホスティングリソースも使えますので
    始めてから1ヶ月経ってない新人デベロッパーでもよかったらお願いします:mrgreen:

  8. From: ひろまさ - 2007/2/1 Thursday Nighttime (Comment)

    そうなんですよね~、プラグインでも大きくなると、わけたほうが便利になってきますね。 ぼくも試行錯誤の後にたどりつきました ❗

    ぜひぜひ、WP プラグイン仲間になってください。 :mrgreen:


このサイトはコンテンツをフリーズしました。トラックバック・コメントは閉じられています。

新しいサイトは、

hiromasa.another :o)

です。 :-)

このサイトについて

このブログは引っ越しを行いコンテンツはフリーズしています。hiromasa.anotherへどうぞ。

Powerd By WordPress

We (Heart) WordPress

WordPressME Logo
WordPress Plugins

ブログ内検索

Todays Popular

WordPress Ring

はてなリング - WordPress -

情報

31 queries. 0.354 seconds.

このページの先頭へ