ご注意!

この記事には PHP コードが含まれており、開発者を対象としています。このコードは便宜上提供していますが、コードのカスタマイズやサードパーティの開発についてはサポートを提供していません。

追加のガイダンスについては、WPBeginner の カスタムコードの追加方法に関するチュートリアル を参照してください。

閉じる

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

はじめに

「通知」タブの「詳細設定」から「ファイルアップロード添付を有効にする」オプションを有効にした場合、メール通知内のファイルで元のファイル名を保持しますか?デフォルトでは、WPFormsはセキュリティ上の理由とファイル名の重複を避けるために、元のファイル名に英数字の文字列を追加します。しかし、このセキュリティレイヤーを削除したい場合は、PHPフィルターを使用して簡単に実現できます。このチュートリアルでは、その方法を詳しく説明します!

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

フォームの作成

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

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

フォームの作成についてサポートが必要な場合は、こちらの役立つガイドをご覧ください

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

フォームフィールドを追加したら、フォームビルダー内の「設定」タブをクリックします。次に、「通知」タブに移動し、下にスクロールして「詳細設定」を開きます。

ファイルアップロード添付を有効にする」のボタンをオンに切り替え、添付ファイルを含めたいフィールドを選択します。このチュートリアルでは、「ファイルアップロード」フィールドは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フィルターを使用して、メール通知のファイル添付の元のファイル名を正常に保持できました。訪問者が大きなファイルをアップロードするための時間を変更したいですか?モダンファイルアップロードのタイムアウトを変更する方法に関する記事をご覧ください。