# [メタ情報] # 識別子: vimeo埋め込みコード及びphp_シーク付き字幕使用可能_exe # システム名: vimeo埋め込みコード及びphp_シーク付き字幕使用可能 # 技術種別: Misc # 機能名: Misc # 使用言語: カスタムhtml php # 状態: 実行用 env終了 # [/メタ情報] 要約: このテキストは、Vimeo動画の埋め込み、インタラクティブな再生制御、字幕連携、および多言語翻訳機能を提供するWordPressカスタムテンプレート(PHP)とそのフロントエンド(HTML/JavaScript/CSS)の実装を示しています。 HTMLとJavaScriptは、Vimeo動画を埋め込み、APIを介して再生を制御します。「動画を別ページで表示」リンクをクリックすると、動画を一時停止してから新しいタブで開きます。字幕のタイムスタンプなどを示すリンク(`a.imk-cue`)をクリックすると、動画が該当する時間にシークして再生を開始。動画の再生中は、現在の時刻に連動して字幕リストの該当部分がハイライトされ、自動的にスクロールされます。Vimeoプレーヤー、字幕リストのサイズ、ハイライトスタイルはCSSで調整されています。 PHPテンプレートは、URLの`movid`パラメータから動画IDを取得し、JSONファイルから対応する埋め込みコードを検索して出力します。このPHPは、埋め込みコードから特定の不要リンクを削除し、Google翻訳機能を統合します。さらに、字幕リストの高さやハイライトのスタイルを調整するCSSを動的に出力し、動画コンテンツのラッパーに適用することで、シームレスな視聴体験と学習体験を提供します。 マイライブラリ→基礎情報→vimeo→埋め込みコード ```
[dynamic_external_html url="@@ddd@@"]
``` 対応条件: {"gggg":"18","eee":"3","ddd":"12"} vm5用php vimeo-custom-template3.php ``` 'n/a', 'mtime' => 'n/a', 'entries' => 0, 'json_ok' => false]; foreach ($path_candidates as $p) { if (file_exists($p)) { $raw = file_get_contents($p); if ($raw !== false) { $arr = json_decode($raw, true); if (is_array($arr)) { $debug_info = [ 'path' => str_replace($_SERVER['DOCUMENT_ROOT'], '', $p), 'mtime' => date('Y-m-d H:i:s', filemtime($p)), 'entries' => count($arr), 'json_ok' => true ]; return $arr; } } } } return []; } function vm5_find_by_movid(array $rows, string $movid): ?array { foreach ($rows as $r) { if (is_array($r) && (string)($r['videoid'] ?? '') === $movid) return $r; } return null; } // 不要リンク削除(「動画を別ページで表示(ここをクリック)」) function vm5_strip_unwanted_link($html) { $pattern = '/]*>\s*動画を別ページで表示\(ここをクリック\)\s*<\/a>/u'; return preg_replace($pattern, '', (string)$html); } // the_content 用フィルタ(※ remove_filter できるように “名前付き” で用意) function vm5_filter_the_content($content) { return vm5_strip_unwanted_link($content); } // ========== 表示開始 ========== get_header(); ?>
Gemini Q&A
'; echo '

[VM5 Debug Info]

'; echo 'Requested movid: ' . esc_html($movid) . '
'; echo 'Loaded file: ' . esc_html($dbg['path']) . '
'; echo 'File mtime: ' . esc_html($dbg['mtime']) . '
'; echo 'JSON parse ok: ' . ($dbg['json_ok'] ? 'YES' : 'NO') . '
'; echo 'Total JSON rows: ' . esc_html($dbg['entries']) . '
'; if ($video_info) { echo 'Found in JSON: YES
'; echo 'Title: ' . esc_html($video_info['title'] ?? 'n/a') . '
'; echo 'Play URL: ' . esc_html($video_info['playUrl'] ?? 'n/a') . '
'; } else { echo 'Found in JSON: NO
'; } echo ''; } if ($video_info) { // embedCode をショートコード展開 → 不要リンク除去 $embed = do_shortcode($video_info['embedCode']); $embed = vm5_strip_unwanted_link($embed); // ★CSS の適用範囲を限定するため、必ずラッパーで囲む echo '
'; echo $embed; echo '
'; } else { echo '

No data found for movid: ' . esc_html($movid) . '

'; } } else { echo '

No movid provided.

'; } // the_content にも同様の除去をかけたい場合(※ remove_filter が確実に効く) add_filter('the_content', 'vm5_filter_the_content', 11); if (have_posts()) : while (have_posts()) : the_post(); echo '
'; the_content(); echo '
'; endwhile; endif; get_footer(); ?> ```