日本語名の画像ファイルアップロード時、ファイル名を英数字に変更する(ブロックエディタ対応)

WordPressで日本語名の画像ファイルをアップロードすると アップロードされたファイル名が えらい事になりますよね。

これでは後で見たとき 何の画像かわからなくなります。
もとのファイル名を英数字にすればいいのですが、パソコン上に置いておく元ファイル名は日本語の方が管理しやすいのでそうしてる方も多いと思います。
 
そこで、日本語名の画像ファイルをアップロードしても、投稿IDをベースに自動でファイル名を英数字に変更する方法を紹介します。

メディア一覧ではファイルのタイトルは日本語でファイル名は英数字になりますのでこちらも管理しやすくなるかと思います。

また、ブロックエディタのファイルアップロードにも対応しています。

 

サンプル

以下のコードを my-plugin.php に張り付けてみてください。

/*
 * 画像登録時、アップロードするファイル名を 変更する
 * post_parentより $post_id を取得して ファイル名を生成する
 *
 * @param string $filename     Sanitized filename.
 * @param string $filename_raw The filename prior to sanitization.
 * License: GPLv2 or later
 */
function nendebcom_rename_upload_file( $filename, $filename_raw ){

	global $old_filename;

	$old_filename = $filename_raw;

	$name = pathinfo( $filename, PATHINFO_BASENAME );
	// ファイル名を小文字に変換
	$name = strtolower( $name );
	//sitemap.xml自動生成時は何もしない
	if ( $name == 'sitemap' ) {
		return $filename;
	}

	// 拡張子を取得
	$ext = pathinfo( $filename, PATHINFO_EXTENSION );
	$ext = strtolower( $ext );
	if ( $ext ) {
		$ext = '.' . $ext;
	}

	// post_parent 取得 (旧エディタ)
	$post_id = isset( $_POST['post_id'] ) ? (int)$_POST['post_id'] : ''; 

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

	// $post_idよりファイル名を生成する
	if( $post_id ){

		//商品番号
		$item_no = get_post_meta( $post_id, 'item_no', true );

		if( $item_no != '' ){
			$filename = 'item_' . $item_no . $ext;		// 商品番号ベースのファイル名
		}else{
			$filename = 'post_' . $post_id . $ext;		// post_idベースのファイル名
		}

	// メディアアップロードの場合
	}else{
		$filename = 'media' . $ext;		// media
	}

	return $filename;
}
add_filter( 'sanitize_file_name', 'nendebcom_rename_upload_file', 10, 2 );


/**
 * アップロードした ファイル名をタイトルにする
 * Fires after a single attachment is completely created or updated via the REST API.
 *
 * @since WordPress 5.0.0
 * @param WP_Post         $attachment Inserted or updated attachment object.
 * @param WP_REST_Request $request    Request object.
 * @param bool            $creating   True when creating an attachment, false when updating.
 * License: GPLv2 or later
 */
function nendebcom_rename_upload_title( $attachment, $request ){

	global $old_filename;

	if( $attachment->post_type == 'attachment' && $old_filename ){
		//アップロードしたファイル名から拡張子を外してタイトルにする
		$ext  = pathinfo( $old_filename, PATHINFO_EXTENSION );
		$file_title = str_replace( '.' . $ext, '', $old_filename );

		//タイトルを更新
		$update_attachment = array(
			'ID'         => $attachment->ID,
			'post_title' => $file_title
		);

		wp_update_post( $update_attachment );
	}
}
add_action( 'rest_after_insert_attachment', 'nendebcom_rename_upload_title', 10, 2 );

 
 

解説

nendebcom_rename_upload_file関数

アップロードされたファイル名を変更します。このあたりはお好みで変更してください。
 
投稿記事画面より画像アップロードすると post_parent(投稿ID)がとれますので post_parent をベースにファイル名を生成します。

		$filename = 'post_' . $post_id . $ext;		// post_idベースのファイル名

ここでは プレフィックスに「post_」をつけてから投稿IDをつけています。
 

もし、カスタムフィールド(商品番号等)があって アップロード前に保存していると カスタムフィールドの値をベースにファイル名を生成することもできます。

		$filename = 'item_' . $item_no . $ext;		// 商品番号ベースのファイル名

 

管理画面のメディア → 新規追加 からアップロードされると post_parentが取れませんので 一律な採番になります。

		$filename = 'media' . $ext;		// media

 
このコード上では毎回 同じファイル名になりますが この後 WordPressの機能で すでに同じファイルがあれば -1,-2,-3・・のように 枝番をつけるようにファイル名が訂正されます。
※できれば(初期設定時に) 管理画面のメディア設定 で「アップロードしたファイルを年月ベースのフォルダに整理」のチェックを外してください。

固定ページやカスタム投稿タイプでも使えます。カスタム投稿タイプ定義の際には「thumbnail(アイキャッチ画像のこと)」を有効にしといてください。

nendebcom_rename_upload_title関数

画像ページのタイトルを変更しています。
ブロックエディタのファイルアップロードは 一部「REST API」を使ってます。この場合だけ従来のと仕組みが違いますので タイトルを上書きするようにしています。

 
 

ご注意

他のプラグインには自動でファイルを作って保存するものもあります。(sitemap.xmlとか)
その時もファイル名が変わってしまいますので、あわせて確認して対策してくださいね。

 
 

参考

sanitize_file_name() | Function | WordPress Developer Resources
https://developer.wordpress.org/reference/functions/sanitize_file_name/

rest_after_insert_attachment | Hook | WordPress Developer Resources
https://developer.wordpress.org/reference/hooks/rest_after_insert_attachment/