WordPress | WordPressの投稿時にアイキャッチ画像を自動設定する方法(YouTube対応)

Web
スポンサーリンク

以下は WordPressの投稿時にアイキャッチ画像を自動設定する方法(YouTube対応) です。
通常投稿+YouTube動画URLが含まれる場合に自動でサムネイルを取得する実務向け構成で説明します。


全体方針(設計)

  1. 投稿保存時に処理をフック
  2. すでにアイキャッチがある場合は何もしない
  3. 投稿本文から YouTube URL を検出
  4. 動画IDを抽出
  5. YouTubeサムネイルURLを生成
  6. 画像をメディアに保存
  7. アイキャッチとして設定

対応する YouTube URL 形式

以下すべて対応します。


実装コード(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;
}
PHP

YouTube埋め込みブロック(Gutenberg)対応

Gutenbergは本文にURLが そのまま存在 するため、上記正規表現で問題なく検出できます。


動作確認チェックリスト

  • 新規投稿でYouTube URLを貼る
  • 保存する
  • アイキャッチが自動設定される
  • メディアライブラリに画像が追加される

まとめ

✔ 投稿保存時に完全自動
✔ YouTube URLを貼るだけ
✔ 高画質サムネイル対応
✔ Gutenberg / クラシック両対応
✔ 実務レベルの安全設計

Web
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました