先日「管理画面上からPHPを自由に動かせるのは危ないよ」という記事を書きましたが、「条件分岐をさせたいから記事内でPHPを動かしたい。」という声もちらほら見られたとか見られていないとか。

そこで記事内で条件分岐ができるショートコードができそうなので書いてみました。
ちなみに条件分岐をしたくてExec-PHPとか入れていた方向けなので、PHPを使える方を対象とした中~上級者向けの記事です。

コードと概要、使い方

なんでもかんでも好きな条件で変更できるのではなく、以下の条件分岐に対応しています。

  • WordPress Codexに書かれている条件分岐(この記事を公開した時点で実装されている分岐)
  • wp_is_mobileによるスマートフォンとPCの分岐(要:WordPress 3.4以上)
  • 公開開始日時と終了日時
  • ランダム表示(ABテスト用?)

下のようにリンクをランダムに切り替えたりできます。分岐後は他のショートコードも使えるんですよ。



Facebook

Facebook

はてブ数

http://www.facebook.com/

Facebook



ショートコードを実装する

以下のコードをfunctions.phpに記述してください。

【コード修正】
32行目:
(変更前)foreach($opt as $func => $arg){
(変更後)foreach((array)$opt as $func => $arg){

プラグインでやれって感じの長さですね。まぁ気にしない。

使い方

まずは簡単な使い方から。

日付の指定

○年○月○日以降に表示

PHPのdateフォーマットでstart属性を指定します。

○年○月○日から×年×月×日まで表示

start属性とend属性を指定します。

時間も指定

もちろん、何時何分以降まで指定できます。

ランダムに表示させる

ランダムに表示させるにはrand属性を指定します。値を入れなければ 1/2の確率で分岐、値を入れるとP%の確率で表示されます。

WordPressの条件で分岐させる

WordPress Codexの条件分岐で分岐ができます。

分岐を否定する

WordPressの条件文は関数の頭に”deny_”をつけると否定できます。

複雑な条件分岐

elseに条件分岐を付与したりといった複雑な条件分岐も可能です。

詳細な日時の指定

日付は指定せずに何時~何時まで表示という指定もできます。

  • 年(start_year/end_year)
  • 月(start_month/end_month)
  • 日(start_date/end_date)
  • 時間(start_time/end_time)

これらの属性に数値を指定します。

条件分岐の入れ子

条件分岐内に書かれたショートコードは実行されますが、終了タグなどの仕様の関係でこの記事のショートコードのifは使えません。しかし{if}~{/if}というタグで記述すると実行させることができます。

ちなみに条件分岐の中で使える条件分岐は1階層まで。下みたいに入れ子を深くすると動作がおかしくなっちゃうので気をつけて。

果たして需要はあるのかと

記事内での条件分岐に需要があるか謎ですが、ショートコードでこんなこともできますよ!ってことで。ランダム分岐あたりはABテストで使えるなぁと思います(そこそこの母集団がないと偏りますが)。

曜日指定もできるようにしようか悩んだけどそれをすると祝日にまで対応しないといけない気がするのでやめときました(‘A`)

と、いろいろデバッグはしてみたつもりですが結構ささーって書けたのでなんか怖い…
バグがあれば報告してくれると喜びます( ゚д゚)

何か一言あれば!!

質問とかツッコミとかお気軽にコメントしてください。がんばって返します。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

9 件のコメント

  1. ピンバック: スマホに対応 | やっぱり、いたちいぬが好き

  2. ピンバック: [WordPress]ダッシュボードの使い勝手を向上させるカスタマイズTIPS 10|ウェビメモ

  3. 同じようなものを作成しようと調べていたら。
    高機能ですばらしいです。使わせていただきます。
    1点、日付・時刻の判定の際に、現状ですと標準時間での判定になってしまっていましたので、
    date_default_timezone_set(get_option(‘timezone_string’));
    でタイムゾーンを変更するか、
    date(‘Y’) などで現在の日時を取得している部分を
    date_i18n(‘Y’) に変更するとうまくいきました。

  4. date_default_timezone_set を使わない場合は
    日付判定部分も
    $ts1 =time();
    $ts1 =strtotime(get_option(‘gmt_offset’).’hours’);
    にする必要がありました。

    1. よっしー 投稿作成者

      はみ様
      こんばんは!
      ありがとうございます。
      ご指摘の通り、日付の処理がサーバーの環境によって変わりますね…
      WordPressで実装されている関数を利用するのが望ましいと思われるので修正いたします。

  5. こういうのを探してました!ウィジェットでもちゃんと動いていて素晴らしいですが、
    ▲▲▲
    のような「複雑な条件分岐」使い方をするとうまくいきませんでした。

  6. 半角でショートコード書いたら送信失敗しましたので再送です。
    こういうのを探してました!ウィジェットでもちゃんと動いていて素晴らしいですが、
    [if is_single=”1″]■■■[else is_single=”10″]●●●[else]▲▲▲[/if]
    のような「複雑な条件分岐」使い方をするとうまくいきませんでした。
    まぁあまり想定されてない使い方かもですが・・・。