7.設定値をショートコードに反映させる

この記事は 6.設定値をDBに格納する の続きです。

色々設定したので、これをショートコードに反映させたい。
今のところショートコードは与えられた値をくっつけて「HOE」と「HOE」にはさんで返す、というしょうもない機能しか持っていない。

// 実際のショートコード用のソースここから
add_shortcode('exp_notice', 'expNoticeAdd');
function expNoticeAdd($param) {
  extract(
    shortcode_atts(
      array( 'y' => '0'
            ,'m' => '0'
            ,'d' => '0'
            ,'h' => '0'
            ,'i' => '0'
            ,'s' => '0'
      )
      , $param
    )
  );
  $ret = "HOE ".$y.$m.$d.$h.$i.$s." HOE";
  return $ret;
}
// 実際のショートコード用のソースここまで

こんな。

ここから

  1. 管理画面であえて「0」を入力してくる可能性があるのでデフォルト値を「0」ではなく「ymdhis」に変更。
  2. すべて「ymdhis」だったら数値入力なしと看做して管理画面でデフォルト値として入力されている値を採用。
  3. 1箇所でも数値があれば入力ありとなって、その値に従う。入力がない部分は「0」になる。
  4. 現在日時・更新日時を取得する。
  5. 1~4で得られた値を元に有効期限を割り出す。
  6. 有効期限が現在日時を過ぎているか否かでメッセージを変更する。

このあたりを考慮してみる。

// 実際のショートコード用のソースここから
add_shortcode('exp_notice', 'expNoticeAdd');
function expNoticeAdd($param) {
  // shortcodeからの値を取得 or デフォルト値を採用
  extract(
    shortcode_atts(
      array( 'y' => 'y'
            ,'m' => 'm'
            ,'d' => 'd'
            ,'h' => 'h'
            ,'i' => 'i'
            ,'s' => 's'
      )
      , $param
    )
  );

  // ymdhis を確定させる
  // すべて「ymdhis」だったらデフォルト値を採用
  if (($y.$m.$d.$h.$i.$s) == "ymdhis") {
    $y = intval(get_option('katz_en_default_year'));
    $m = intval(get_option('katz_en_default_month'));
    $d = intval(get_option('katz_en_default_day'));
    $h = intval(get_option('katz_en_default_hour'));
    $i = intval(get_option('katz_en_default_minute'));
    $s = intval(get_option('katz_en_default_second'));
  // 「ymdhis」でなかったら指定値と0を採用
  } else {
    $y = (is_numeric($y)) ? intval($y) : 0;
    $m = (is_numeric($m)) ? intval($m) : 0;
    $d = (is_numeric($d)) ? intval($d) : 0;
    $h = (is_numeric($h)) ? intval($h) : 0;
    $i = (is_numeric($i)) ? intval($i) : 0;
    $s = (is_numeric($s)) ? intval($s) : 0;
  }

  // 該当コンテンツの更新日時を取得、分解
  $katz_en_last_modified = get_the_modified_time('Y-m-d H:i:s');
  $katz_en_last_mod = explode(" ", $katz_en_last_modified);
  $katz_en_last_mod_date = explode("-", $katz_en_last_mod[0]);
  $katz_en_last_mod_time = explode(":", $katz_en_last_mod[1]);
  // 有効期限の年月日時分秒を割り出す
  $katz_en_y = intval($katz_en_last_mod_date[0]) + $y;
  $katz_en_m = intval($katz_en_last_mod_date[1]) + $m;
  $katz_en_d = intval($katz_en_last_mod_date[2]) + $d;
  $katz_en_h = intval($katz_en_last_mod_time[0]) + $h;
  $katz_en_i = intval($katz_en_last_mod_time[1]) + $i;
  $katz_en_s = intval($katz_en_last_mod_time[2]) + $s;
  // 有効期日・更新日時・現在日時をmktimeで取得
  $katz_en_limit_ymdhis  = mktime($katz_en_h,$katz_en_i,$katz_en_s,$katz_en_m,$katz_en_d,$katz_en_y);
  $katz_en_modify_ymdhis = mktime($katz_en_last_mod_time[0],$katz_en_last_mod_time[1],$katz_en_last_mod_time[2],$katz_en_last_mod_date[1],$katz_en_last_mod_date[2],$katz_en_last_mod_date[0]);
  $katz_en_now_ymdhis    = mktime();
  // 有効期日までの残り時間、経過時間も取得
  $katz_en_timeleft      = ($katz_en_limit_ymdhis - $katz_en_now_ymdhis) > 0 ? ($katz_en_limit_ymdhis - $katz_en_now_ymdhis) : 0;
  $katz_en_overtime      = ($katz_en_now_ymdhis - $katz_en_limit_ymdhis) > 0 ? ($katz_en_now_ymdhis - $katz_en_limit_ymdhis) : 0;

  // 有効期限が過ぎていたら有効期日経過後のメッセージを表示。過ぎていない場合は有効期日前のメッセージを表示。
  if (($katz_en_limit_ymdhis - $katz_en_now_ymdhis) > 0) {
    $ret = '<div class="non_expiration">'."\n".get_option('katz_en_mae_html')."\n</div>";
  } else {
    $ret = '<div class="expiration">'."\n".get_option('katz_en_ato_html')."\n</div>";
  }

  // 残り時間が1日を超えているか否かで表示をちょっと変える(「*時間*分」もしくは「*日と*時間」)
  if (($katz_en_timeleft / 86400) < 1) {
    $katz_en_timeleft_format = str_pad(floor($katz_en_timeleft / 3600), 2, "0", STR_PAD_LEFT)."時間".str_pad(floor(($katz_en_timeleft % 3600) / 60), 2, "0", STR_PAD_LEFT)."分";
  } else {
    $katz_en_timeleft_format = floor($katz_en_timeleft / 86400)."日と".str_pad(floor(($katz_en_timeleft % 86400) / 3600), 2, "0", STR_PAD_LEFT)."時間";
  }
  // 経過時間も1日を超えているか否かで表示をちょっと変える(「*時間*分」もしくは「*日と*時間」)
  if (($katz_en_overtime / 86400) < 1) {
    $katz_en_overtime_format = str_pad(floor($katz_en_overtime / 3600), 2, "0", STR_PAD_LEFT)."時間".str_pad(floor(($katz_en_overtime % 3600) / 60), 2, "0", STR_PAD_LEFT)."分";
  } else {
    $katz_en_overtime_format = floor($katz_en_overtime / 86400)."日と".str_pad(floor(($katz_en_overtime % 86400) / 3600), 2, "0", STR_PAD_LEFT)."時間";
  }

  // メッセージ中の期日表示部分を実際の期日に置き換える。
  $ret = preg_replace('/%target_date%/', date('Y/m/d H:i:s', $katz_en_limit_ymdhis), $ret);
  $ret = preg_replace('/%modified_date%/', date('Y/m/d H:i:s', $katz_en_modify_ymdhis), $ret);
  $ret = preg_replace('/%timeleft%/', $katz_en_timeleft_format, $ret);
  $ret = preg_replace('/%overtime%/', $katz_en_overtime_format, $ret);

  return $ret;
}
// 実際のショートコード用のソースここまで

だらだら書いてたら長くなったな。

変更ついでに管理画面から
有効期日前メッセージを
「このページは %target_date% まで有効です。」に。
有効期日経過後メッセージを
「このページの有効掲載期限は %target_date% までです。記載されていることの正確性を確認ねがいます。」に変更。

とりあえずこれで反映させることには成功。

Next is [8.CSSを適用する]