ワードプレスの投稿ページや、固定ページ等のエディタ内で、一部を特定の期間だけ表示したいと思ったことはありませんか?
丁度そんな仕様が必要になったので、時限を仕込むショートコードを作成してみました。
コピペするだけで使用できるので、ぜひご覧ください。
ショートコード本体と仕様
まずはショートコードの中身をそのまま紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function limit_code($atts, $content = null){ $atts = shortcode_atts(array( "start" => null, "end" => null ),$atts); date_default_timezone_set("Asia/Tokyo"); $today = strtotime(date('Y-m-d H:i')); if(($atts[start]) && ($atts[end] == null)){ if($today >= strtotime(''.$atts[start].'')){ return $content; } } elseif($atts[start] && $atts[end]) { if(($today >= strtotime(''.$atts[start].'')) && ($today < strtotime(''.$atts[end].''))){ return $content; } } elseif(($atts[start] == null) && ($atts[end])) { if($today < strtotime(''.$atts[end].'')){ return $content; } } else { return $content; } } add_shortcode('limit','limit_code'); |
中身はこんな感じです。
今回の仕様として、
・すぐ表示され、特定の日時に消える
・特定の期間中だけ表示
この3パターンに対応しています。
これで網羅できてますよね。。?笑
使い方と使用例
まず、前述のコードをテーマフォルダにあるfunctions.phpに追記します。
次にエディタの中でショートコードを書くのですが、今回は囲み型のショートコード なので、時限を仕込みたい箇所をコードで囲みます。
そして、設定したい期間をY-m-d H:iの形式で引数に当てる、といった感じなのですが、言葉で説明すると難しいので具体例を紹介します。
使用する際の注意が2点あるので、それを確認した上で使ってください。
特定の日時に表示させる場合
エディタに以下のように記述しましょう。
(見やすくするために改行していますが、そこはお好みで調整してください。)
1 2 3 |
コードを入力することで [limit start='2019-09-14 12:00']ここだけ2019年9月14日の12時に表示されます。[/limit] それまでは表示されません。 |
startの中に表示したい日時を上記のフォーマットに合わせて記入します。
上記の場合の出力結果として、
2019年9月14日の12時までは
それまでは表示されません。
と出力され、2019年9月14日の12時からは
ここだけ2019年9月14日の12時に表示されます。
それまでは表示されません。
と出力されます。
今回は終了日時は入力していないので、それ以降は出続けます。
特定の日時で非表示にする場合
エディタに以下のように記述しましょう。
(見やすくするために改行していますが、そこはお好みで調整してください。)
1 2 3 |
コードを入力することで [limit end='2019-09-14 12:00']ここだけ2019年9月14日の12時に消えます。[/limit] それまでは表示されています。 |
endの中に非表示にしたい日時を上記のフォーマットに合わせて記入します。
上記の場合の出力結果として、
2019年9月14日の12時までは
ここだけ2019年9月14日の12時に消えます。
それまでは表示されています。
と出力され、2019年9月14日の12時からは
それまでは表示されています。
と出力されます。
今回は開始日時は入力していないので、それまではずっと出ています。
特定の期間中だけ表示する場合
エディタに以下のように記述しましょう。
(見やすくするために改行していますが、そこはお好みで調整してください。)
1 2 3 4 5 |
コードを入力することで [limit start='2019-09-14 12:00' end='2019-09-15 0:00'] ここだけ2019年9月14日の12時から2019年9月15日の0時まで表示されます。 [/limit] それ以外の期間は表示されません。 |
startの中に開始日時を、endの中に終了日時を上記のフォーマットに合わせて記入します。
上記の場合の出力結果として、
2019年9月14日の12時までは
それ以外の期間は表示されません。
と出力され、2019年9月14日の12時から2019年9月15日の0時までは
ここだけ2019年9月14日の12時から2019年9月15日の0時まで表示されます。
それ以外の期間は表示されません。
と出力されます。
さらに、2019年9月15日の0時を過ぎると
それ以外の期間は表示されません。
という出力に戻ります。
仕組みの解説
ここからは詳しい仕組みを解説していきます。
前述の内容をコピペするだけでも使用できるので、興味のある方はご覧ください。
ショートコードの宣言
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function limit_code($atts, $content = null){ $atts = shortcode_atts(array( "start" => null, "end" => null ),$atts); date_default_timezone_set("Asia/Tokyo"); $today = strtotime(date('Y-m-d H:i')); if(($atts[start]) && ($atts[end] == null)){ if($today >= strtotime(''.$atts[start].'')){ return $content; } } elseif($atts[start] && $atts[end]) { if(($today >= strtotime(''.$atts[start].'')) && ($today < strtotime(''.$atts[end].''))){ return $content; } } elseif(($atts[start] == null) && ($atts[end])) { if($today < strtotime(''.$atts[end].'')){ return $content; } } else { return $content; } } add_shortcode('limit','limit_code'); |
まずはショートコードである宣言です。
今回の場合、実際に書くコードが引数を用いていること、囲み型であることから、
$atts
$content = null
これらが1行目の引数として記述されています。
$attsでコードに入力された引数を取得し、$content = nullでコードに囲まれた項目を取得(デフォルトでは空の状態)します。
引数の属性名とデフォルト値の設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function limit_code($atts, $content = null){ $atts = shortcode_atts(array( "start" => null, "end" => null ),$atts); date_default_timezone_set("Asia/Tokyo"); $today = strtotime(date('Y-m-d H:i')); if(($atts[start]) && ($atts[end] == null)){ if($today >= strtotime(''.$atts[start].'')){ return $content; } } elseif($atts[start] && $atts[end]) { if(($today >= strtotime(''.$atts[start].'')) && ($today < strtotime(''.$atts[end].''))){ return $content; } } elseif(($atts[start] == null) && ($atts[end])) { if($today < strtotime(''.$atts[end].'')){ return $content; } } else { return $content; } } add_shortcode('limit','limit_code'); |
今回、仕様として3パターン用意しているため、開始日時と終了日時が必ずしも入力されるとは限りません。
そのため、2〜5行目でコードの入力時に引数が入力されなかった場合のデフォルト値としてnullを設定しています。
そのついでに、コードの入力時にわかりやすくするために属性名を設定し、それを配列のキーとしています。
現在の日時を取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function limit_code($atts, $content = null){ $atts = shortcode_atts(array( "start" => null, "end" => null ),$atts); date_default_timezone_set("Asia/Tokyo"); $today = strtotime(date('Y-m-d H:i')); if(($atts[start]) && ($atts[end] == null)){ if($today >= strtotime(''.$atts[start].'')){ return $content; } } elseif($atts[start] && $atts[end]) { if(($today >= strtotime(''.$atts[start].'')) && ($today < strtotime(''.$atts[end].''))){ return $content; } } elseif(($atts[start] == null) && ($atts[end])) { if($today < strtotime(''.$atts[end].'')){ return $content; } } else { return $content; } } add_shortcode('limit','limit_code'); |
時限を仕込むには、当然現在の日時がわからないといけません。
まず、7行目でタイムゾーンを設定しています。
設定されていない場合、デフォルトのタイムゾーンであるUTCが適用され、9時間の時差が生まれてしまいます。
次に8行目で現在の日時を取得しています。
Y-m-d H:iの形式で取得していますので、月は2桁、時間は24時間表記のフォーマットとなります。
取得した日時は$todayの変数に格納しています。
日時のフォーマットの詳細は以下のページを参考にしてください。
引数startの日時に表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function limit_code($atts, $content = null){ $atts = shortcode_atts(array( "start" => null, "end" => null ),$atts); date_default_timezone_set("Asia/Tokyo"); $today = strtotime(date('Y-m-d H:i')); if(($atts[start]) && ($atts[end] == null)){ if($today >= strtotime(''.$atts[start].'')){ return $content; } } elseif($atts[start] && $atts[end]) { if(($today >= strtotime(''.$atts[start].'')) && ($today < strtotime(''.$atts[end].''))){ return $content; } } elseif(($atts[start] == null) && ($atts[end])) { if($today < strtotime(''.$atts[end].'')){ return $content; } } else { return $content; } } add_shortcode('limit','limit_code'); |
10行目で「startの引数が入力されているかつendの入力が空」の場合の条件分岐を記述しています。
これにより、開始日時だけが入力されている場合の処理を行います。
11行目で、「$todayに格納された現在の日時が、startの引数以上」の場合の時条件分岐を記述しています。
言い換えれば、「現在の日時がstartの日時に達した場合」という分岐になります。
ここでポイントなのが、「>」ではなく「>=」を使い、「以上」という分岐にしている点です。
これにより、startの日時に達した時点で発火するので、startは「表示させたい日時」にすることができます。
最後に12行目で$contentを返すことにより、コードで囲まれたコンテンツが上記の期間で出力されることになります。
引数startからendまでの期間に表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function limit_code($atts, $content = null){ $atts = shortcode_atts(array( "start" => null, "end" => null ),$atts); date_default_timezone_set("Asia/Tokyo"); $today = strtotime(date('Y-m-d H:i')); if(($atts[start]) && ($atts[end] == null)){ if($today >= strtotime(''.$atts[start].'')){ return $content; } } elseif($atts[start] && $atts[end]) { if(($today >= strtotime(''.$atts[start].'')) && ($today < strtotime(''.$atts[end].''))){ return $content; } } elseif(($atts[start] == null) && ($atts[end])) { if($today < strtotime(''.$atts[end].'')){ return $content; } } else { return $content; } } add_shortcode('limit','limit_code'); |
14行目で「startとendの引数がどちらも入力されている」の場合の条件分岐を記述しています。
15行目で、前述の「startの引数以上」の条件に加え、「$todayに格納された現在の日時が、endの引数より小さい」場合の条件を記述しています。
言い換えれば、「現在の日時がstartの日時より後で、endの日時より前の場合」という分岐になります。
ここでポイントなのが、今度は先ほどと逆に「<=」ではなく「<」を使い、「より小さい」という分岐にしている点です。
これにより、endの日時に達した時点で非表示になるので、endは「非表示にしたい日時」にすることができます。
ここで「<=」を使ってしまうと、endのタイミングではまだ表示されており、その1分後に非表示になってしまいます。
最後に16行目で$contentを返すことにより、コードで囲まれたコンテンツが上記の期間で出力されることになります。
引数endまでの期間に表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function limit_code($atts, $content = null){ $atts = shortcode_atts(array( "start" => null, "end" => null ),$atts); date_default_timezone_set("Asia/Tokyo"); $today = strtotime(date('Y-m-d H:i')); if(($atts[start]) && ($atts[end] == null)){ if($today >= strtotime(''.$atts[start].'')){ return $content; } } elseif($atts[start] && $atts[end]) { if(($today >= strtotime(''.$atts[start].'')) && ($today < strtotime(''.$atts[end].''))){ return $content; } } elseif(($atts[start] == null) && ($atts[end])) { if($today < strtotime(''.$atts[end].'')){ return $content; } } else { return $content; } } add_shortcode('limit','limit_code'); |
あとは応用です。
startと逆の分岐をし、前述の通り「<=」ではなく「<」を使う、という点に注意しながら同様に記述しています。
引数が何も入力されていない場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function limit_code($atts, $content = null){ $atts = shortcode_atts(array( "start" => null, "end" => null ),$atts); date_default_timezone_set("Asia/Tokyo"); $today = strtotime(date('Y-m-d H:i')); if(($atts[start]) && ($atts[end] == null)){ if($today >= strtotime(''.$atts[start].'')){ return $content; } } elseif($atts[start] && $atts[end]) { if(($today >= strtotime(''.$atts[start].'')) && ($today < strtotime(''.$atts[end].''))){ return $content; } } elseif(($atts[start] == null) && ($atts[end])) { if($today < strtotime(''.$atts[end].'')){ return $content; } } else { return $content; } } add_shortcode('limit','limit_code'); |
22行目でelseを使うことにより、引数に何も入力されなかった場合は、そのまま出力するようにしています。
基本は無い動きですが、万が一入力されなかった場合のエラーを防ぐために記述しています。
最後に
かなり長い記事になってしまいましたが、解説は以上となります。
これをコピペして不具合が出た場合や、応用してアレンジしたいけどアドバイスしてほしい、等があれば、お問い合わせフォームやTwitter等でお気軽にお声掛けください。