Descrição

O deleteuploadedfiles A classe foi projetada para excluir os arquivos carregados após as notificações por e-mail. Essa funcionalidade é particularmente útil quando o armazenamento de entradas e o salvamento na Biblioteca de mídia estão desativados.

O WPForms desaconselha fortemente a modificação direta de qualquer arquivo de tema pai. Quaisquer alterações feitas diretamente no tema pai correm o risco de serem sobrescritas durante as atualizações do tema, resultando na perda das personalizações. É aconselhável criar e usar um tema filho para fazer as alterações desejadas.

Métodos

  1. Estabeleça dependências para dar suporte à classe, gerando um arquivo chamado class-delete-uploaded-files.php no diretório raiz do seu tema.
  2. Depois de criar esse arquivo, abra o arquivo functions.php e insira o seguinte snippet. Salve as alterações em seu arquivo de funções.
    require __DIR__ . '/class-delete-uploaded-files.php';
    
    ( new \WPF\DeleteUploadedFiles() )->hooks();
    

Fonte

Arquivo: 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;
	}
}

Uso

Para utilizar essa classe, há determinados requisitos de configuração.

As entradas estão desativadas

Para desativar o armazenamento das entradas, selecione Configurações " Geral. Confirme a Desativar o armazenamento de informações de entrada no WordPress está ativado.
desativar o armazenamento das entradas

Desativar o armazenamento de uploads na Biblioteca de mídia

Em seguida, certifique-se de que o campo File Upload tenha a opção Store file in WordPress Media Library desativada clicando no campo e, na guia Advanced, certifique-se de que a configuração esteja desativada.

desativar o armazenamento dos arquivos na Biblioteca de mídia

Anexar arquivo a notificações por e-mail

Por fim, a última etapa é certificar-se de que os anexos de arquivos estejam ativados para a notificação por e-mail. Para concluir essa etapa, navegue até Settings " Notifications (Configurações " Notificações ) e, nas opções Advanced (Avançadas ), ative a opção Enable File Upload Attachments (Ativar anexos de upload de arquivos). No menu suspenso File Upload Fields (Campos de upload de arquivos ), selecione o campo de upload.

Ativar anexos de upload de arquivos

Depois que essas configurações forem concluídas, qualquer upload de arquivo em seus formulários anexará os arquivos carregados, mas não os armazenará em seu servidor.

Adicional (opcional)

Além disso, essa classe permite a remoção de arquivos carregados da WP Media Library. Esse recurso é desativado por padrão, pois alguns usuários podem preferir manter os arquivos carregados no WP Media, especialmente ao utilizar o Complemento de envios de postagens e exigindo armazenamento de arquivos para miniaturas. No entanto, se os usuários desejarem excluir os arquivos carregados e os arquivos associados da Biblioteca de mídia do WP, será necessário modificar o parâmetro DELETE_MEDIA_FILES constante no class-delete-uploaded-files.php arquivo para true.