Formulario de contacto 7- Valores de carga de archivos múltiples como enlaces en el correo electrónico

4 minutos de lectura

avatar de usuario
bipedestador

Estoy usando el ‘Formulario de contacto 7 Arrastrar y soltar Carga de archivos – Carga de archivos múltiples’ (https://codecanyon.net/item/contact-form-7-drag-and-drop-files-upload-multiple-files-upload/20683653) complemento dentro de mi formulario. Las cargas pueden ser bastante grandes, por lo que no quiero que se adjunte al correo, sino que tenga enlaces a los archivos cargados en el correo.

Eliminé la etiqueta del campo adjunto del correo y la agregué en el cuerpo del correo, con la esperanza de que genere los enlaces del archivo cargado:

 <p><strong>IMAGES</strong><br/><br/>[dropfiles-291]</a></p>

Pero solo genera los nombres de los archivos separados por un “|”. por ejemplo: ‘nombre de imagen1.jpg|nombre de imagen2.jpg|nombre de imagen3.jpg|nombre de imagen4.jpg’.

Después de buscar un poco, encontré este código dentro del código del complemento de arrastrar y soltar:

add_filter('wpcf7_mail_tag_replaced_dropfiles', array($this, 'wpcf7_mail_tag_replaced'), 100, 3);

function wpcf7_mail_tag_replaced($text, $submitted, $html ){
    $upload_dir   = wp_upload_dir();
    $datas = explode("|",$text);
    $url = $upload_dir["baseurl"]."/cf7-uploads-save/";
    $text_custom = array();

    foreach ($datas as $value) {
        $text_custom[] = $url.$value;
    }
    if($html){
        return implode(" <br>", $text_custom);
    }else{
        return implode(" | ", $text_custom);
    }           

}

No soy un desarrollador de php, pero me parece que el código debe envolver los archivos cargados con un enlace en el correo electrónico. Sin embargo, no funciona. Y después de una extensa investigación en línea, cambié el código a:

add_filter('wpcf7_mail_tag_replaced', array($this, 'wpcf7_mail_tag_replaced_dropfiles'), 100, 3);

function wpcf7_mail_tag_replaced_dropfiles( $text, $submitted, $html ){        

    $upload_dir = wp_upload_dir();
    $datas = explode("|",$text);
    $url = $upload_dir["baseurl"]."/cf7-uploads-save/";
    $text_custom = array();

    foreach ($datas as $value) {
        $text_custom[] = $url.$value;
    }
    if($html){
        return implode(" <br>", $text_custom);}
        else{return implode(" | ", $text_custom);}               

}

El correo electrónico ahora tiene el efecto de enlace deseado, pero en TODOS los campos enviados en el formulario, no solo en el [dropfiles] campos. los [dropfiles] se ve muy bien con el enlace de cada archivo cargado en una nueva línea, etc. Pero, obviamente, no quiero que los campos de texto normal, área de texto, casilla de verificación, radio, etc. también sean enlaces.

Envié un ticket de soporte al desarrollador del complemento, pero aún no he recibido respuesta. ¿Qué enfoque puedo tomar para que esto funcione?

Pasé HORAS solucionando este problema, pero creo que encontré el problema.

Noté que sucedió cuando usé la etiqueta dropfiles como un campo obligatorio. [dropfiles* …]

Contact Form 7 tiene una función “replace_tags_callback” que aplica el filtro “wpcf7_mail_tag_replaced_{$type}”.

El problema es que {$type} se obtiene de $form_tag->type, que en nuestro caso pueden ser tanto “dropfiles” como “dropfiles*”. Si CF7 lo obtuvo usando $form_tag->basetype, sería lo mismo para ambas etiquetas.

Entonces, para solucionar el problema, agregué un filtro para “dropfiles *” en la línea 7 en contact-form-7-drop-files/frontend/index.php

add_filter('wpcf7_mail_tag_replaced_dropfiles*', array($this, 'wpcf7_mail_tag_replaced'), 100, 3);

Así que el comienzo de la clase ahora es así:

function __construct(){
    add_action("wp_enqueue_scripts",array($this,"add_lib"));
    add_filter('wpcf7_form_response_output', array($this,'add_settings'),999999,4);
    add_filter('wpcf7_mail_tag_replaced_dropfiles', array($this, 'wpcf7_mail_tag_replaced'), 100, 3);
    add_filter('wpcf7_mail_tag_replaced_dropfiles*', array($this, 'wpcf7_mail_tag_replaced'), 100, 3);
}
function wpcf7_mail_tag_replaced($text, $submitted, $html ){
    $upload_dir   = wp_upload_dir();
    $datas = explode("|",$text);
    $url = $upload_dir["baseurl"]."/cf7-uploads-save/";
    $text_custom = array();

    foreach ($datas as $value) {
        $text_custom[] = $url.$value;
    }
    if($html){
        return implode(" <br>", $text_custom);
    }else{
        return implode(" | ", $text_custom);
    }



}

Informé el error al autor del complemento y espero que lo actualice en la próxima versión.

Encontré una solución temporal, solo hasta que obtenga una solución permanente del desarrollador del complemento. Cambié el código de la siguiente manera:

add_filter('wpcf7_mail_tag_replaced', array($this, 'wpcf7_mail_tag_replaced_dropfiles'), 100, 3);

function wpcf7_mail_tag_replaced_dropfiles( $text, $submitted, $html ){        
if(preg_match('/\.(jpg|png|jpeg|gif)$/', $submitted))  {
    $upload_dir = wp_upload_dir();
    $datas = explode("|",$text);
    $url = $upload_dir["baseurl"]."/cf7-uploads-save/";
    $text_custom = array();

    foreach ($datas as $value) {
        $text_custom[] = $url.$value;
    }
    if($html){
        return implode(" <br>", $text_custom);}
        else{return implode(" | ", $text_custom);}               
    } 

    return $text; 
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad