Si dijera (que lo digo) que Gravity Forms es, con diferencia, el mejor y más completo plugin para formularios que hay para WordPress me estaría repitiendo. Con él puedes implementar desde un sencillo formulario de contacto hasta un sencillo ecommerce, con gestión del pago incluida.
Y además permite complementar sus funcionalidades de una forma muy flexible gracias a los hooks (filtros y acciones) que incluye. Hoy vemos otro ejemplo de ello: vamos a ver cómo podemos adjuntar archivos a los emails de notificación que envía.
Tabla de contenidos
Filtros de Gravity Forms para adjuntar archivos a las notificaciones
Esto lo podemos hacer gracias a que Gravity Forms incluye filtros específicos para las notificaciones, el filtro gform_notification, que recibe tres parámetros, tres objetos concretamente:
- El objeto notificación
- El objeto formulario
- El objeto entrada
No voy a entrar en disquisiciones técnicas que sólo nos interesan a los programadores, basta decir que en este caso vamos a aprovechar el objeto notificación que recibe el filtro. Una de sus propiedades es el array attachments y, ya lo puedes imaginar, ahí es donde vamos a colocar nuestros documentos.
Qué filtro utilizar
Ya he dicho que usaremos el filtro gform_notification, pero éste es un filtro genérico que se aplica a todas las notificaciones enviadas por Gravity Forms, tanto las de administrador como las de usuario para todos y cada uno de los formularios.
Y claro, tenemos que ser un poco más específicos. Ya distinguiremos dentro de nuestra función a cuál de las notificaciones queremos adjuntar nuestros archivos, pero de momento vamos a establecer para qué formulario queremos hacerlo.
Por poca experiencia que tengas programando ya estarás pensando: Bueno, si has dicho que el filtro recibe el objeto formulario, ahí podemos condicionar para elegir el/los formulario/s que nos dé la gana.
Y sí, razón no te falta. Pero como nos gusta ahorrarnos pasos (y código 🙂 ) vamos a aprovechar que existe un filtro específico para cada uno de los formularios. Para ello basta con saber el ID del formulario en cuestión:
Ya sólo falta construir el nombre del filtro utilizando ese número como gform_notification_ID. Por ejemplo, en la imagen de arriba las notificaciones para el formulario de contacto las filtraremos mediante el hook gform_notification_1. Fácil, ¿verdad?
Seleccionando la notificación correcta
Ya sabes que en Gravity Forms puedes añadir a un formulario tantas notificaciones como quieras (Ajustes > Notificaciones). Hasta la versión 1.7 de Gravity Forms se distinguía entre notificaciones al usuario y notificaciones al administrador. Incluso había un filtro específico para adjuntar archivos al email de notificación del administrador, gform_admin_notification_attachments, y otro para las notificaciones al usuario, gform_user_notification_attachments. Pero ya no.
Ahora todas las notificaciones son tratadas por igual, y como se pueden crear tantas como sea necesario para un mismo formulario tendremos que distinguir a cuál (o cuáles) de ellas queremos adjuntar nuestros archivos.
Podemos hacer eso fácilmente utilizando o bien el nombre de la notificación (lo que puedes ver en la imagen de arriba) o bien su asunto, basta añadir a nuestra función un condicional que compruebe la propiedad correspondiente del objeto notificación:
if ($notificacion['name'] == 'Nombre de la notificación')
o bien:
if ($notificacion['subject'] == 'Asunto de la notificación')
Será dentro de ese condicional donde le diremos a Gravity Forms dónde tiene que buscar los archivos que debe adjuntar a esa notificación, y los añadiremos a la lista de adjuntos que debe llevar el email. De esta forma podemos adjuntar archivos distintos a diferentes notificaciones del mismo formulario.
¿Estás construyendo tu tienda online o eres implementador WordPress?
¿Necesitas plugins de calidad y con soporte para implementar funcionalidades concretas?
Consigue todos los plugins a la venta en la sección de plugins de esta web y todos los que siga añadiendo. Acceso a los 96 plugins (y subiendo) con soporte directo del desarrollador, actualizaciones y uso ilimitado: úsalos en tantas webs como lo necesites.
Adjuntando los archivos a los emails de notificación
Ya hemos establecido qué filtro tenemos que utilizar y cómo seleccionar la notificación a la que queremos adjuntar los archivos, así que ahora sólo queda adjuntar los archivos a ese correo electrónico.
Y la cosa es bastante sencilla, ya que el objeto notificación tiene también una propiedad donde almacena las URLs de los adjuntos a la notificación, el array attachments, con lo que basta añadir elementos a ese array.
Puedes utilizar para ello array_push, si son elementos sueltos, o array_merge en caso de que hayas metido la lista de adjuntos en otro array. Vas a verlo muy claro con un ejemplo:
$upload = wp_upload_dir();
$upload_path = $upload['basedir'];
$adjunto1 = $upload_path.'/2017/06/Pachelbel-Canon-in-D-Major.mp3';
$adjunto2 = $upload_path.'/2017/06/Handel-Entrance-of-the-Queen-of-Sheba.mp3';
$notificacion['attachments'] = (is_array (rgget ('attachments', $notificacion))) ? rgget ('attachments', $notificacion) : array();
array_push ($notificacion['attachments'], $adjunto1, $adjunto2);
Con rgget (función específica de Gravity Forms) nos aseguramos de si el formulario ya tenía adjuntos (más adelante vemos cómo y por qué) para crear o no el array vacío.
Diferentes archivos en función del email destinatario de la notificación
Como puedes ver, ahí puedes añadir todo el PHP que haga falta en función de lo que necesites implementar. Por ejemplo, puedes utilizar diferentes adjuntos dependiendo del email del usuario, que puedes obtener del campo correspondiente que el usuario ha rellenado (es decir, está en el objeto entrada) mediante la función de Gravity Forms rgar:
$email_usuario = rgar ($entrada, '1');
donde 1 es el ID del campo que contiene el email. Después sólo tienes que usar strcmp o strpos para discriminar. Por ejemplo:
if (strpos ($email_usuario, 'gmail.com'))
$adjunto = $adjunto_usuarios_gmail;
else if (strpos ($email_usuario, 'hotmail.com'))
$adjunto = $adjunto_usuarios_hotmail;
Como ves las posibilidades son enormes, ya que puedes discriminar por el contenido de cualquiera de los campos de la entrada.
Lo ponemos todo junto, mezclamos o agitamos, y…
Ya tienes todo lo que necesitas saber, sólo te falta juntarlo todo y añadirle tu toque personal (adaptarlo a la función que necesites). Para los menos duchos en PHP, aquí el código completo que saldría de los ejemplos que he ido poniendo:
add_filter ('gform_notification_1', function ($notificacion, $formulario, $entrada) { //El nombre del filtro incluye el número de formulario
if ($notificacion['name'] == 'Notificación de usuario') {
$upload = wp_upload_dir();
$upload_path = $upload['basedir'];
$email_usuario = rgar ($entrada, '1');
if (strpos ($email_usuario, 'gmail.com') || strpos ($email_usuario, 'hotmail.com'))
$adjunto = $upload_path.'/2017/06/Pachelbel-Canon-in-D-Major.mp3';
else
$adjunto = $upload_path.'/2017/06/Handel-Entrance-of-the-Queen-of-Sheba.mp3';
$notificacion['attachments'] = (is_array (rgget ('attachments', $notificacion))) ? rgget ('attachments', $notificacion) : array();
array_push ($notificacion['attachments'], $adjunto);
}
return $notificacion;
}, 10, 3);
Y listo. De esta forma cuando un usuario rellene nuestro formulario con ID 1, la notificación configurada como Notificación de usuario llevará adjunto el Canon de Pachelbel si el usuario ha introducido en el campo del formulario con ID 1 una dirección de Gmail o de Hotmail, y la Entrada de la reina de Saba de Händel para el resto de usuarios. Que las disfruten.
Dónde narices pongo ese código y cómo lo personalizo para que haga lo que yo quiero que haga
Respuestas sinceras a preguntas directas. Lo puedes poner en varios sitios, unos más recomendables que otros: desde el archivo functions.php, hasta en un mu-plugin, pasando por un plugin de funcionalidades propio que tengas. Si todo esto se suena un poco a taiwanés puedes echar un vistazo a estas entradas:
En cuanto a la personalización, no hay atajo: o sabes PHP, o aprendes PHP… o me contactas y yo te programo lo que necesites. 🙂 Me tienes a tu disposición a través del formulario de contacto, que no te hará llegar música barroca pero sí puedo prometerte una respuesta rápida. 🙂
Añadir como adjuntos los ficheros subidos al formulario
Todo este tocho de aquí arriba trataba de cómo adjuntar a las notificaciones por email de Gravity Forms archivos estáticos, que ya tenemos en el servidor. Pero, ¿y si queremos adjuntar los archivos que se han subido a través del formulario?
Bueno, pues entonces te puedes ahorrar el trabajo de programar, porque ya lo ha hecho alguien y está disponible en en plugin gratuito en el repositorio de WordPress: Gravity Forms – Uploads as Attachments.
Es un plugin muy sencillo pero muy eficiente: basta con instalarlo y activarlo y te añade una opción en los ajustes de notificaciones para hacer precisamente eso: adjuntar a la notificación los archivos subidos mediante el formulario.
Como ves, te permite además eliminar esos archivos del servidor una vez enviados. Es algo arriesgado, sí (si el email «se pierde», adiós a los archivos) pero te permitiría ahorrar espacio en el servidor en caso de recibir muchos archivos a través de formulario, adjuntándolos a una notificación enviada a una cuenta de Gmail tuya, por ejemplo.
En este vídeo puedes ver lo sencillo que es:
ismael dice
Probado, excelente