こんにちは、しょごです。
最近『バイオハザード7』をプレイしました。シリーズ初の一人称視点アイソリュートビューを取り入れて恐怖を題材とした作品に仕上がっている本作を、驚かされることにまったく耐性がないウチがプレイしたところ、最後の最後までひどい悲鳴をあげてのプレイになってしまいました。。
一人でプレイするのが怖かったので、YouTube にてブロードバンド配信しながらプレイしまして、誰かしか人が見てる状態でやれば少しはマシにプレイできるかと思いましたが、悲鳴が上がらないことがなかったですね。。お暇であれば見てみてください。。よく妻に怒られなかったなぁ。。
さて、世の中には YouTube をはじめ、いろいろな Web システムやサービスがありますよね。
そんななかで イースターエッグ って言葉を聞いたことがありませんか?
LIG ブログでも以前、有名イースターエッグのまとめ記事を掲載していたんですよ。
VOGUEやBuzzFeedも!イースターエッグ(隠しコマンド)が仕込まれたWebサイトまとめ
今回は少々頭が沸いたので、ちょっとしたロジックを WordPress のプラグインとして設置実行してみることで「プラグインの作り方を学んだよ」ってお話をしようと思います。
イースターエッグとは
イースターエッグとは、本来の通常操作以外の特殊な操作を行ったり、一定の条件が揃うとサービスにまったく関係のない仕組みが発動するっていうプログラマーのちょっとした遊び心によるお茶目な機能ですね。とあるサイトで某コナミコマンドを入力してみたり、ソースを見てみるとアスキーアートで文字や絵が書いてあったりなどなど。。
エンジニアとしては、そんなイースターエッグにちょっとした憧れみたいなものがありまして、「スキあらばなんかしたろうかしら……」と思っているところです。
そんなとき、とある案件でちょっとしたチャンスが訪れたので、試しに仕込んでみることにしました。
ただ、そのままロジックを仕込むだけだと芸がないし、何よりメインルーチンに食い込む形で仕込んでしまうと、機能を取り下げる際に改修する手間がかかっちゃいますよね。。
それならば、いっそメインルーチンはそのままにして、やりたいことロジックのみをプラグインとして構築し、メインルーチンに割り込ませる形にしてはと思いました。
要は「ヤバい」と思ったらプラグインを無効化するだけで、その機能をなくすことができるわけです。で、最小限の動きで何もなかったように斜め上の方向を見ながら口笛をスピースピーとしていられるのです!(許可は取る動きはありましたからね! か、勘違いしないでよね!)
メインルーチン概要
まず機能概要ですが、キャラクターがおしゃべりをするセリフを WordPress で管理させます。セリフは投稿で増減させることができ、ランダムで投稿を取得して本文に登録したテキストを呼び込むというシンプルなもの。
そこで、とある条件下においてこのキャラクターがまったく関係のないセリフを喋るっていうのを考えました。急に『天空の城ラピュタ』のムスカの台詞や、『ラブライブ!』のキャラの台詞などを宣ったらめっちゃ面白くないですかっていう。まさにジャストアイデア、ええこのときは単に頭沸いてたんだと思います。。
メインルーチンは get_posts でデータをランダムで取得して echo する形なので、
function getData(){ $data = get_posts(array( "post_type" => "xxxx", "posts_per_page" => 1, "orderby" => "rand", "order" => 'DESC' )); return $data; }
という感じになりますね。
何もなければこの関数を叩けばランダムで一件投稿を取得するので、本文に投稿されたデータを喋らせることができます。
ところでプラグインってどうやって作るの?
プラグインで行ってみようと思ったことのひとつとして、独自のフィルターフックを作ることができればデータの改変を簡単に行えるのでは?という考えがありました。
世に出ている数々の素敵プラグインも、すでに存在しているフィルターフックを利用しているものもあれば、プラグイン独自のフィルターフックを用意しているものもあり、
利用者が使いやすい形にしたりと自由にカスタマイズすることができています。
そこで疑問。
-
・そもそもプラグインとして管理画面で管理するにはどうやって記述すればいいの?
・独自フィルターフックってどうやって書くの?
ってことでした。
まずは、こちらを解消していきましょう。
プラグインを管理画面で管理させてみる
やり方はカンタンで、wp-content/plugins に下記の php ファイルを置くだけでした。php ファイル単体だと見栄えが単調だったので、ディレクトリに切って設置するといいと思います。
<?php /* Plugin Name: Original Plugin Plugin URI: https://liginc.co.jp/ Description: プラグインの説明文を記載します。 Version: 1.0 Author: しょごたん Author URI: https://liginc.co.jp/member/member_detail?user=tokuyama */ // 処理を記載
これだけ!
このファイルを wp-content/plugins/ にアップロードするとだけで管理画面でこのように表示されます。
あら簡単。。。
未だに「このコメントアウトで記載したら適用される」ってのになれません。。
が、このように表記するだけで管理画面の有効無効の箇所に表示できます。不必要な部分は削除すれば表示されませんので、Plugin URI や Author URI など「遷移先はないよ!」って場合は削除してください。Version とかつけるとなんかそれっぽくなるので、テンションあがりますね、デュフフ。
独自フィルターフックを設けてみる
早速特定条件下でデータを上書きするようなものを記載してみます。今回の特定条件は、例として
-
・1 / 400 の確率で当選した後、50% の確率で当選フラグを取得した場合 true
としました。
今は亡きマックスタイプですね。
function checkMaxType($data) { $rand = mt_rand(1, 400); if ($rand == 1) { $rand2 = mt_rand(1, 100); $hantei = null; $tmp = 0; if($rand2 <= 50){ $data = getMaxType($data); } } return $data; } //マックスタイプで当選した場合はこちらを返す。 function getMaxType($data) { $data->post_content = <<<SHOGO 空前絶後のォォ超絶怒涛のマスコットォ!プリティを愛しップリティに愛された男ォオオ!<br> 実は一定の確率でテンションが上がりまあああああす!!<br> 全てをさらけ出したこの俺はアァ!!ショ!!ゴッ!!(ボコォ)タアアアン!!!<br> イェェェイッ!!ジャスティス!!<br> SHOGO; return $data; }
ただこれだけではこの処理が割り込めません。
そこで、メインルーチンに下記の関数を仕込みます。function getData(){ $data = get_posts(array( "post_type" => "xxxx", "posts_per_page" => 1, "orderby" => "rand", "order" => 'DESC' )); // オリジナルフィルターフック作成 $data = apply_filters("insert_hack_data",$data); return $data; }
こうすることで、return 前の $data に対してフィルターフックをかけることができます。
プラグインの関数を上記で記載した insert_hack_data に対して、フィルターフックをかける形を記載します。function checkMaxType($data) { $rand = mt_rand(1, 400); if ($rand == 1) { $rand2 = mt_rand(1, 100); $hantei = null; $tmp = 0; if($rand2 <= 50){ $data = getMaxType($data); } } return $data; } add_filter("insert_hack_data","checkMaxType"); //マックスタイプで当選した場合はこちらを返す。 function getMaxType($data) { $data->post_content = <<<SHOGO 空前絶後のォォ超絶怒涛のマスコットォ!プリティを愛しップリティに愛された男ォオオ!<br> 実は一定の確率でテンションが上がりまあああああす!!<br> 全てをさらけ出したこの俺はアァ!!ショ!!ゴッ!!(ボコォ)タアアアン!!!<br> イェェェイッ!!ジャスティス!!<br> SHOGO; return $data; }
こちらで完成です。
これでこのプラグインを有効化させると特定条件において変なセリフが表示されるイースタエッグプラグインの完成ですよ!ヒャッハー!
まとめ
いかがでしたか。
内容はともかくとして WordPress プラグインを作ることは意外とカンタンでした。また、独自フィルターフックを活用することで それまで利用していたルーチンに対して最小限の形で機能付与もできるのです。いろいろと夢が広がりますね! デュフフ、コポォ。
ごあした!
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。