以下は WordPressの投稿時にアイキャッチ画像を自動設定する方法(YouTube対応) です。
通常投稿+YouTube動画URLが含まれる場合に自動でサムネイルを取得する実務向け構成で説明します。
全体方針(設計)
- 投稿保存時に処理をフック
- すでにアイキャッチがある場合は何もしない
- 投稿本文から YouTube URL を検出
- 動画IDを抽出
- YouTubeサムネイルURLを生成
- 画像をメディアに保存
- アイキャッチとして設定
対応する YouTube URL 形式
以下すべて対応します。
- https://www.youtube.com/watch?v=VIDEO_ID
- https://youtu.be/VIDEO_ID
- https://www.youtube.com/embed/VIDEO_ID
実装コード(functions.php)
① 投稿保存時フック
add_action('save_post', 'auto_set_featured_image_from_youtube');
PHP② メイン処理
function auto_set_featured_image_from_youtube($post_id) {
// 自動保存・リビジョン除外
if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
return;
}
// すでにアイキャッチがある場合は何もしない
if (has_post_thumbnail($post_id)) {
return;
}
$post = get_post($post_id);
if (!$post) {
return;
}
// 投稿本文
$content = $post->post_content;
// YouTube動画IDを取得
$video_id = extract_youtube_video_id($content);
if (!$video_id) {
return;
}
// サムネイルURL(高画質)
$thumbnail_url = "https://img.youtube.com/vi/{$video_id}/maxresdefault.jpg";
// メディアに保存してアイキャッチ設定
set_featured_image_from_url($thumbnail_url, $post_id);
}
PHP③ YouTube動画ID抽出関数
function extract_youtube_video_id($content) {
$patterns = [
'/youtube\.com\/watch\?v=([^\&\?\/]+)/',
'/youtu\.be\/([^\&\?\/]+)/',
'/youtube\.com\/embed\/([^\&\?\/]+)/'
];
foreach ($patterns as $pattern) {
if (preg_match($pattern, $content, $matches)) {
return $matches[1];
}
}
return false;
}
PHP④ 画像をメディアに保存してアイキャッチ設定
function set_featured_image_from_url($image_url, $post_id) {
require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/media.php';
require_once ABSPATH . 'wp-admin/includes/image.php';
// 画像を一時保存
$tmp = download_url($image_url);
if (is_wp_error($tmp)) {
return;
}
$file = [
'name' => basename($image_url),
'type' => mime_content_type($tmp),
'tmp_name' => $tmp,
'size' => filesize($tmp),
];
// メディアに登録
$attachment_id = media_handle_sideload($file, $post_id);
// エラー時は削除
if (is_wp_error($attachment_id)) {
@unlink($tmp);
return;
}
// アイキャッチ設定
set_post_thumbnail($post_id, $attachment_id);
}
PHPよくある実務カスタマイズ
高画質が無い場合のフォールバック
$thumbnail_url = "https://img.youtube.com/vi/{$video_id}/maxresdefault.jpg";
// 存在しない場合は hqdefault
$response = wp_remote_head($thumbnail_url);
if (is_wp_error($response) || wp_remote_retrieve_response_code($response) !== 200) {
$thumbnail_url = "https://img.youtube.com/vi/{$video_id}/hqdefault.jpg";
}
PHP特定の投稿タイプだけに限定
if ($post->post_type !== 'post') {
return;
}
PHPYouTube埋め込みブロック(Gutenberg)対応
Gutenbergは本文にURLが そのまま存在 するため、上記正規表現で問題なく検出できます。
動作確認チェックリスト
- 新規投稿でYouTube URLを貼る
- 保存する
- アイキャッチが自動設定される
- メディアライブラリに画像が追加される
まとめ
✔ 投稿保存時に完全自動
✔ YouTube URLを貼るだけ
✔ 高画質サムネイル対応
✔ Gutenberg / クラシック両対応
✔ 実務レベルの安全設計


