✏️ 编辑:youtube.php
路径:
/virtual/emerald/public_html/emerald.jpn.com/wp2020/wp-content/themes/cocoon-master/lib/youtube.php
大小:5.73 KB · 修改:2026-06-11 17:11:56 · 权限:0747 · 可写
← 返回目录
👁 查看
⬇ 下载
<?php //YouTube関連 /** * Cocoon WordPress Theme * @author: yhira * @link: https://wp-cocoon.com/ * @license: http://www.gnu.org/licenses/gpl-2.0.html GPL v2 or later * * Cocoon WordPress Theme incorporates code from "Youtube SpeedLoad" WordPress Plugin, Copyright 2017 Alexufo[http://habrahabr.ru/users/alexufo/] "Youtube SpeedLoad" WordPress Plugin is distributed under the terms of the GNU GPL v2 */ if ( !defined( 'ABSPATH' ) ) exit; //Jetpackとの競合対応 remove_action( 'init', 'wpcom_youtube_embed_crazy_url_init' ); //YouTube動画表示の高速化 add_filter('embed_oembed_html', 'youtube_embed_oembed_html', 1, 3); if ( !function_exists( 'youtube_embed_oembed_html' ) ): function youtube_embed_oembed_html ($cache, $url, $attr) { if (is_amp() || is_feed()) { return $cache; } // data-youtubeチェック if (strpos($cache, 'data-youtube')) { preg_match( '/(?<=data-youtube=")(.+?)(?=")/', $cache, $match_cache); $MATCH_CACHE = $match_cache[0]; }; //* YouTubeキャッシュが空のときYouTubeビデオとプレイリストのためにこれらを作成する ( video_id, title, picprefix and etc for schema.org ) if (empty($MATCH_CACHE)) { // YouTubeキャッシュを無視する if (!strpos($cache, 'youtube')) { return $cache; } // 古いデータの除去 $cache = preg_replace('/data-picprefix=\\"(.+?)\\"/s', "", $cache); // プレイリストIDがある場合 if( preg_match_all( '/videoseries|list=/i', $cache, $m )){ // プレイリストIDの抽出 preg_match( '/(?<=list=)(.+?)(?=")/', $cache, $list ); // ビデオIDの取得 $json_data = @wp_filesystem_get_contents('https://www.youtube.com/oembed?url=http://www.youtube.com/playlist?list='.$list[1], true); $json = json_decode($json_data, true); // ビデオIDの抽出 preg_match( '/(?<=vi\/)(.+?)(?=\/)/', $json['thumbnail_url'], $video_id ); } else { preg_match( '/(?<=embed\/)(.+?)(?=\?)/', $cache, $video_id ); } // もしビデオIDないまだ空ならおそらくYouTubeがオフライン if (empty($video_id) || !$video_id[0]) { return $cache; } // WordPress標準のHTTP APIでYouTube oEmbed情報を取得する $oembed_response = wp_remote_get( "https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=" . $video_id[0] . "&format=json", array( 'headers' => array( 'Accept-language' => 'en', ), 'user-agent' => 'Mozilla/5.0 (iPad; CPU OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari', 'timeout' => 10, ) ); // リクエストが失敗した場合は元のキャッシュを返す if (is_wp_error($oembed_response)) { return $cache; } // HTTPステータスコードが200以外の場合は元のキャッシュを返す $http_code = (int)wp_remote_retrieve_response_code($oembed_response); if ($http_code != 200){ return $cache; } // レスポンスのボディを取得する $data = wp_remote_retrieve_body($oembed_response); // もしYouTubeがJSONを変更したら if (empty($data)) { return $cache; } // \U0001f534 breakes json_decode with big U $data = str_replace("\\U",'\\u', $data); $json = json_decode($data,JSON_UNESCAPED_SLASHES); // ジェイソンが無効な場合 if (empty($json)) { return $cache; } $youtube_cache = array(); $youtube_cache['title'] = htmlentities( $json['title'], ENT_QUOTES, 'UTF-8' ); $youtube_cache['video_id'] = $video_id[0]; $youtube_cache = base64_encode(json_encode($youtube_cache)); //wp core with first parsing inject unknow attr discover. Owerwise md5 is not valid if(isset($attr['discover']) && $attr['discover'] == 1){ unset($attr['discover']); } $cachekey = '_oembed_' . md5( $url . serialize( $attr ) ); // $cache変数のアップデート $cache = str_replace('src', ' data-youtube="'.$youtube_cache.'" src', $cache); // 新しいキャッシュを保存 update_post_meta( get_the_ID(), $cachekey, $cache ); $MATCH_CACHE = $youtube_cache; } $json = json_decode(base64_decode($MATCH_CACHE), true); $youtube = preg_replace("/data-youtube=\"(.+?)\"/", "", $cache); if (preg_match( '{src=[\'"](.+?)[\'"]}i', $youtube, $m)) { $default_args = array('autoplay' => 1); $default_args = apply_filters('youtube_embed_default_args', $default_args); //元のURL情報の取得 $urls = wp_parse_url($url); $query = isset($urls['query']) ? $urls['query'] : ''; parse_str($query, $args); //デフォルトパラメータと結合 $args = array_merge($default_args, $args); //動画IDは不要なので削除 if (isset($args['v'])) { $args['v'] = null; } //srcのURL $youtube_old_url = $m[1]; // var_dump($youtube_old_url); //デフォルトのパラメータ設定 $args = apply_filters('youtube_embed_args', $args); //クエリを追加 $youtube_new_url = add_query_arg($args, $youtube_old_url); // var_dump($youtube_new_url); $youtube = str_replace($youtube_old_url, $youtube_new_url, $youtube); } $youtube = htmlentities($youtube); $thumb_url = "https://i.ytimg.com/vi/{$json['video_id']}/hqdefault.jpg"; $wrap_start = '<div class="video-container">'; $wrap_end = '</div>'; $html = $wrap_start . "<div class='video-click video' data-iframe='$youtube' style='position:relative;background: url($thumb_url) no-repeat scroll center center / cover' ><div class='video-title-grad'><div class='video-title-text'>{$json['title']}</div></div><div class='video-play'></div></div>" . $wrap_end; return apply_filters('youtube_embed_html', $html); }; endif;
💾 保存
取消
保存为 UTF-8,换行统一为 LF