[php]youtubeのurlから動画idを抽出する方法

簡単。

どういうことか

例えば

https://www.youtube.com/watch?v=_7QQAmvqJLA&ab_channel=DUELMOVIEDUELCo%2C.incOfficialYoutube

これの

_7QQAmvqJLA

これを抽出する。

動画IDだけ欲しいことは地味にある。で、いちいち手動で引っこ抜くのはめんどくさい。

ベタ打ちのURLからidだけ拾えるものを組んじゃえばいいよね。

phpでやっていく

作成理由にwordpress前提ってのがあるんでphp。機能的にはjsでも作れる。

<?php
$url = 'https://www.youtube.com/watch?v=_7QQAmvqJLA&ab_channel=DUELMOVIEDUELCo%2C.incOfficialYoutube';
parse_str(parse_url($url, PHP_URL_QUERY), $query);
if(isset($query)){
    $youtubeid = $query['v'];
    print $youtubeid;
}

注意として、共有用のURLでは動作しない。

https://youtu.be/_7QQAmvqJLA?si=BwucWhSwQJaXVh12

埋め込み用タグから拾ってもダメ。

https://www.youtube.com/embed/_7QQAmvqJLA?si=u5AQY4yq27Prqw7e

引っ張ってくる手段は複数あるわけだけど、使用時の手間を省くことを考えてurlのコピペで済ませることを採用した。まあ、それぞれ書式があるから条件分岐で対応できるんですけどね。

wordpress組込例

カスタムフィールド(SmartCustomFields)、繰り返しフィールド対応でlite-youtubeを仕込みたい場合。

繰り返しフィールドを「cf_youtube」、サブフィールドに表示真偽「show」、youtubeURL「url」とする。

<?php
$youtube = scf::get('cf_youtube');
$youtube_num = 0;
foreach( $youtube as $fields): if($fields['show']): $youtube_num++; endif; endforeach;
if($youtube_num !== 0):
    print '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lite-youtube-embed/0.3.0/lite-yt-embed.min.css" integrity="sha512-F+q2wTRzuK17yqnrP7XZ2R1jvzJiVVUUZW9wqDIMhiZFlsP5TTvGZtPQbwS1v+ZUp3JR4CDK1Tai6Gvvh7c2Fg==" crossorigin="anonymous" referrerpolicy="no-referrer" />';
    print '<script src="https://cdnjs.cloudflare.com/ajax/libs/lite-youtube-embed/0.3.0/lite-yt-embed.min.js" integrity="sha512-mnzNl5OgPbvEh4byaFsFh3bYSHnAvcgo4v+0yShBsFYcXps4E0p+8a1KHzgLajw50+kZEwZKuMFu8bhLZkiGlQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>';
    foreach( $youtube as $fields):
        $url = $fields['url'];
        parse_str(parse_url($url, PHP_URL_QUERY), $query);
        if(isset($query)){
            $youtubeid = $query['v'];
            $liteyoutube = '<lite-youtube videoid="'.$youtubeid.'" playlabel="Play"></lite-youtube>';
            print $liteyoutube;
        }
    endforeach;
endif;

SCFの繰り返しは空欄でも存在が真なので、入力の有無による表示の切り替えは入力内容をカウントしてやっていく必要がある($youtube_num)。どうせなら入力内容別に表示の可否を仕込んじゃえばいいよねってことで真偽「show」を付けてカウント。

そんな感じで。

コメント

タイトルとURLをコピーしました