さて、
今日はとてもいいことがありました。
WordCamp神戸ライトニングトークのスライド:WordPressの管理画面を徹底カスタマイズ!!でご紹介したのをプラグイン化して、管理画面をかわいくできるツールを作っていた時に、自分で書いた下記のコードがだらだらに長くてTwitterで聞いてみました。
http://twitter.com/#!/shinichiN/status/113883259829628928すると、@jim0912さん、@lilyfanjpさん、@wokamotoさんが次々といろんな知恵を貸してくれて、その延長上でいろんなことが勉強になりました。
僕が書いたコードは下記。
if ( $_POST['cawaii_desuka'] == 'yes' ) { if ( isset($_POST['bg_css']) ) { $bg_css = $_POST['bg_css']; } if ( $bg_css == 'bg_brown' || $bg_css == 'bg_check' || $bg_css == 'bg_none' ) { update_option('bg_css', $bg_css); } }
- まず、hiddenでPOSTした
name:cawaii_desuka,value:yes
がちゃんとあれば下記をやる。 - bg_cssがポストされていれば$bg_cssに代入
- $bg_cssの値が、bg_brown, bg_check, bg_noneの時だけ、データベースに値を保存する
というシンプルな処理です。
8行かかっています。
bg_cssという名前からわかるように、管理画面の背景の画像を管理画面で選択できるようにするもので、これと同じようにリンクの色、メニューの表示方法なども保存しなければならないので、2と3のステップはあと2回繰り返さなければならず、20行になります。
@jim0912さんの案
いつもお世話になっております@jim0912さんが、すごい速さで送ってくれました。
$post_data = stripslashes_deep( $_POST ); if ( isset( $post_data['cawaii_desuka'] ) && $post_data['cawaii_desuka'] == 'yes' ) { if ( isset( $post_data['bg_css'] ) && in_array( $post_data['bg_css'], array( 'bg_brown', 'bg_check', 'bg_none' ) ) ) { update_option( 'bg_css', $post_data['bg_css'] ); } }
6行なのですが、1行目と大外のifカッコはその後も使えるので、繰り返し書いたとしても、全部で12行になります。
$_POSTの配列をずっと配列のまま使っていくのがポイントでしょうか(合ってます??)。
in_array(‘検索対象’, ‘コレがあればtrueになる文字列や配列’)という関数も覚えました。
@lilyfanjpの一票
http://twitter.com/#!/lilyfanjp/status/113887169143259136update_option()だけであれば、options.php送りにすれば全部保存してくれるんですね。知りませんでした。@lilyfanjpさんもおっしゃってましたが、これだとデータベースに保存する値の検証ができないのが考えものでした。ただ、この場合確かに0行というすごい技です。。
@wokamotoさんの短いのと分りやすいの
Re: これ、どう考えてももっと短くなる気がしてならないの記事で教えてもらいました。
4行。2行目の配列を変数に収める所がなければ3行なので、3回やっても9行ですね。半分以下になりました!
if (isset($_POST['cawaii_desuka']) && $_POST['cawaii_desuka'] === 'yes' && isset($_POST['bg_css'])) { $bg_css = $_POST['bg_css']; preg_match('/^bg_(brown|check|none)$/', $bg_css) && update_option('bg_css', $bg_css); }
ただ、最初に僕が見た時、なぜこれで動いているのか全然わからないという、、、(T_T)。
http://twitter.com/#!/wokamoto/status/113898654191980544
という仕組みで、CやPerlなどでよく使われる書き方とのこと。
また、@wokamotoさんいわく、「短くすることだけを考えた変態コード」だそうですw
それと、分かりやすく書くならば、ということで提示してくれたのが、下記でものすごく分かりやすいです。
if (isset($_POST['cawaii_desuka']) && $_POST['cawaii_desuka'] === 'yes' && isset($_POST['bg_css'])) { $bg_css = $_POST['bg_css']; switch ($bg_css) { case 'bg_brown': case 'bg_check': case 'bg_none': update_option('bg_css', $bg_css); } }
これをみて、短いことの価値と、分かりやすくてあとから簡単に直せることの価値、というのがよく分かりました。
その後の談義
その後も、動的に内容が変更される場合はやっぱりin_array()が便利ということや(ちょっとまだ理解できてないですが。。)、hiddenのPOSTではなくてwp_nonce_field()とcheck_admin_referer()の関数を使って、よりセキュアに送信元を検証すべきであることにも話がおよびました。
あと、@odyssey氏による
http://twitter.com/#!/odyssey/status/113905884685549568
はまさにその通りだなぁ、と。
うーむむ。
なんというか、同じ事をやろうとしても、あとから変わる可能性や前後の文脈を考えると、違うやり方があり得て、毎回上手に選んでいくという、今の僕のいる場所よりも数歩上のプログラミングに触れたおもいでした。
コンピューターは感情のない01信号っていう見方もできるけど、知的でクリエイティブで個性の出るものなんだなぁ。
そういえば、WordPressのサイトには、code is poetry って書いてあるし、こういう感じのことなのでしょうか。
いろんなことを勉強した午後でした。ありがとうございます!
そして、プラグインの完成まではもう少しかかります。
合間合間にやるので時間がかかりますが、お待ちください!
コメント
コメント一覧 (2件)
[…] 助けてもらっている様子。 […]
[…] 例えば、分からないことがあって悩んでいたら、誰かが教えてくれるかもしれません。セキュリティについて不安があって質問すると教えてもらえるかもしれません(参考1、参考2)。 […]