ファイルアップロード時に元のファイル名を保持する方法

はじめに

通知]タブの詳細オプションから[ファイルのアップロード添付を有効にする]オプションを有効にした場合、電子メール通知内のファイルの元のファイル名を保持したいですか?デフォルトでは、WPFormsはセキュリティのためとファイル名が重複した場合のために、元のファイル名にアルファベットと数字の文字列を追加します。しかし、このセキュリティのレイヤーを削除したい場合は、PHPフィルタで簡単に実現できます。このチュートリアルでは、その具体的な方法を説明します!

このスニペットはWordPressバージョン6.2でのみ使用できます。

フォームの作成

まず、新しいフォームを作成します。このドキュメントでは、レクリエーションの野球チームがチームシャツを注文するためのシンプルなサインアップシートを作成します。いくつかの基本的な情報を用意しますが、チームが独自のデザインをアップロードできるように、ファイルアップロードフィールドも追加します。

フォームを作成し、フィールドを追加します。

フォームの作成にヘルプが必要な場合は、こちらのお役立ちガイドをご覧ください

添付ファイルを含めるオプションを有効にする

フォームフィールドを追加したら、フォームビルダー内の設定タブをクリックします。次に通知タブに向かい、下にスクロールして詳細オプションを開きます。

Enable File Upload Attachments(添付ファイルのアップロードを有効にする)のボタンをクリックしてトグルし、添付ファイルを含めたいフィールドを選択します。このチュートリアルでは、ファイルアップロードフィールドは1つしかないので、そのフィールドをこのセクションに追加するだけです。

通知]タブから[詳細設定]を開き、[添付ファイルのアップロードを有効にする]ボタンをクリックします。

スニペットの追加

次に、スニペットをサイトに追加します。自分のサイトにスニペットを追加する方法についてサポートが必要な場合は、こちらのチュートリアルをご覧ください

このスニペットを追加することで、すべてのフォームとファイルアップロードで同じになることに注意してください。

/**
 * Retain original file name on file uploads
 *
 * @link https://wpforms.com/developers/how-to-retain-the-original-file-name-for-file-uploads/
 */
  
function wpf_emails_send_email_data( $email, $email_obj ) {

	if ( empty( $email[ 'attachments' ] ) ) {
		return $email;
	}

	if ( ! isset( $email_obj->form_data, $email_obj->notification_id, $email_obj->fields ) ) {
		return $email;
	}

	$form_data       = $email_obj->form_data;
	$notification_id = $email_obj->notification_id;
	$entry_fields    = $email_obj->fields;

	if (
		empty( $entry_fields ) ||
		empty( $form_data[ 'settings' ][ 'notifications' ][ $notification_id ][ 'file_upload_attachment_enable' ] ) ||
		empty( $form_data[ 'settings' ][ 'notifications' ][ $notification_id ][ 'file_upload_attachment_fields' ] )
	) {
		return $email;
	}

	$attachment_fields       = $form_data[ 'settings' ][ 'notifications' ][ $notification_id ]['file_upload_attachment_fields'];
	$entry_attachment_fields = [];

	foreach ( $attachment_fields as $field_id ) {
		if ( ! empty( $entry_fields[ $field_id ] ) ) {
			$entry_field = $entry_fields[ $field_id ];

			if ( ! empty( $entry_field[ 'style' ] ) && $entry_field[ 'style' ] === 'modern' ) {
				foreach ( $entry_field[ 'value_raw' ] as $file ) {
					$entry_attachment_fields[ $file[ 'file' ] ] = $file;
				}
			} else {
				$entry_attachment_fields[ $entry_field['file'] ] = $entry_field;
			}
		}
	}

	$attachments = [];

	foreach ( $email[ 'attachments' ] as $attachment ) {
		$file_name = basename( $attachment );

		if ( empty( $entry_attachment_fields[ $file_name ][ 'file_user_name' ] ) ) {
			$attachments[] = $attachment;

			continue;
		}

		$attachments[ $entry_attachment_fields[ $file_name ][ 'file_user_name' ] ] = $attachment;
	}

	$email[ 'attachments' ] = $attachments;

	return $email;
}

add_filter( 'wpforms_emails_send_email_data', 'wpf_emails_send_email_data', 30, 2 );

このスニペットは、メールに添付されたファイルを探し、ハッシュ化された文字列を追加する代わりに、アップロードされた元のファイル名を保持する。

これで、メール添付ファイルのファイル名がtheres-no-base-like-home-svg-8abdd7ea434445587fb0e1b560b137b1.pngの代わりに、スニペット追加後のファイル名がtheres-no-base-like-home-svg.pngになります。

スニペットが追加された後、添付ファイル名は元のファイル名になります。

ファイル名はハッシュ化され、サーバーからファイルをダウンロードするための正しいURLを手動で特定することを防ぐと同時に、重複したファイル名からファイルを保護します。このスニペットを使用すると、WPFormsのこれらのセキュリティ対策が無効になります。

これで完了です!PHPフィルタを使用して、メール通知の添付ファイル名を元のファイル名に保持することに成功しました。もっと大きなファイルをアップロードする時間を変更したいですか?モダンファイルアップロードのタイムアウトを変更する方法をご覧ください。