投稿日:

WP Over Network をリリースしました。


banner-772x250-and-title

WordPress のマルチサイト機能を使う時に、役立つかも知れないプラグインを WordPress.org の公式プラグインディレクトリにリリースしました。

今後のリリースは GitHub が最新版となって、安定したら公式ディレクトリに公開していく予定です。以下、概要を説明します。

続きを読む WP Over Network をリリースしました。

投稿日:

CakePHP 2.x で Entity オブジェクトを使えるプラグイン — FkRecordModel


昨年ぐらいから CakePHP 2 を本格的に触ることになりまして、これまでの Paper ドライバーを卒業と喜んでいたんですが、いきなりつまづいた…というか不満に思ったのが Model の構造でした。CakePHP も 2 となり、もうてっきり Rails の ActiveRecord のようなものになっているかと思いきや、find メソッドが返すものは相変わらず array だったんですね。これはもう思想なのかも?…とはいえ、Paper ドライバーレベルではなかなか思想まで理解できません。同じような不満が出ていないかと検索してみたところ、次の記事が見つかりました。

同じことを思う方はいるもので♪ 早速、上のプラグインを利用させていただいたのですが、どうも CakePHP 2 系では上手く動かないようでしたので、修正を試みたものの、挫折。せっかくだからということで、自分で作ることにしました。これでも自称フレームワークマニアですしねw

その成果物がここで紹介する FkRecordModel です。GitHub に公開中です。

次のような簡単な構成になっています。

  • FkRecord        エンティティオブジェクト。find メソッドなどの戻り値などになります。
  • FkRecordCollection  findAll などの戻り値となります。
  • FkRecordModel  拡張された Model クラスです。FkRecord 生成の為に find などをオーバーライドしています。

次のような機能があります(特に高機能ではありません)。

  • FkRecord::save() で保存
  • FkRecord::validates() でバリデーション
  • FkRecordModel::build() 新しい FkRecord のビルド
  • エンティティフィールドのシンプルなアクセス。Ex. $post->title
  • Validation error は FkRecord が保持し、View で参照可能
  • HTML のラベルの表示などに利用できるフィールド別名のサポート(VerboseName)
  • リレーションを FkRecordCollection で取得。Ex. $post->tags //hasMany のデータの取得

上述の CakeEntity プラグインとの相違点は多々とあると思いますが、とりあえず大きなところで、本プラグインは「CakePHP の通常通り配列を返す」という選択肢を設けていません。find 系メソッドは常に FkRecord または FkRecordCollection を返します。(自分はたぶん使わないからです。ごめんなさい)。また、FkRecordCollection は不要だったり邪魔だと思われる方も我慢してください(イテレータにしておくと色々と便利という信条です)。ちなみに、FkRecordCollection::sort() メソッドには不満があります(削除または改良したいです。どなたか良い案ください)。

以下、簡単な利用例です。

AppModel の定義

まずは以下のように AppModel の super クラスとして本プラグインのクラスを利用します。AppModel の他に、AppRecord も作成してください。FkRecordCollection は全てのモデルで共通に利用されます。

具象モデルクラスの定義

モデルクラスでは、それぞれのモデル毎に、Model と Record を定義します。Model の定義は通常通りですが、verboseName などの指定ができます。Record にはエンティティオブジェクトで提供したい機能を実装してください。自らのフィールドへのアクセスは、$this->fieldName または $this[$alias][$fieldName] です。

Controller での利用例

Controller での利用は次のような雰囲気になります。$post->save() のようにして保存します。FkRecord::save() メソッドは、バリデーションエラーがある時には、false を返します。バリデーションエラーの内容はエンティティオブジェクトが保持し、これは View の中で利用できます。

View での利用例(一覧表示)

FkRecordModel に定義された関連は、$post->tags のようにして FkRecordCollection/FkRecord として取得できます。なお、FkRecordCollection は empty($posts) のように空判定できません。FkRecordCollection::isEmpty() メソッドを利用してください。

View での利用例(編集画面)

フォームを扱うには、FkRecord::bindFormHelper() メソッドで FormHelper をエンティティにバインドし、以後、$post->Form->text($fieldName) といった感じでフォームエレメントを出力できます。FkRecord::getVerboseName($fieldName) でフィールドの別名を取得できます。FkRecord::getError($fieldName) で、そのフィールドにエラーがあれば、その内容を取得します。

 

以上、簡単にですがご紹介まで。

もし奇特な方がいらっしゃいましたら、一度ご利用いただき、是非フィードバックなどを頂けたら嬉しいです! 是非! 是非!

 

投稿日:

WordPress プラグインの作り方(WP初級のPHPerさん向け)


WordBench神戸

最近まで「WordPressって何?」って感じだった僕ですが、今更ながらに WordPress を使ってみています。今日は、WordBench 神戸の勉強会にて教わったプラグインの作り方をまとめてみました。

お題は「顔文字チェンジャー」!

記事本文の内容の中の「。」のテキストを任意の顔文字に置換しちゃう楽しいプラグインです。なお、本記事は PHP は分かる人向けに書いていますー。

プラグイン制作の準備

WordPress プラグインは、/wp-content/plugins/ ディレクトリ内に作成します。
ここでは、/wp-content/plugins/moji-changer/ を作成します。またそのディレクトリ内に、プラグインディレクトリと同名のファイル、moji-changer.php を作成します。
結果、以下のようなディレクトリとファイルが出来ます。

moji_changer.php を開いて、スクリプト冒頭に、下記のようなメタ情報を書きます。

まずこれだけで WordPress はこのプラグインを認識してくれるですね。
管理画面でプラグインの一覧に表示されているので確認できます。

この状態で、プラグインを有効化しておいてください。

でもこれだけだともちろん何も起こらないです。
行いたい処理を追加していきます。

記事本文のテキストを加工してみる

上のメタ情報の下に続けて、以下のコードを書いてみます。

add_filter

フィルターフックを登録する WordPress の関数です。

第1引数にフックの種類を登録します。ここでは、the_content を指定しています。
‘the_content’ は、記事本文が画面表示される前に呼び出されるフックの指定です。

第2引数は、そのフックで実行される関数を指定します。
ここでは、moji_changer_content_filter を登録しています。
そして、ここに登録した名前の関数を自分で作成します。

moji_changer_content_filter

この関数は、$content で記事本文のテキストを受け取って、「。」を「 (*´艸‵*)ウフッ♪」の顔文字に変換して返しています。

これで OK です。
ブログの記事画面を開いてみると、記事中の「。」が「 (*´艸‵*)ウフッ♪」になって、なんだか素敵なブログになっていると思います。

add_filter について、詳しくはコチラ:
http://wpdocs.sourceforge.jp/関数リファレンス/add_filter

管理画面ヘの設定ページの追加

変換される顔文字を、管理画面で設定出来るようにしてみましょう。
上記のコードに続けて、次のコードを書いてみます。

これだけで、管理画面をリロードすると、サイドバーにメニューが追加されます。また、メニューをクリックすると、「設定画面をここに書くよ!」と表示されます。

ここで、add_action、add_menu_page は、WordPress の関数です。moji_changer_admin_menu は、管理画面を登録する関数で、moji_changer_edit_setting は、設定ページの本体を出力する関数です。

以下、順に見ていきます。

add_action

アクションフックを登録する WordPress の関数です。
第1引数にフックの種類を登録します。ここでは、admin_menu を指定しています。‘admin_menu’ は、管理画面メニューの基本部分が配置された後に実行されるフックの指定です。

第2引数は、そのフックで実行される関数を指定します。
ここでは、moji_changer_admin_menu を登録しています。

add_action について、詳しくはコチラ:
http://wpdocs.sourceforge.jp/関数リファレンス/add_action

moji_changer_admin_menu

上述の add_action での登録で呼ばれる関数です。
ここでは、add_menu_page を呼び出し、管理画面メニューを追加しています。

add_menu_page

管理画面にカスタムページを追加する WordPress の関数です。
第1引数は、追加するカスタムページの名前です。
第2引数は、カスタムページへアクセスするためのメニューの項目名。このメニューは、管理画面サイドバーのトップレベルに表示されます。
第3引数は、カスタムページを利用できる権限の制限。ここでは、administrator で管理者とします。
第4引数は、(たぶん)カスタムページを特定する名前。つまり、url パラメータになります。
第5引数が、(やっと)管理画面の本体となる関数です。管理画面の内容などを出力します。

…なんか長くなりましたが、要するに↓みたいな感じですね♪

 add_menu_page について、詳しくはコチラ:
http://codex.wordpress.org/Function_Reference/add_menu_page

moji_changer_edit_setting

最後に、管理画面本体となる関数です。
管理画面の画面表示を行ったり、データの保存や読み出しなど必要な処理を行います。ここではとりあえず、echo で「設定画面をここに書くよ!」と出力しているだけですが、これによって、管理画面に「設定画面をここに書くよ!」と表示されました。

わぉっ。簡単だ!

管理メニューの追加について、詳しくはコチラ:
http://wpdocs.sourceforge.jp/管理メニューの追加

管理画面で実際に設定できるようにする。

さて、管理画面で実際に設定できるようにしてみますが、これもすごく簡単です。上で書いた moji_changer_content_filter と moji_changer_edit_setting の2つの関数を、以下のように書き換えてみます。

フォームの action を空にしているので、設定画面の表示時にも、顔文字の登録時にも、いずれも同じ moji_changer_edit_setting 関数がコールされることに注意すると、PHPer なら動作は容易に想像できると思います。

get_option、update_option

ここで、get_optionupdate_option という2つの新しい WordPress の関数が登場しています。これは、WordPress の単純なデータストア API です。

という書式で、データを保存したり、取り出したりできます。

こういう単純な API があると便利ですね!
注意点として、キー名は WordPress 全体で共通なので、他のプラグインや機能と重複しないように注意して設定する必要があります。

これで、管理画面に顔文字を登録するフォームが完成し、[登録] ボタンから顔文字の変更が出来るようになりました。驚くほど簡単です!

以下、ここまでのコードをまとめて掲載します。

発展

わくわく楽しいプラグインが出来ました♪
何か鬱憤がたまったら、プラグインを有効化して変な顔文字いっぱいのブログにしてスッキリしてやります。

そこで、もうすこし自由度を増すために、もう少しだけプラグインを改造してみました。名前も、「顔文字チェンジャー」改め、「文字チェンジャー」です。

php のファイルは以下の2ファイルになりました。

moji-changer.php

 setting.html.php

以上です。

大きな変化はありませんが、WordPress 的なポイントとしては、get_option、update_option 関数が、単純なプリミティブな値以外にも、配列などを保存できるということです。これは素敵。便利ですねー!