Description

Le deleteuploadedfiles La classe est conçue pour supprimer les fichiers téléchargés à la suite de notifications par courrier électronique. Cette fonctionnalité est particulièrement utile lorsque le stockage d'entrée et l'enregistrement dans la bibliothèque multimédia sont désactivés.

WPForms déconseille fortement de modifier directement les fichiers du thème parent. Toute modification apportée directement au thème parent risque d'être écrasée lors des mises à jour du thème, ce qui entraînerait la perte des personnalisations. Il est conseillé de créer et d'utiliser un thème enfant pour effectuer les modifications souhaitées.

Méthodes

  1. Établir des dépendances pour soutenir la classe en générant un fichier nommé class-delete-uploaded-files.php dans le répertoire racine de votre thème.
  2. Après avoir créé ce fichier, ouvrez votre functions.php et insérez l'extrait suivant. Enregistrez les modifications dans votre fichier de fonctions.
    require __DIR__ . '/class-delete-uploaded-files.php' ;
    
    ( new \WPF\DeleteUploadedFiles() )->hooks() ;
    

Source

Fichier : class-delete-uploaded-files.php

/**
 * Class deleteuploadedfiles to delete uploaded files from the server
 *
 * @link https://wpforms.com/developers/class-deleteuploadedfiles/
 */
<?php

namespace WPF;

class DeleteUploadedFiles {

	/**
	 * Should we delete files from the WordPress Media Library?
	 * Change the constant to true to delete files form the WordPress Media Library.
	 */
	const DELETE_MEDIA_FILES = false;

        /**
	* Add hooks.
	*/
	public function hooks() {
		add_action( 'wpforms_process_complete', [ $this, 'delete_attached_files' ], 10, 4 );
		add_filter( 'wpforms_html_field_value', [ $this, 'replace_html_field_value' ], 100, 4 );
		add_filter( 'wpforms_emails_notifications_plaintext_field_value', [ $this, 'replace_plaintext_field_value' ], 100, 3 );
		add_filter( 'wpforms_smarttags_process_field_id_value', [ $this, 'replace_field_id_smart_tags_value' ], 10, 5 );
		add_filter( 'wpforms_smarttags_process_field_value_id_value', [ $this, 'replace_field_value_id_smart_tags_value' ], 10, 5 );
	}

	/**
	 * Delete attached files after emails are sent if these files aren't stored in entries.
	 *
	 * @param array $fields    Fields data.
	 * @param array $entry     Form submission raw data ($_POST).
	 * @param array $form_data Form data and settings.
	 * @param int   $entry_id  Entry ID.
	 */
	public function delete_attached_files( $fields, $entry, $form_data, $entry_id ) {

		if ( ! $this->is_allowed_delete_files_after_sending_email( $form_data ) ) {
			return;
		}

		$delete_files_fields = $this->get_filtered_attached_files_fields( $form_data );

		if ( empty( $delete_files_fields ) ) {
			return;
		}

		foreach ( $delete_files_fields as $field_id ) {
			if ( empty( $fields[ $field_id ] ) ) {
				continue;
			}

			$field = $fields[ $field_id ];

			if ( self::DELETE_MEDIA_FILES ) {
				if ( ! empty( $field[ 'style' ] ) && $field[ 'style' ] === 'modern' ) {
					$is_media_field = false;

					foreach ( $field[ 'value_raw' ] as $file ) {
						if ( ! empty( $file[ 'attachment_id' ] ) ) {
							wp_delete_attachment( $file[ 'attachment_id' ], true );

							$is_media_field = true;
						}
					}

					if ( $is_media_field ) {
						continue;
					}
				}

				if ( ! empty( $field[ 'attachment_id' ] ) ) {
					wp_delete_attachment( $field[ 'attachment_id' ], true );

					continue;
				}
			}

			$files_paths = \WPForms_Field_File_Upload::get_entry_field_file_paths( $form_data[ 'id' ], $field );

			if ( empty( $files_paths ) ) {
				continue;
			}

			foreach ( $files_paths as $path ) {
				// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.unlink_unlink
				@unlink( $path );
			}
		}
	}

	/**
	 * Replace field value with (attached) text if file is attached
	 * to email and will be deleted after sending HTML email.
	 *
	 * @param string $field_val Field value.
	 * @param array  $field     The field.
	 * @param array  $form_data Form data and settings.
	 * @param string $context   Context usage.
	 *
	 * @return string
	 */
	public function replace_html_field_value( $field_val, $field, $form_data, $context ) {

		if ( $context !== 'email-html' ) {
			return $field_val;
		}

		if ( empty( $field[ 'type' ] ) || $field[ 'type' ] !== 'file-upload' ) {
			return $field_val;
		}

		if ( ! $this->is_allowed_delete_files_after_sending_email( $form_data ) ) {
			return $field_val;
		}

		$delete_files_fields = $this->get_filtered_attached_files_fields( $form_data );

		if ( empty( $field[ 'id' ] ) || ! in_array( $field[ 'id' ], $delete_files_fields, true ) ) {
			return $field_val;
		}

		if ( ! empty( $field[ 'style' ] ) && $field[ 'style' ] === 'modern' ) {
			$files = [];

			foreach ( $field['value_raw'] as $file ) {
				$file_name = $file['file'] ?? '';

				$files[] = sprintf( '%1$s (%2$s)', $file_name, __( 'attached', 'wpforms' ) );
			}

			return implode( "\n", $files );
		}

		$file_name = $field[ 'file' ] ?? '';

		return sprintf( '%1$s (%2$s)', $file_name, __( 'attached', 'wpforms' ) );
	}

	/**
	 * Replace field value with (attached) text if file is attached
	 * to email and will be deleted after sending text email.
	 *
	 * @param string $field_val Field value.
	 * @param array  $field     The field.
	 * @param array  $form_data Form data and settings.
	 *
	 * @return string
	 */
	public function replace_plaintext_field_value( $field_val, $field, $form_data ) {

		$replaced_value = $this->replace_html_field_value( $field_val, $field, $form_data, 'email-html' );

		if ( $replaced_value !== $field ) {
			return $replaced_value . "\r\n\r\n";
		}

		return $field_val;
	}

	/**
	 * Replace {field_id} smart tag value with (attached) text if file is attached
	 * to email and will be deleted after sending text email.
	 *
	 * @param scalar|null $value            Smart Tag value.
	 * @param array       $form_data        Form data.
	 * @param array       $fields           List of fields.
	 * @param int         $entry_id         Entry ID.
	 * @param SmartTag    $smart_tag_object The smart tag object or the Generic object for those cases when class unregistered.
	 *
	 * @return string
	 */
	public function replace_field_id_smart_tags_value( $value, $form_data, $fields, $entry_id, $smart_tag_object ) {

		$attributes = $smart_tag_object->get_attributes();

		if ( empty( $attributes[ 'field_id' ] ) ) {
			return $value;
		}

		if ( empty( $fields[ $attributes[ 'field_id' ] ] ) ) {
			return $value;
		}

		return $this->replace_html_field_value( $value, $fields[ $attributes[ 'field_id' ] ], $form_data, 'email-html' );
	}

	/**
	 * Replace {field_value_id} smart tag value with (attached) text if file is attached
	 * to email and will be deleted after sending text email.
	 *
	 * @param scalar|null $value            Smart Tag value.
	 * @param array       $form_data        Form data.
	 * @param array       $fields           List of fields.
	 * @param int         $entry_id         Entry ID.
	 * @param SmartTag    $smart_tag_object The smart tag object or the Generic object for those cases when class unregistered.
	 *
	 * @return string
	 */
	public function replace_field_value_id_smart_tags_value( $value, $form_data, $fields, $entry_id, $smart_tag_object ) {

		$attributes = $smart_tag_object->get_attributes();

		if ( empty( $attributes[ 'field_value_id' ] ) ) {
			return $value;
		}

		if ( empty( $fields[ $attributes[ 'field_value_id' ] ] ) ) {
			return $value;
		}

		return $this->replace_html_field_value( $value, $fields[ $attributes[ 'field_value_id' ] ], $form_data, 'email-html' );
	}

	/**
	 * Determine if the files should be deleted after sending email.
	 *
	 * @param array $form_data Form data and settings.
	 *
	 * @return bool
	 */
	private function is_allowed_delete_files_after_sending_email( $form_data ) {

		return ! empty( $form_data[ 'settings' ][ 'disable_entries' ] ) && ! empty( $form_data[ 'settings' ][ 'notifications' ] );
	}

	/**
	 * Get fields IDs that are attached to email and will be deleted after sending email.
	 *
	 * @param array $form_data Form data and settings.
	 *
	 * @return array
	 */
	private function get_filtered_attached_files_fields( $form_data ) {

		if ( empty( $form_data[ 'fields' ] ) || empty( $form_data[ 'settings' ][ 'notifications' ] ) ) {
			return [];
		}

		$fields = $this->get_all_attached_files_fields( $form_data );

		foreach ( $fields as $key => $field_id ) {
			if ( empty( $form_data[ 'fields' ][ $field_id ][ 'type' ] ) || $form_data['fields'][ $field_id ][ 'type' ] !== 'file-upload' ) {
				unset( $fields[ $key ] );
			}

			if ( ! self::DELETE_MEDIA_FILES && ! empty( $form_data[ 'fields' ][ $field_id ][ 'media_library' ] ) ) {
				unset( $fields[ $key ] );
			}
		}

		return $fields;
	}

	/**
	 * Get fields IDs that are attached to email.
	 *
	 * @param array $form_data Form data and settings.
	 *
	 * @return array
	 */
	private function get_all_attached_files_fields( $form_data ) {

		$is_first = true;
		$fields   = [];

		foreach ( $form_data[ 'settings' ][ 'notifications' ] as $notification ) {
			if ( empty( $notification[ 'file_upload_attachment_enable' ] ) || empty( $notification[ 'file_upload_attachment_fields' ] ) ) {
				return [];
			}

			if ( $is_first ) {
				$fields   = $notification[ 'file_upload_attachment_fields' ];
				$is_first = false;

				continue;
			}

			$fields = array_intersect( $fields, $notification[ 'file_upload_attachment_fields' ] );
		}

		return $fields;
	}
}

Utilisation

Pour utiliser cette classe, certaines conditions doivent être remplies.

Les entrées sont désactivées

Pour désactiver l'enregistrement des entrées, sélectionnez Paramètres " Général. Confirmer la Désactiver le stockage des informations de saisie dans WordPress est activée.
désactiver l'enregistrement des entrées

Désactiver le stockage des téléchargements dans la bibliothèque multimédia

Ensuite, assurez-vous que le champ File Upload (téléchargement de fichiers) ne contient pas l'option Store file in WordPress Media Library (stocker les fichiers dans la médiathèque de WordPress) en cliquant sur le champ et dans l'onglet Advanced (avancé ), assurez-vous que l'option est désactivée.

désactiver le stockage des fichiers dans la bibliothèque multimédia

Joindre un fichier aux notifications par courrier électronique

Enfin, la dernière étape consiste à s'assurer que les pièces jointes sont activées pour la notification par courrier électronique. Pour ce faire, accédez à Paramètres " Notifications et, sous les options avancées, activez l'option Activer les pièces jointes pour le téléchargement de fichiers. Dans le menu déroulant Champs de téléchargement de fichiers, sélectionnez votre champ de téléchargement.

Activer le téléchargement de fichiers en pièce jointe

Une fois ces paramètres définis, tout téléchargement de fichier sur vos formulaires attachera les fichiers téléchargés mais ne les stockera pas sur votre serveur.

Supplémentaire (facultatif)

En outre, cette classe permet de supprimer les fichiers téléchargés de la médiathèque de WP. Cette fonction est désactivée par défaut, car certains utilisateurs peuvent préférer conserver les fichiers téléchargés dans la médiathèque de WP, en particulier lorsqu'ils utilisent la fonction Addon "Post Submissions" (soumissions de messages) et nécessitant le stockage de fichiers pour les vignettes. Néanmoins, si les utilisateurs souhaitent supprimer les fichiers téléchargés et les fichiers associés de la médiathèque de WP, ils doivent modifier l'attribut DELETE_MEDIA_FILES constante dans le class-delete-uploaded-files.php à l'adresse true.