También estoy en: Ver el perfil de Jon González Garrido en LinkedIn

Contact Form 7 de Worpress con destinatarios dinámicos

Valora este artículo
(0 votos)
En este artículo trataré de explicar de manera simple como hacer modificaciones dinámicas de los destinatarios del formulario de contacto "Contact form 7" de Wordpress. Se trata del plugin mas conocido para la creación de formularios de contactos así que seguro que lo conoces, ¿nos ponemos con ello?

¿Necesitas modificar los destinatarios de Contact Form 7 y en el código fuente de manera dinámica y  no sabes como? ¿Necesitas modificar el texto del email? ¿Y poner un asunto diferente dependiendo del destinatario? Con este artículo serás capaz de hacerlo y entenderlo.

En mi problema se me presentaba la necesidad de en una página de venta de polígonos añadir un formulario de contacto en cada ficha de polígono cuyo destinatario fuera el responsable del polígono en cuestión.

Como el número de polígonos es grande y dinámico realizar un formulario base e ir clonándolo mediante el gestor de administración no era una opción "agradable" ni posible. Por ello, y tras mirar en varios sitios ví que la solución era crear un plugin que se encargaría de capturar el momento de ejecución en el que se va a enviar el email y modifique los datos de envio.

Aunque lo primero que encontré fue un plugin que prometía hacerlo pero que no consiguió su objetivo (quizás algo hice mal pero creo que no)

A continuación encontré el siguiente artículo que fue mi primer punto de entrada y fue con lo que empecé pero se trataba de un artículo del 2012 con lo que era muy probable que Contact Form 7 ya no fuera igual como así resultó.

Comencé por tanto la creación de mi plugin creando una nueva carpeta en el directorio plugins y añadiendo las cabeceras adecuadas que identifican a los plugins. ¿Quereis saber que cabeceras son? Mirad en la documentación oficial en la sección Información Estándar del Plugin.

A continuación ví que el hook o accción que tenía que llamar tal y como ponía en el artículo era wpcf7_before_send_mail. Para poder entender cuando se ejecuta la acción y que tengo disponible en ese momento me puse a mirar el código fuente de Contact Form 7 y ví las siguientes líneas:

private function mail() {
		$contact_form = $this->contact_form;                                
		do_action( 'wpcf7_before_send_mail', $contact_form );

		$skip_mail = $this->skip_mail || ! empty( $contact_form->skip_mail );
		$skip_mail = apply_filters( 'wpcf7_skip_mail', $skip_mail, $contact_form );

		if ( $skip_mail ) {
			return true;
		}

		$result = WPCF7_Mail::send( $contact_form->prop( 'mail' ), 'mail' );

 

 

Como se puede ver en el hook se nos facilita el objeto $contact_form que es el objeto en el que se encuentra el contenido del email (destinatarios, mensaje etc).

Por tanto en nuestro plugin crearíamos lo siguiente:

 

function wp_contact_form_changes ($WPCF7_ContactForm) {
            
    return $WPCF7_ContactForm;
    
    
}
add_action("wpcf7_before_send_mail", "wp_contact_form_changes", 10, 1);

 A continuación me dispuse a mirar que métodos tenía para poder modificar el objeto $contact_form pero ví que no hacía caso a lo que modificaba con lo que había que "atacarlo" de alguna otra forma.

En las primeras líneas del fichero submission.php de Contact Form 7 ví que se instanciaba un objeto de WPCF7_ContactForm con una función estática así que realmente con ella podría acceder al mismo objeto que me viene como parámetro en el hook, no es suficiente. Pero sin embargo también ví que el objeto $contact_form era un objeto cuya clase era WPCF7_ContactForm definida en el fichero contact-form.php.

Mirando el contact-form.php ví que existía una función estática que me permitía acceder al objeto contact-form actual llamada get_current que obtenía el objeto estatico actual.

Por tanto continué mi búsqueda mirando donde se guardaba el destinatario. Ví que existía un método llamado get_properties que me devolvía un array con las distintas propiedades (destinatarios, asunto, mensaje, etc) y otro método que permitía pasarle el array de propiedades con las modificaciones que haya realizado para que las actualice en el objeto.

class WPCF7_ContactForm {

	private static $current = null;
	private $properties = array();

	public static function get_current() {
		return self::$current;
	}

 

Con eso ya el resto era jugar con dicho array de propiedades y modificar según las necesidades los diferentes parámetros.

Os dejo el plugin que también podríais tenerlo simplemente en el functions.php aunque os recomiendo tenerlo como plugin para poder activar y desactivarlo a vuestro antojo:

function wp_contact_form_changes ($WPCF7_ContactForm) {
    //Obtención del objeto actual
    $cf = WPCF7_ContactForm::get_current();
    //Obtención de propiedades.
    $propiedades = $cf->get_properties();
    //Modificación de destinatario
    $propiedades["mail"]["recipient"] = 'EMAIL';
    //Modificación del asunto
    $propiedades["mail"]["subject"] = 'Nuevo asunto';
    //Modificación del mensaje
    $propiedades["mail"]["body"] = 'Nuevo mensaje';
    //Establecer las propiedades en el objeto.
    $cf->set_properties($propiedades);
    //Devolver por constumbre el parámetro que se ha obtenido
    return $WPCF7_ContactForm;        
}
add_action("wpcf7_before_send_mail", "wp_contact_form_changes", 10, 1);

 

También os paso un enlace al plugin en gitHub por si os resulta mas cómodo:

Plugin en github

 Solo me queda agradecer a los creadores del plugin por dejarlo sencillo aunque también darles un pequeño tirón de orejas por no documentar los métodos en un plugin como este.

¿Os ha ayudado el artículo? ¿Alguna duda? Quedo a vuestra disposición en los comentarios

Visto 1607 veces

Deja un comentario

Asegúrate de llenar la información requerida marcada con (*). No está permitido el código HTML. Tu dirección de correo NO será publicada.

Contacto

La mejor manera de contactar conmigo es el formulario de contacto de esta página, aquí.

Acerca de mi

Soy un Ingeniero superior que ha obtenido la ingeniería técnica mediante la UPV/EHU y la superior mediante la UNED.

Mi carrera laboral se ha desarrollado sobre varias tecnologías, en especial PHP, MySQL y Apache.