WordPressコンテンツ内に時限表示させたい時

最終更新日

 

WordPressのコンテンツ内に時限表示させたい時に便利なショートコードです。
程よいプラグインがなく、自作するしかないかとググっていたところ運命的に出会ってしまった私にとって理想的なGatespaceさんのコードをご紹介します。


時限コンテンツのショートコードです。
投稿・固定ページに下記ショートコードを記述します。

opendate:公開日時(即時公開の場合は「YmdHi」)
closedate:終了日時

[datecontent opendate="YmdHi" closedate="201708301936"]

時限表示したい内容

[/datecontent]

 

テンプレートファイルに記述する場合

<?php echo do_shortcode('[datecontent opendate="YmdHi" closedate="201708302100"]'.'時限表示したい内容'.'[/datecontent]'); ?>

 

functions.phpに下記コードを追記します。

<?php
/**
 * @package datecontent_shortcode
 * @version 1.0
 */
/*
Plugin Name: 指定日時によって内容を表示するショートコード
Plugin URI: https://gist.github.com/2817701
Description: WordPressの本文の内容を指定日時によって表示するショートコード。使い方は [datecontent opendate="YmdHi" closedate="YmdHi"]指定日時で表示する内容[/datecontent] です。opendate で表示の開始日時、closedate で表示の終了日時をYmdHiの形式で指定します。
Author: gatespace
Version: 1.0
Author URI: http://gatespace.wordpress.com/
*/
// [datecontent opendate="YmdHi" closedate="YmdHi"]
function datecontent_func($atts, $content = null) {
	extract(shortcode_atts(array(
		'opendate'  => null,
		'closedate' => null,
	), $atts));
	/**
	 * $opendate, $closedateの値をチェック(8〜12桁の数字)し
	 * 正しい年月日、時刻かチェックしてUnixのタイムスタンプに
	*/
	$dates = array( "opendate" => $opendate, "closedate" => $closedate );
	foreach ($dates as $key => $val) {
		// 8〜12桁の数字の数字で入力されているかどうかチェック
		if ( (!preg_match("/^[0-9]{8,12}$/", $val)) or ($val === null) ) {
			$dates[$key] = null;
			continue;
		} else {
			// 正しい日付かどうかチェック(違うときはnullで終了)
			$dates_Y = substr($val, 0, 4);
			$dates_M = substr($val, 4, 2);
			$dates_D = substr($val, 6, 2);
			if (!checkdate($dates_M, $dates_D, $dates_Y )) {
				$dates[$key] = null;
				continue;
			}
			// 正しい時刻かどうかチェック(違うときは00:00)
			$dates_H = ( substr($val, 8, 2) && preg_match("/(0|1)[0-9]|2[0-3]/", substr($val, 8, 2) )) ? substr($val, 8, 2) : "00";
			$dates_I = ( substr($val, 10, 2) && preg_match("/[0-5][0-9]/", substr($val, 10, 2) )) ? substr($val, 10, 2) : "00";
			// mktimeでUnixのタイムスタンプに
			$dates[$key] = mktime($dates_H, $dates_I, 0, $dates_M, $dates_D, $dates_Y);
		}
	}
	$nowdate = date_i18n('U'); // 現在の時間を取得しUnixのタイムスタンプに
	if ( ($dates["opendate"] === null) && ($dates["closedate"] === null)) {
		return $content;
	} elseif ($dates["closedate"] === null) {
		if ($nowdate >= $dates["opendate"]) {
			return $content;
		}
	} elseif ($dates["opendate"] === null) {
		if ($nowdate < $dates["closedate"]) {
			return $content;
		}
	} else {
		if ( ($nowdate >= $dates["opendate"]) && ($nowdate < $dates["closedate"]) ) {
			return $content;
		}
	}
}
add_shortcode('datecontent', 'datecontent_func');

Gatespaceさんのコード

(Gatespaceさんありがとうございます)

 

ちなみにですが、ショートコードの入れ子にした場合は、

$content = do_shortcode($content);

を追記してあげると動いてくれます。