# [メタ情報]
# 識別子: vimeo埋め込みコード及びphp_シーク付き字幕使用可能_exe
# システム名: vimeo埋め込みコード及びphp_シーク付き字幕使用可能
# 技術種別: Misc
# 機能名: Misc
# 使用言語: カスタムhtml php
# 状態: 実行用
# [/メタ情報]
要約:このコードは、Vimeo動画を埋め込み表示し、字幕一覧や外部HTMLからの操作で任意の再生位置へシーク再生できる仕組みを実装している。JavaScriptではVimeo Player APIを用い、data属性で指定された秒数や時刻表記を解析して再生位置を制御し、外部から直接呼び出せる関数も用意している。PHPテンプレート側ではJSONファイルから動画情報を取得し、動画IDに基づいて適切な埋め込みコードを表示、不要なリンクを除去する。さらにCSSにより字幕一覧(details要素)の本文部分をスクロール可能な固定高さ枠として定義し、vm5専用ラッパー内に限定して適用することで、表示の安定性と個別調整のしやすさを確保している。
```
動画を別ページで表示(ここをクリック)
[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];
$raw = false;
foreach ($path_candidates as $p) {
if (is_readable($p)) {
$raw = @file_get_contents($p);
$debug_info['path'] = $p;
break;
}
}
if ($raw === false) {
error_log('vm5: failed to read any json path');
return false;
}
$mtime = @filemtime($debug_info['path']);
if ($mtime) $debug_info['mtime'] = date('Y-m-d H:i:s', $mtime);
$data = json_decode($raw, true);
if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
error_log('vm5: json decode error - ' . json_last_error_msg());
return false;
}
$debug_info['json_ok'] = true;
$debug_info['entries'] = is_array($data) ? count($data) : 0;
return is_array($data) ? $data : [];
}
// 厳密一致検索
function vm5_find_by_movid($data, $movid) {
if (!is_array($data)) return null;
$movid = trim((string)$movid);
foreach ($data as $row) {
$vid = isset($row['videoid']) ? trim((string)$row['videoid']) : '';
if ($vid === $movid) return $row;
}
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();
?>
p だったが、vm5 は div/ul など別構造の可能性が高い
// - summary 以外の“中身ブロック”に max-height を当てる(構造差に強い)
// - 影響範囲を vm5-wrapper の中だけに限定する
?>
';
echo 'path=' . esc_html($dbg['path']) . '
';
echo 'mtime=' . esc_html($dbg['mtime']) . '
';
echo 'entries=' . esc_html($dbg['entries']) . '
';
echo 'movid=' . esc_html($movid) . '
';
echo 'hit=' . ($video_info ? ('videoid=' . esc_html($video_info['videoid'])) : 'none');
echo '';
}
if ($video_info && !empty($video_info['embedCode'])) {
// 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', 9);
if (have_posts()) :
while (have_posts()) : the_post();
the_content();
endwhile;
endif;
remove_filter('the_content', 'vm5_filter_the_content', 9);
get_footer();
?>
```