画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

2026年10月3日

色々便利なようにやってみたが、あまりにもコードが長くなり過ぎてしまっている。
必要なのは、ファイルをページにアップロードするときがほとんどで後はあんまり使っていない。
サイドのアイキャッチ画像を入れる時ぐらいかな。

直でライブラリに入れる場合はファイル名を手作業で修正すれば済むほどの少ない物だし。
ランダムサムネイル画像も、そのファイル名はインストールした後、必ずわかりやすい名前に修正するのでファイルそのものを最初から修正する必要がない。

目次

正式に採用した方法

以下が修正前の表示内容。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

右サイドのアイキャッチ画像を入れた時の表示

タイトル:アイキャッチ_記事_ID = ◯◯◯
ファイル名:post-id-◯◯◯.jpg

アイキャッチ_146:87行目の’post_title’ => ‘アイキャッチ_’ . $post_idを’post_title’ => ‘投稿アイキャッチ画像_ID = ‘ . $post_idに変更した。
これ93行目もあるので、ここも上と同じように変更した。

thumb-146-1:82行目と102行目、2箇所にある。これをpost-id-◯◯◯.jpgする。
if (strpos(basename($current_file), ‘thumb-‘) === 0) { return; }
$new_filename_base = ‘thumb-‘ . $post_id;

アイキャッチ画像の修正結果の表示

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

代替えテキストも問題なく表示されている。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

投稿ページに画像を入れた時のタイトルとファイル名の表示

修正前の表示(AIに作ってもらった)

タイトル:投稿画像_ID = ◯◯◯
ファイル名:post-id-◯◯◯.jpg

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

変更方法:44行目と62行目の$data[‘post_title’] = ‘本文画像_’ . $post_id; と $page_title = ‘本文画像_’ . $post_id; を 投稿画像_ID =  に変更。

変更方法:22行目 $new_filename_base = ‘content-img-‘ . $post_id; を post-id- に変更す流。

以下のように変更がなった。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

代替えテキストもうまく入っている。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

こので完成にする。polo-wweb.comに使用するように変更した。

/**
 * 1. 画像アップロード時は、一旦すべて「本文画像」のルールで命名&ページのタイトルをALTに設定
 */
add_filter('wp_handle_upload', 'custom_rename_all_uploads_to_content', 10, 2);
function custom_rename_all_uploads_to_content($upload, $context) {
    $post_id = 0;
    if (isset($_POST['post_id'])) { $post_id = intval($_POST['post_id']); }
    elseif (isset($_REQUEST['post'])) { $post_id = intval($_REQUEST['post']); }
    elseif (isset($_REQUEST['post_id'])) { $post_id = intval($_REQUEST['post_id']); }

    if (!$post_id) { return $upload; }

    $file_path = $upload['file'];
    $file_dir  = dirname($file_path);
    $ext       = '.' . pathinfo($file_path, PATHINFO_EXTENSION);

    $new_filename_base = 'post-id-' . $post_id;

    $unique_filename = wp_unique_filename($file_dir, $new_filename_base . $ext);
    $new_file_path   = $file_dir . '/' . $unique_filename;

    if (rename($file_path, $new_file_path)) {
        $upload['file'] = $new_file_path;
        $upload['url']  = str_replace(basename($file_path), $unique_filename, $upload['url']);
    }

    return $upload;
}

add_filter('wp_insert_attachment_data', 'custom_rename_all_titles_to_content', 10, 2);
function custom_rename_all_titles_to_content($data, $postarr) {
    $post_id = 0;
    if (isset($_POST['post_id'])) { $post_id = intval($_POST['post_id']); }
    elseif (isset($_REQUEST['post'])) { $post_id = intval($_REQUEST['post']); }
    elseif (isset($_REQUEST['post_id'])) { $post_id = intval($_REQUEST['post_id']); }
    
    if (!$post_id) { return $data; }

    $data['post_title'] = '投稿画像_ID = ' . $post_id;
    return $data;
}

// 初期アップロード時に「投稿ページのタイトル」を代替テキスト(ALT)に設定
add_action('add_attachment', 'custom_set_initial_alt_text_from_page_title');
function custom_set_initial_alt_text_from_page_title($attachment_id) {
    $post_id = 0;
    if (isset($_POST['post_id'])) { $post_id = intval($_POST['post_id']); }
    elseif (isset($_REQUEST['post'])) { $post_id = intval($_REQUEST['post']); }
    elseif (isset($_REQUEST['post_id'])) { $post_id = intval($_REQUEST['post_id']); }

    if ($post_id) {
        // 投稿ページのタイトルを取得
        $page_title = get_the_title($post_id);
        
        // もしページタイトルが空(タイトル未入力)の場合はフォールバック
        if (empty($page_title)) {
            $page_title = '投稿画像_ID = ' . $post_id;
        }
        
        update_post_meta($attachment_id, '_wp_attachment_image_alt', $page_title);
    }
}


/**
 * 2. アイキャッチ画像として投稿に設定された瞬間に、ファイル名・タイトルを書き換え、ALTにページタイトルを設定
 */
add_action('added_post_meta', 'custom_rename_when_featured_image_set', 10, 4);
add_action('updated_post_meta', 'custom_rename_when_featured_image_set', 10, 4);
function custom_rename_when_featured_image_set($meta_id, $post_id, $meta_key, $meta_value) {
    if ($meta_key !== '_thumbnail_id') { return; }

    $attachment_id = intval($meta_value);
    if (!$attachment_id) { return; }

    $current_file = get_attached_file($attachment_id);
    if (strpos(basename($current_file), 'post-id-') === 0) { return; }

    // ① メディアタイトルの書き換え
    wp_update_post(array(
        'ID'         => $attachment_id,
        'post_title' => '投稿アイキャッチ画像_ID = ' . $post_id
    ));
    
    // ② 代替テキスト(ALT)に「投稿ページのタイトル」を設定
    $page_title = get_the_title($post_id);
    if (empty($page_title)) {
        $page_title = '投稿アイキャッチ画像_ID = ' . $post_id;
    }
    update_post_meta($attachment_id, '_wp_attachment_image_alt', $page_title);

    // ③ 実際のファイル名のリネーム処理
    if ($current_file && file_exists($current_file)) {
        $file_dir = dirname($current_file);
        $ext      = '.' . pathinfo($current_file, PATHINFO_EXTENSION);
        
        $new_filename_base = 'post-id-' . $post_id;
        $unique_filename   = wp_unique_filename($file_dir, $new_filename_base . $ext);
        $new_file_path     = $file_dir . '/' . $unique_filename;

        if (rename($current_file, $new_file_path)) {
            update_attached_file($attachment_id, $new_file_path);

            $metadata = wp_get_attachment_metadata($attachment_id);
            if ($metadata && isset($metadata['file'])) {
                $old_basename = basename($current_file);
                $metadata['file'] = str_replace($old_basename, $unique_filename, $metadata['file']);
                
                if (isset($metadata['sizes']) && is_array($metadata['sizes'])) {
                    foreach ($metadata['sizes'] as $size_key => $size_info) {
                        $old_size_file = $file_dir . '/' . $size_info['file'];
                        if (file_exists($old_size_file)) {
                            $new_size_file_name = str_replace(pathinfo($old_basename, PATHINFO_FILENAME), pathinfo($unique_filename, PATHINFO_FILENAME), $size_info['file']);
                            rename($old_size_file, $file_dir . '/' . $new_size_file_name);
                            $metadata['sizes'][$size_key]['file'] = $new_size_file_name;
                        }
                    }
                }
                wp_update_attachment_metadata($attachment_id, $metadata);
            }
        }
    }
}

変更前のコード

日付等で変換しているとこもある。使えないことはない。

/**
 * ① 新規にアップロードする画像の「タイトル」を「記事ID」に自動変換、それと「ALT」を自動挿入するコード、①と②がセットになっている。
 */
add_action('add_attachment', 'update_image_meta_data');
function update_image_meta_data($attachment_id) {
    // 添付ファイルが画像かどうかをチェック
    if (!wp_attachment_is_image($attachment_id)) {
        return;
    }

    $parent_id = 0;
    if (isset($_REQUEST['post'])) {
        $parent_id = intval($_REQUEST['post']);
    } else {
        $parent_id = wp_get_post_parent_id($attachment_id);
    }

    if ($parent_id > 0) {
        // 親記事のタイトルを取得
        $parent_title = get_the_title($parent_id);

        // 【設定】代替テキスト(alt)にする文字列(親記事のタイトル)
        $alt_text = $parent_title; 

        // 1. タイトル(post_title)を「記事ID: 〇〇」に更新
        $new_title = '記事ID = ' . $parent_id;
        wp_update_post([
            'ID'         => $attachment_id,
            'post_title' => $new_title,
            'post_name'  => sanitize_title($new_title)
        ]);

        // 2. 代替テキスト(alt属性)を更新
        update_post_meta($attachment_id, '_wp_attachment_image_alt', $alt_text);
    }
}

/**
 * ② 新規にアップロードする画像の「タイトル」を「記事ID」に自動変換、それと「ALT」を自動挿入するコード、①と②がセットになっている。
 */
function set_image_title_to_post_id( $post_ID ) {
    // 添付ファイル(画像)の情報を取得
    $attachment = get_post( $post_ID );

    // 添付ファイルの親ID(記事ID)を取得
    $parent_id = $attachment->post_parent;

    // 親記事が存在する場合、タイトルを投稿IDに変更
    if ( $parent_id > 0 ) {
        $new_title = '記事ID-' . $parent_id; // "Page-123" のような形式になります

        // 更新用データ
        $updated_attachment = array(
            'ID'         => $post_ID,
            'post_title' => $new_title,
        );

        // データベースを更新
        wp_update_post( $updated_attachment );
    }
}
// 画像が追加された時に実行
add_action( 'add_attachment', 'set_image_title_to_post_id' );


/**
 * 画像アップロード時に画像の『ファイル名』を『投稿ID』に、『IDが無い』場合は『日付』に自動変換する
 */
function rename_file($filename) {

  global $filename_new;

  // 記事ID取得 (クラシックエディタ)
  $post_id = isset( $_POST['post_id'] ) ? (int)$_POST['post_id'] : ''; 
  // 記事ID取得 (ブロックエディタ)
  if( !$post_id ){
      $post_id = isset( $_POST['post'] ) ? (int)$_POST['post'] : ''; 
  }

  // ファイル拡張子を取得、jpgとかpngとか
  $ext = pathinfo( $filename, PATHINFO_EXTENSION );   

  // 投稿、固定ページのIDをファイル名とする
  if( $post_id ){
      $filename_new = $post_id;

  // メディアライブラリへ直接アップロードした場合のファイル名(日付時刻を取得)
  }else{
      $filename_new = date_i18n('ymdHi');
  }
  //ファイル名+拡張子を出力(実際に固定出力されるファイル名と流動的なID番号+拡張子)
  return 'post-id-'.$filename_new.'.'.$ext;
  }

add_filter('sanitize_file_name', 'rename_file', 10);


/**
 * 右サイドの「アイキャッチ画像を設定」でアップロードされた場合のみ、『ファイル名』を「post-id」に変更する
 */
function rename_featured_image_to_post_id($file) {
    // 現在編集中の投稿ID(記事ID)を取得
    $post_id = isset($_POST['post_id']) ? intval($_POST['post_id']) : 0;
    
    // アイキャッチ画像のアップロード時(actionが"upload-attachment")かつ、有効な記事IDがある場合のみ処理
    if (isset($_POST['action']) && $_POST['action'] === 'upload-attachment' && $post_id > 0) {
        
        // ファイルの拡張子を取得(例: .jpg , .png)
        $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
        
        // 新しいファイル名を「記事ID.拡張子」にする(例: 123.jpg)
        $file['name'] = $post_id . '.' . strtolower($ext);
    }
    
    return $file;
}
add_filter('wp_handle_upload_prefilter', 'rename_featured_image_to_post_id');

ーーーーーーーーーーーーーーーーーーーー

この後は、色々やった結果で、実際には採用していない。あんまり複雑になりすぎ。

投稿ページに画像を入れた場合の『タイトル』と『ファイル名』の表示の仕方

以下は90行目:’post_title’ => $title_prefix . ” . $post_idの『”』の中に『_』を入れるか外すか、ここでは外している。投稿ページに画像を入れた場合のタイトルとファイル名はうまく変換されている。

AI作成のコードの状態

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

タイトル名とファイル名を修正した状態
161行目:’post-id-‘, ‘投句画像_ID = ‘に修正。
90行目:$title_prefix . ” . $post_id,の中の’_’ で_を削除。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

最初にページに入れた時、右サイドのメディアボックスの中には、以下のようにcontent-img-183と最後にID番号が入るようになるが、保存するか読み込み直すと上のように変換される。

21行目:$new_filename_base = ‘content-img-‘ . $post_id; 赤のところをpost-id-に変更するとこの問題が解決する。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

アイキャッチ画像を右サイドのボックスから入れた時の表示の仕方

以下は142行目:’eye-catch-id-‘, ‘投稿アイキャッチ画像_ID = ‘
投稿ページの右サイドのアイキャッチ画像ボックスに入れた場合の『タイトル』と『ファイル名』
うまく動作している。

AI作成のコードの状態

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

タイトル名とファイル名を修正した状態

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

メディアライブラリに画像を直接入れた場合の表示の仕方

例題1:作成した.afの名前がタイトルになり、その出力したファイルの名前がファイル名になる。

入れる前のファイル名:random-thumbnail-1.png
タイトル名は拡張子を外した名前になり、ファイル名はそのまま同じ名前になる。(未添付)になる。
現在はこの状態になる。
IDはタイトルまたはファイル名を変えても変更されないことを確認した。

非公開: 画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)
非公開: 画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

未添付は『投稿に添付』をクリックすると、これから使うページを選択して添付にすることができる。

例題2:以下のように.afの名前がタイトル『Affinityアイキャッチ画像-』になり、ここから出力されるファイル名がファイル名になるようだ。

非公開: 画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)
非公開: 画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

AI作成のコードをfanctions.phpに入れた場合は以下のように変換できるが、現在はそのコードは使っていない。

以下はタイトル:54行目の ‘画像_Number-‘ で変更できる。ファイル名:27行目の ‘img-number-‘ で変更できる。これはうまく動作している。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)
画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

上の直で入った画像をページに読み込む場合の表示に仕方

この画像は投稿ページにアップロードされたら、ファイル名が以下のように自動的に変換される。
画像が投稿ページのIDと関連つけされるようになる。これでファイルがどのページに配置されたかがよくわかるようになる。

AI作成のコードの状態

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

タイトル名とファイル名を修正した状態

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

ーーーーーーーーーーーーーーーーー

このページのURLがhttps://polo-web.com/wp-admin/post.php?post=28101&action=editとした場合
このpost=28101をタイトル名とファイル名の入れて、画像がどこに使われているかをすぐに確認できるようにしている。画像をページに入れる際、タイトル名とファイル名は自動変換されるので楽である。

「投稿ページ」に画像を入れる場合

タイトル:投稿ID = ◯◯◯◯、ファイル名:post-id-◯◯◯◯.jpg

WordPressで画像を入れる時に、タイトル:投稿ID = ◯◯◯◯、ファイル名:post-id-◯◯◯◯.jpgのように自動変換したい、〇〇はページのIDを入れる このfanction.phpを作成したい

WordPress 『ページ内に画像を入れる場合』と『右サイドの「アイキャッチ画像を設定」に画像を入れる場合』に、タイトルとファイル名を別々に違う名前で自動変換したい。それぞれページのIDを末尾に入れる このfanction.phpを作成したい

画像の投稿テスト

ページの右にあるメディアのところにも変換されたファイル名が表示されるので結果を確認することができる。

画像の投稿テスト

uploadsフォルダに作成されるファイル(以下の3つが作成される):
post-id-28101.jpg、post-id-28101-150×150.jpg、post-id-28101-300×115.jpg

/**
 * ブロックエディタ対応:画像アップロード時にファイル名とタイトルを投稿IDに自動変換する
 */

// 1. ファイル名の変換処理
add_filter('wp_handle_upload_prefilter', 'custom_rename_image_by_post_id');
function custom_rename_image_by_post_id($file) {
    $post_id = 0;

    // 通常のアップロード、またはREST API(ブロックエディタ)からの投稿ID取得
    if (isset($_REQUEST['post_id'])) {
        $post_id = intval($_REQUEST['post_id']);
    } elseif (isset($_SERVER['HTTP_X_WP_NONCE']) && preg_match('/\/wp\/v2\/media/', $_SERVER['REQUEST_URI'])) {
        // REST API経由の時はリクエストパラメータやクエリから投稿ID(parent)を探す
        if (isset($_GET['post'])) {
            $post_id = intval($_GET['post']);
        } elseif (isset($_POST['post'])) {
            $post_id = intval($_POST['post']);
        }
    }

    // 投稿IDが取得できない場合はそのまま返す
    if ($post_id === 0) {
        return $file;
    }

    // 拡張子を取得
    $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
    
    // ファイル名を「post-id-〇〇〇〇.jpg」に変換
    $file['name'] = 'post-id-' . $post_id . '.' . strtolower($ext);

    return $file;
}

// 2. メディアライブラリの「タイトル」の変換処理
add_filter('wp_insert_attachment_data', 'custom_set_image_title_by_post_id', 10, 2);
function custom_set_image_title_by_post_id($data, $postarr) {
    // 添付ファイル(画像など)の親投稿IDを取得
    $parent_id = isset($postarr['post_parent']) ? intval($postarr['post_parent']) : 0;

    // 親投稿IDがない場合は、直近のリクエストから取得を試みる
    if ($parent_id === 0 && isset($_REQUEST['post_id'])) {
        $parent_id = intval($_REQUEST['post_id']);
    }

    // 投稿IDが取得できた場合、タイトルを「投稿ID = 〇〇〇〇」にする
    if ($parent_id > 0) {
        $data['post_title'] = '投稿ID = ' . $parent_id;
    }

    return $data;
}

右サイドの「アイキャッチ画像を設定」に画像を入れた場合

WordPressで右サイドの「アイキャッチ画像を設定」に画像を入れる時、タイトル:投稿アイキャッチ画像 = ID ◯◯◯◯、ファイル名:eye-catch-post-id-◯◯◯◯.jpgのように自動変換したい、〇〇はページのIDを入れる。このfanction.phpを作成したい

タイトル:投稿アイキャッチ画像 = ID ◯◯◯◯、ファイル名:eye-catch-post-id-◯◯◯◯.jpg

この画像はページに付随しているのでIDを取得できる。もし、この画像が未添付になってMedia Scamnに表示されたら要注意!本来ならどこかに貼り付けてあるはずだが、貼り付けたものを入れ変えたりするとIssuesになるので削除の対象になるかも。要注意!

「アイキャッチ画像を設定」の窓にドロップして入れた場合も以下のようになる。

画像の投稿テスト

できれば、アイキャッチであることがわかるといいが、例えば「アイキャチ投稿ID =」とか。
これでもいいか。

uploadsフォルダに作成されるファイル(以下の4つが作成される):
post-id-28101-1.jpg、post-id-28101-1-150×150.jpg、post-id-28101-1-300×169.jpg、post-id-28101-1-768×432.jpg

add_filter('wp_handle_upload_prefilter', 'custom_rename_eyecatch_file_v2');
function custom_rename_eyecatch_file_v2($file) {
    $post_id = 0;

    // 1. リクエストパラメータから取得を試みる
    if (isset($_REQUEST['post_id'])) {
        $post_id = intval($_REQUEST['post_id']);
    } 
    // 2. ブロックエディタのインラインアップロード時のパラメータから試みる
    elseif (isset($_REQUEST['post'])) {
        $post_id = intval($_REQUEST['post']);
    }
    // 3. HTTPリファラ(現在の編集画面のURL)から投稿IDを抽出する
    elseif (isset($_SERVER['HTTP_REFERER'])) {
        $parsed_url = parse_url($_SERVER['HTTP_REFERER']);
        if (isset($parsed_url['query'])) {
            parse_str($parsed_url['query'], $query_vars);
            if (isset($query_vars['post'])) {
                $post_id = intval($query_vars['post']);
            }
        }
    }

    // 投稿IDが正しく取得できた場合のみ処理を実行
    if ($post_id > 0) {
        $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
        
        // ファイル名を「eye-catch-post-id-投稿ID.拡張子」に変更
        $file['name'] = sprintf('eye-catch-post-id-%d.%s', $post_id, strtolower($ext));
        
        // メディアのタイトル(DB登録用)を変更するフックをその場で登録
        add_filter('wp_insert_attachment_data', function($data, $postarr) use ($post_id) {
            $data['post_title'] = sprintf('投稿アイキャッチ画像 = ID %d', $post_id);
            return $data;
        }, 10, 2);
    }

    return $file;
}

上の2つを同時に入れるとうまく動作しない。

最終的な完成コード

/**
 * 1. 画像アップロード時は、一旦すべて「本文画像」のルールで命名&ページのタイトルをALTに設定
 */
add_filter('wp_handle_upload', 'custom_rename_all_uploads_to_content', 10, 2);
function custom_rename_all_uploads_to_content($upload, $context) {
    $post_id = 0;
    if (isset($_POST['post_id'])) { $post_id = intval($_POST['post_id']); }
    elseif (isset($_REQUEST['post'])) { $post_id = intval($_REQUEST['post']); }
    elseif (isset($_REQUEST['post_id'])) { $post_id = intval($_REQUEST['post_id']); }

    if (!$post_id) { return $upload; }

    $file_path = $upload['file'];
    $file_dir  = dirname($file_path);
    $ext       = '.' . pathinfo($file_path, PATHINFO_EXTENSION);

    $new_filename_base = 'eye-catch-id-' . $post_id;

    $unique_filename = wp_unique_filename($file_dir, $new_filename_base . $ext);
    $new_file_path   = $file_dir . '/' . $unique_filename;

    if (rename($file_path, $new_file_path)) {
        $upload['file'] = $new_file_path;
        $upload['url']  = str_replace(basename($file_path), $unique_filename, $upload['url']);
    }

    return $upload;
}

add_filter('wp_insert_attachment_data', 'custom_rename_all_titles_to_content', 10, 2);
function custom_rename_all_titles_to_content($data, $postarr) {
    $post_id = 0;
    if (isset($_POST['post_id'])) { $post_id = intval($_POST['post_id']); }
    elseif (isset($_REQUEST['post'])) { $post_id = intval($_REQUEST['post']); }
    elseif (isset($_REQUEST['post_id'])) { $post_id = intval($_REQUEST['post_id']); }
    
    if (!$post_id) { return $data; }

    $data['post_title'] = '本文画像_ID = ' . $post_id;
    return $data;
}

// 初期アップロード時に「投稿ページのタイトル」を代替テキスト(ALT)に設定
add_action('add_attachment', 'custom_set_initial_alt_text_from_page_title');
function custom_set_initial_alt_text_from_page_title($attachment_id) {
    $post_id = 0;
    if (isset($_POST['post_id'])) { $post_id = intval($_POST['post_id']); }
    elseif (isset($_REQUEST['post'])) { $post_id = intval($_REQUEST['post']); }
    elseif (isset($_REQUEST['post_id'])) { $post_id = intval($_REQUEST['post_id']); }

    if ($post_id) {
        // 投稿ページのタイトルを取得
        $page_title = get_the_title($post_id);
        
        // もしページタイトルが空(タイトル未入力)の場合はフォールバック
        if (empty($page_title)) {
            $page_title = '投稿画像_ID' . $post_id;
        }
        
        update_post_meta($attachment_id, '_wp_attachment_image_alt', $page_title);
    }
}


/**
 * 2. アイキャッチ画像として投稿に設定された瞬間に、ファイル名・タイトルを書き換え、ALTにページタイトルを設定
 */
add_action('added_post_meta', 'custom_rename_when_featured_image_set', 10, 4);
add_action('updated_post_meta', 'custom_rename_when_featured_image_set', 10, 4);
function custom_rename_when_featured_image_set($meta_id, $post_id, $meta_key, $meta_value) {
    if ($meta_key !== '_thumbnail_id') { return; }

    $attachment_id = intval($meta_value);
    if (!$attachment_id) { return; }

    $current_file = get_attached_file($attachment_id);
    if (strpos(basename($current_file), 'post-id-') === 0) { return; }

    // ① メディアタイトルの書き換え
    wp_update_post(array(
        'ID'         => $attachment_id,
        'post_title' => 'アイキャッチ画像_ID = ' . $post_id
    ));
    
    // ② 代替テキスト(ALT)に「投稿ページのタイトル」を設定
    $page_title = get_the_title($post_id);
    if (empty($page_title)) {
        $page_title = 'アイキャッチ_' . $post_id;
    }
    update_post_meta($attachment_id, '_wp_attachment_image_alt', $page_title);

    // ③ 実際のファイル名のリネーム処理
    if ($current_file && file_exists($current_file)) {
        $file_dir = dirname($current_file);
        $ext      = '.' . pathinfo($current_file, PATHINFO_EXTENSION);
        
        $new_filename_base = 'post-id--' . $post_id;
        $unique_filename   = wp_unique_filename($file_dir, $new_filename_base . $ext);
        $new_file_path     = $file_dir . '/' . $unique_filename;

        if (rename($current_file, $new_file_path)) {
            update_attached_file($attachment_id, $new_file_path);

            $metadata = wp_get_attachment_metadata($attachment_id);
            if ($metadata && isset($metadata['file'])) {
                $old_basename = basename($current_file);
                $metadata['file'] = str_replace($old_basename, $unique_filename, $metadata['file']);
                
                if (isset($metadata['sizes']) && is_array($metadata['sizes'])) {
                    foreach ($metadata['sizes'] as $size_key => $size_info) {
                        $old_size_file = $file_dir . '/' . $size_info['file'];
                        if (file_exists($old_size_file)) {
                            $new_size_file_name = str_replace(pathinfo($old_basename, PATHINFO_FILENAME), pathinfo($unique_filename, PATHINFO_FILENAME), $size_info['file']);
                            rename($old_size_file, $file_dir . '/' . $new_size_file_name);
                            $metadata['sizes'][$size_key]['file'] = $new_size_file_name;
                        }
                    }
                }
                wp_update_attachment_metadata($attachment_id, $metadata);
            }
        }
    }
}

「メディアライブラリ」に、画像を直接アップロードする場合

「メディアライブラリ」に、画像を直接アップロードする場合に自動変換。まずメディアライブラリに直接アップロード時のファイル名をpost-number-◯◯◯.jpgとして、そのメディアライブラリの画像が実際に使われた時post-id-◯◯◯.jpgに変換するようなfanction.phpコードはできますか?。◯◯◯は投稿ページのIDです。

直接メディアライブラリに入れると、投稿IDを取得できないのでファイル名を日付に変換して入れている。
タイトルは元画像のファイル名がそのまま使われるので、後で手作業で変更する必要がある。
この場合、ちょっと面倒になるが、そんなに多くは無いと思うので手作業で修正すること。

画像の投稿テスト

uploadsフォルダに作成されるファイル(以下の2つが作成される):
post-id-2610021554.png、post-id-2610021554-150×150.png

この場合、投稿IDでは無いのでpost-idはやめて、img-日付のフィル名が良いかも。

「WP Random Post Thumbnails」プラグインに画像を入れる場合

設定 > Random Thumbnails から入れる場合。

以下のようにタイトルとファイル名はAIで作成したコードの直で入る画像のコードが適用されて、以下のように変換される。

実際にアップロードされた後にタイトルとファイル名は手作業でサムネイル専用の名前に変更するとわかりやすくなる。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

画像はRandom Thumbnailsのプラグインで使われているにもかかかわらず、右側が未添付になっていることに注意。Media Scan等のプラグインは削除の対象になるので注意が必要である。

uploadsフォルダに作成されるファイル(以下の4つが作成される):
post-id-2610021610.png、post-id-2610021610-150×150.png、post-id-2610021610-300×169.png、post-id-2610021610-768×432.png

これは使われる位置が不明なので沢山のサムネイルが用意されていると思われる。

サイトアイコンの画像はどうなる?

現在、以下のように表示されている。(未添付)投稿に添付 となっている。
これはサイトの基本情報> サイトアイコンで入れた画像と思われる。タイトルの後ろのグレーでー『サイトアイコ』ンとなっているので間違い無いと思う。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

ロゴアイコンはどうなる?

タイトルはサイトのドメイン名(polo-web)の後ろに(-logo)となり、タイトルの横にーロゴとグレー表示されるのでわかる。未添付となっているが絶対削除しないこと。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

ヘッダー画像はどうなる?

タイトルはサイトのドメイン名(polo-web)の後ろに(-header-img)となり、後ろに『現在のヘッダー画像』と出るのでわかる。未添付となっているが絶対削除しないこと。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

サムネイルが白色になる(編集画面で見るとチャントプレビューは存在する)

Google ChromeやSafari、Edgeなどの一般的なWebブラウザはTIFF画像の表示をネイティブサポートしてい無いので表示されないのかも。jpeg、pngに変換したほうが無難である。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

投稿ページを1ページそのまま削除したら画像はどうなる?

WordPressで1つの投稿ページをゴミ箱に入れても、メディアライブラリの画像は自動的には削除されず、そのまま残る。

Media Cleanerでも削除されないので、手作業で削除する必要がある。メディアライブラリの画像をクリックすると『ゴミ箱にあ入っているので開くことができません』と出るのでページがゴミ箱に入っているがわかる。

(未添付)投稿に添付となっている画像

以下のようになっている。多分だがどこにもリンクされていないの削除しても良い。注意すべきはタイトルで、自分のサイトで使っていないタイトルなら削除しても良いと思う。
もしリンク外れがわかったら、バックアップから画像をコピーするから。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

この左の『投稿に添付』をクリックすると『既存コンテンツに添付』という画面が出てくる。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)


WordPressのメディアライブラリにある「投稿に添付」ボタンは、その画像やファイルがどの記事(投稿や固定ページ)に関連付けられているか(あるいは付けられていないか)を確認・変更するための機能。
未添付となっているが、ちゃんとリンクされている可能性があるので、もしリンクされているところがわかる場合は、ここからどの投稿ページとリンクしているかを選択できると言うことらい。

WordPressは通常、投稿の編集画面からアップロードされた画像を自動的にその投稿に添付するが、メディアから直接アップロードした場合などは「未添付」になるため、ここで紐づけを行うと言うわけ。

メディアライブラリの画像が、どの投稿に紐づいているか(未添付の状態か、すでに別の投稿に添付されているか)を確認し、特定の投稿と手動で紐づけるための画面である。

「未添付」の画像を紐づけたい場合、この画面で記事を検索して選択し、添付処理を行うと、その画像が特定の投稿の「添付ファイル」として登録されることになるわけ。

手作業で確認する必要があるのでチョッと面倒である。
リンクされているのがどこなのかこのライブラリ一覧では分からない。一旦削除するとLing Checkerでわかるのでそれまで待つしかない。

uploadsフォルダに作成されるファイル

これは、アップロードする位置によって、それにあったファイルが作成される。

function.phpに作成されるコード

以下の全てのfunction.phpに入れている。Google AIに作成してもらった。

/**
 * 新規にアップロードする画像にタイトルに「投稿ID」、それと「ALT」を自動挿入するコード
 */

add_action('add_attachment', 'update_image_meta_data');
function update_image_meta_data($attachment_id) {
    // 添付ファイルが画像かどうかをチェック
    if (!wp_attachment_is_image($attachment_id)) {
        return;
    }

    $parent_id = 0;
    if (isset($_REQUEST['post'])) {
        $parent_id = intval($_REQUEST['post']);
    } else {
        $parent_id = wp_get_post_parent_id($attachment_id);
    }

    if ($parent_id > 0) {
        // 親記事のタイトルを取得
        $parent_title = get_the_title($parent_id);

        // 【設定】代替テキスト(alt)にする文字列(親記事のタイトル)
        $alt_text = $parent_title; 

        // 1. タイトル(post_title)を「記事ID: 〇〇」に更新
        $new_title = '投稿ID = ' . $parent_id;
        wp_update_post([
            'ID'         => $attachment_id,
            'post_title' => $new_title,
            'post_name'  => sanitize_title($new_title)
        ]);

        // 2. 代替テキスト(alt属性)を更新
        update_post_meta($attachment_id, '_wp_attachment_image_alt', $alt_text);
    }
}



/**
 * 画像アップロード時に画像の「ファイル名」を「投稿ID」に自動変換する
 */

function rename_file($filename) {

    global $filename_new;

    // 記事ID取得 (クラシックエディタ)
    $post_id = isset( $_POST['post_id'] ) ? (int)$_POST['post_id'] : ''; 
    // 記事ID取得 (ブロックエディタ)
    if( !$post_id ){
        $post_id = isset( $_POST['post'] ) ? (int)$_POST['post'] : ''; 
    }

    // ファイル拡張子を取得、jpgとかpngとか
    $ext = pathinfo( $filename, PATHINFO_EXTENSION );   

    // 記事IDをファイル名とする
    if( $post_id ){
        $filename_new = $post_id;

    // メディアライブラリへ直接アップロードした場合のファイル名(日付時刻)
    }else{
        $filename_new = date_i18n('ymdHi');
    }
    //ファイル名+拡張子を出力(実際に固定出力されるファイル名と流動的なID番号+拡張子)
    return 'post-id-'.$filename_new.'.'.$ext;
}


/**
 * 右サイドのアイキャッチ画像を設定に入れる画像のファイル名をID名に変換する
 */

add_filter('sanitize_file_name', 'rename_file', 10);

function auto_set_featured_image_from_content( $post_id ) {
    // リビジョンや自動保存の場合は何もしない
    if ( wp_is_post_revision( $post_id ) || ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) ) {
        return;
    }

    // すでにアイキャッチが設定されている場合は上書きしない(お好みで変更可)
    if ( has_post_thumbnail( $post_id ) ) {
        return;
    }

    $post = get_post( $post_id );
    if ( !$post ) {
        return;
    }

    // 本文から最初の<img>タグを正規表現で探す
    $output = preg_match_all( '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches );
    
    if ( $output && isset( $matches[1][0] ) ) {
        $image_url = $matches[1][0];
        
        // URLから添付ファイルID(メディアID)を取得
        $attachment_id = attachment_url_to_postid( $image_url );
        
        if ( $attachment_id ) {
            // アイキャッチ画像として保存
            set_post_thumbnail( $post_id, $attachment_id );
        }
    }
}
add_action( 'save_post', 'auto_set_featured_image_from_content' );

Media Cleanerでスキャンした後、ファイル名をPhoenix Media Renameで変更した場合どうなるのか?

現在、Trashに39、Ignoredに79入っている。これは上を導入してファイル名、その他を変更した時点の状態になる。TRashやIgnoredのファイル名は多分、導入前の古いファイル名で登録されていると思われる。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)

こんな場合、Trashのファイルを移動、削除しないでとあったので、まずスキャンをやり直したいと思う。

まず、キャッシュのクリアをとのことだったが、Media Cleanerにはキャッシュのクリアボタンが無く、自動的にスキャンの際、キャッシュをクリアするらしい。

問題なくスキャンが成功した。

Ignoredに入っているタイトル名を変更するとスキャンでどうなるか

タイトルを「ランダムサムネイル画像」に統一したい。
そんな場合、タイトルを「Phoenix Media Rename」で変更するとエラーになったので出来ない。

以下のように、メディア編集画面で変更すると問題なく変更ができた。スキャンも問題ない。

タイトル名の変更は画像の編集画面で変更するとうまくいく

  1. WordPressの管理画面から [メディア] > [ライブラリ] を開く。
  2. 該当の画像やファイルをクリック、詳細画面の「タイトル」欄を書き換える。
  3. 右側の「更新」ボタンで完了。

この方法なら再スキャンしないでもIgnoredに入っているタイトル名も問題なく変更されている。

WordPressで画像にタイトル名を最初から付けることができるのか?

アップロードしたファイルの拡張子を除いた名前が、そのままタイトルの初期値になるので最初からタイトルを好きなように付けることは出来ない。

変更はイメージの編集画面で行うことができる。ここ以外では出来ない(プラグインを使いならできる)。
タイトルは「ランダムサムネイル画像」と統一しても問題ない。
ランダムに入るのでページIDとは関係ない画像になる。これは全て未添付画像になる。

ここで変更した画像は、スキャンし直さないでもMedia Cleanerで自動的にタイトルが変更されている。

ページ指定の「アイキャッチ画像」を設定に入れる画像のタイトルの付け方

この画像もファイル名はともかく、タイトルはページ特有のアイキャッチ画像を入れる場合、はっきりそれとわかるタイトルを付けることにより、後々わかりやすい名前が必要になる。

一見してどのページのアイキャッチ画像かがわかると間違って削除しないと思うのでしっかり付けるほうが良いということになる。

名前は「投稿アイキャッチ画像 ID = 〇〇〇」とする。

プラグイン一覧ページに表示するアイコン

ページにインストールする場合は通常の『投稿者ID=〇〇◯〇〇』になる。
インストール後にタイトルを『プラグインアイコン』に統一する。
ファイル名は以下の通り。

画像のアップロード時、メディアライブラリでどのように表示されるのか(fanction.phpに入れた場合)