Descripción
En deleteuploadedfiles
La clase está diseñada para eliminar archivos cargados después de las notificaciones por correo electrónico. Esta funcionalidad es especialmente útil cuando el almacenamiento de entradas y el guardado en la Biblioteca multimedia están desactivados.
WPForms desaconseja modificar cualquier archivo del tema padre directamente. Cualquier alteración hecha directamente al tema padre corre el riesgo de ser sobrescrita durante las actualizaciones del tema, resultando en la pérdida de las personalizaciones. Se aconseja crear y utilizar un tema hijo para realizar los cambios deseados.
Métodos
- Establecer dependencias para soportar la Clase generando un archivo llamado
class-delete-uploaded-files.php
dentro del directorio raíz de su tema. - Después de crear este archivo, abra su
functions.php
e inserte el siguiente fragmento. Guarde los cambios en su archivo de funciones.require __DIR__ . '/clase-borrar-archivos-cargados.php'; ( new \WPF\DeleteUploadedFiles() )->hooks();
Fuente
Archivo: 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; } }
Utilización
Para utilizar esta Clase, existen ciertos requisitos de configuración.
Entradas desactivadas
Para desactivar el almacenamiento de las entradas, seleccione Ajustes " General. Confirme la Desactivar el almacenamiento de información de entrada en WordPress está activado.
Desactivar el almacenamiento de cargas en la biblioteca multimedia
A continuación, asegúrese de que el campo Carga de archivos tiene desactivada la opción Almacenar archivo en la biblioteca multimedia de WordPress haciendo clic en el campo y en la pestaña Avanzado, asegúrese de que la configuración está desactivada.
Adjuntar un archivo a las notificaciones por correo electrónico
Finalmente, el último paso es asegurarse de que los archivos adjuntos están habilitados para la notificación por correo electrónico. Para completar este paso, navegue a Configuración " Notificaciones y bajo las opciones Avanzadas, habilite la opción Habilitar Archivos Adjuntos. En el menú desplegable Campos de carga de archivos, seleccione su campo de carga.
Una vez completados estos ajustes, cualquier subida de archivos en sus formularios adjuntará los archivos subidos pero no los almacenará en su servidor.
Adicional (opcional)
Además, esta Clase permite la eliminación de archivos subidos desde la Librería de Medios WP. Esta característica está desactivada por defecto, ya que algunos usuarios pueden preferir mantener los archivos subidos en la WP Media, especialmente cuando se utiliza Complemento Post Submissions y requiriendo almacenamiento de archivos para las miniaturas. No obstante, si los usuarios desean eliminar tanto los archivos subidos como los archivos asociados de la Mediateca WP, deben modificar la directiva DELETE_MEDIA_FILES
constante en el class-delete-uploaded-files.php
archivo a true
.