【WordPress】YouTube動画への時間指定リンクを作るショートコード

この記事は最新更新日から、3年以上経過しています。

概要

youtubeから秒数指定のURLを取ってくるのが面倒な時に使うショートコードです。
発言集を作っているうちにだんだん疲れてきたので作りました。
もっと早く作ればよかった…。

更新履歴

2020-07-23 タイムゾーンがUTCでないサーバーだと時間がずれるので修正しました
2020-07-17 「分:秒」形式に対応しました、桁埋めができるようになりました
2020-07-11 「秒」形式に対応しました、24時間超えの場合は強制的に「00:00:00」になります。

ショートコード

下記のようにvに動画ID、tに時間を指定するとその指定時間へのYoutubeリンクが作られます。
「分:秒」「時:分:秒」形式に対応しています。

[[v_time v=lqXm8xtYDV0 t=1:57:38]]
[[v_time v=yDn9UwxxDF8 t=10:45]]
[[v_time v=XlX3WpFblm4 t=2]]
[[v_time v=iNXffIUW_2U t=30:99:85]]

表示させると下記のようなリンクになります。動画IDはURLのv=のあとの文字です。
24時間超えの場合は強制的に「00:00:00」になり、時間指定はつきません。
01:57:38
00:10:45
00:00:02
00:00:00

function.phpに下記のように書くと使えます。

// 指定された動画ID、時間のYouTubeリンクを作成する
function sc_v_time($atts){
    $atts = shortcode_atts(array(
        "v" => null,
        "t" => "00:00:00"
    ),$atts);

    $time = explode(':',$atts['t']);
    $h = 0;
    $m = 0;
    $s = 0;
    if(count($time) == 3){
        //[00:00:00]形式の場合
        $h = $time[0];
        $m = $time[1];
        $s = $time[2];
    }else if(count($time) == 2){
        //[00:00]形式の場合
        $m = $time[0];
        $s = $time[1];
    }else if(count($time) == 1){
        //[00]形式の場合
        $s = $time[0];
    }
    //常にHH:mm:ssで表示したいため、桁操作しなくていいようにUnix時間からの秒数でtを出してフォーマットもする
    $date = new DateTimeImmutable();
    //日本のサーバーだと時刻がずれるのでtimezoneをUTCに変更
    $date = $date->setTimezone(new DateTimeZone('UTC'));
    $date = $date->setDate(1970,1,1);
    $date = $date->setTime($h,$m,$s);
    $label = $date->format("H:i:s");
    $t = $date->getTimestamp();
    $url = "https://www.youtube.com/watch?v=".$atts['v']."&t=".$t;

    //tが1日を超えていたら強制的に0にする
    $day_sec = 24*60*60;
    if($t >= $day_sec){
        $t = 0;
        $label = "00:00:00";
        $url = "https://www.youtube.com/watch?v=".$atts['v'];
    }

    return '<a href="' .esc_url($url). '" rel="noopener" target="_blank">'. esc_html($label) .'</a>';
}
add_shortcode('v_time','sc_v_time');

おわり。