Soporte » Plugins y Hacks » Añadir codigo aleatorio en formulario de contact form7

  • Resuelto fran

    (@circunovo)


    Hola a tod@s!!
    Estoi creando un formulario con contact form7 y necesito que una de las casillas genere un numero/letras de forma aleatoria, cada vez que se carge la pagina del formulario, y que ese numero se incluya en el envio del formulario.
    Jot form tiene un widget para hacer eso: https://www.jotform.com/es/widgets/random-value-generator
    Esta funcion es la que busco en CF7.

    Buscando algo asi para incluir en el formulario, encontre esta publicación:
    https://www.banna360.com/contact-from7-dynamic-number-generation/
    donde teoricamente puedo hacer eso añadiendo un codigo en el «fuctions.php» de mi tema. He editado el «fuctions.php» (haciendo una copia del php antes de editarlo) de mi tema hijo «ChildGeneratePress» y … rompe el sitio, la famosa pantalla en blanco…
    No se si estoi pegando mal el codigo, aunque he probado a pegarlo antes, dentro, despues del codigo que ya tiene el php que edito….y no hay forma, siempre rompe WP.
    He probado el plugin para CF7: Contact Form 7 – Submission id, pero no me sirve.
    Numera los emails, en vez de crear un codigo aleatorio.

    Alguna idea de como poder añadir/crear un campo que genere un codigo y lo incluya en el envio?
    Gracias. Un saludo!!

    • Este debate fue modificado hace 4 meses por fran.
Viendo 7 respuestas - de la 1 a la 7 (de un total de 7)
  • Moderador Jose Luis

    (@jose64)

    Hola @circunovo

    El código tiene errores de sintaxis, suele suceder cuando copias y pegas el código directamente, sin las etiquetas correspondientes, se interpreta y se pueden modificar algunos caracteres. El código sin errores lo puedes ver aquí:

    function wpcf7_generate_rand_number( $wpcf7_data ) {
        $properties = $wpcf7_data->get_properties();
        $shortcode = '[rand-generator]';
        $mail = $properties['mail']['body'];
        $mail_2 = $properties['mail_2']['body'];
    
        $subject = $properties['mail']['subject'];
        $subject2 = $properties['mail_2']['subject'];
    
        if( preg_match( "/{$shortcode}/", $mail ) || preg_match( "/[{$shortcode}]/", $mail_2 ) ) {
            $option = 'wpcf7sg_' . $wpcf7_data->id();
            $sequence_number = (int)get_option( $option ) + 1;
            update_option( $option, $sequence_number );
            $properties['mail']['body'] = str_replace( $shortcode, $sequence_number, $mail );
            $properties['mail_2']['body'] = str_replace( $shortcode, $sequence_number, $mail_2 );
            $properties['mail']['subject'] = str_replace( $shortcode, $sequence_number, $subject );
            $properties['mail_2']['subject'] = str_replace( $shortcode, $sequence_number, $subject2 );
    
            $wpcf7_data->set_properties( $properties );
        }
    }
    add_action( 'wpcf7_before_send_mail', 'wpcf7_generate_rand_number' );
    Iniciador del debate fran

    (@circunovo)

    Hola Jose luis!!
    Gracias por la rapida respuesta/ayuda.
    He colocado el nuevo codigo en el «fuctions.php» de mi tema hijo de esta forma

    <?php
    //rand-generator
    function wpcf7_generate_rand_number( $wpcf7_data ) {
        $properties = $wpcf7_data->get_properties();
        $shortcode = '[rand-generator]';
        $mail = $properties['mail']['body'];
        $mail_2 = $properties['mail_2']['body'];
    
        $subject = $properties['mail']['subject'];
        $subject2 = $properties['mail_2']['subject'];
    
        if( preg_match( "/{$shortcode}/", $mail ) || preg_match( "/[{$shortcode}]/", $mail_2 ) ) {
            $option = 'wpcf7sg_' . $wpcf7_data->id();
            $sequence_number = (int)get_option( $option ) + 1;
            update_option( $option, $sequence_number );
            $properties['mail']['body'] = str_replace( $shortcode, $sequence_number, $mail );
            $properties['mail_2']['body'] = str_replace( $shortcode, $sequence_number, $mail_2 );
            $properties['mail']['subject'] = str_replace( $shortcode, $sequence_number, $subject );
            $properties['mail_2']['subject'] = str_replace( $shortcode, $sequence_number, $subject2 );
    
            $wpcf7_data->set_properties( $properties );
        }
    }
    add_action( 'wpcf7_before_send_mail', 'wpcf7_generate_rand_number' );
    
    //rand-generator the end
    
    // Exit if accessed directly
    if ( !defined( 'ABSPATH' ) ) exit;
    
    // BEGIN ENQUEUE PARENT ACTION
    // AUTO GENERATED - Do not modify or remove comment markers above or below:
    
    if ( !function_exists( 'chld_thm_cfg_locale_css' ) ):
        function chld_thm_cfg_locale_css( $uri ){
            if ( empty( $uri ) && is_rtl() && file_exists( get_template_directory() . '/rtl.css' ) )
                $uri = get_template_directory_uri() . '/rtl.css';
            return $uri;
        }
    endif;
    add_filter( 'locale_stylesheet_uri', 'chld_thm_cfg_locale_css' );
    
    // END ENQUEUE PARENT ACTION
    

    por lo menos no rompe WP, asi que algo ya se ha conseguido ;).
    Sin embargo al meter en el formulario el label: <label> Tu codigo
    [rand-generator] </label> , no muestra el num en el formulario.
    Si lo envia, pero no genera un numero aleatorio, sino que numera de forma consecutiva el email enviado…01, 02, 03…y eso no es lo que busco.
    Por lo que he leido, y entiendo de esto (poco muy poco ;), en el enlace de stackoverflow, comentan que los numeros que genera son consecutivos no aleatorios…igual no es la opción que necesito 🙁

    Gracias por tu tiempo!! Un saludo!.

    Iniciador del debate fran

    (@circunovo)

    Buenas!
    Tras descartar esta opción…creo que no se ajusta a lo que busco, he retomado otra opcion que tenia y que casi, casi hace lo que busco.
    Quedaria algo asi Num. aleatorio al cargar la pagina

    Sigo sin conseguir incluirlo dentro del envio del formulario…pero he solucionado colocando un campo de texto donde el usuario puede pegarlo para que se incluya en el envio.
    Me gustaria que el codigo aleatorio generado incluyese alguna letra, pero tampoco he encontrado la forma de hacerlo…

    A grandes rasgos:
    1º- he creado un archivo .js con este codigo:

    function xrep_checked() {
      if (document.getElementById('xrep').checked) {
    	return 1;
      } else {
    	return 0;
      }
    }
    
    function gen_na1() {
        var min = document.getElementById("xdesde2").value;
        var max = document.getElementById("xhasta2").value;
        var vec = document.getElementById("xveces2").value;
        var rep = xrep_checked();
        var dv = document.getElementById('id_generador');
        var s = document.createElement("script");
        s.src = 'https://numero.wiki/generadores/servicio-json/?desde='+min+'&hasta='+max+'&numero='+vec+'&repeticion='+rep+'&json=0';
        s.type = "text/javascript";
        dv.appendChild(s);
        try {
            setTimeout('document.getElementById("g1br").innerHTML=na_respuesta.join(", ")', 1000);
        } catch(err) {
            document.getElementById("g1br").innerHTML='Falta de servicio';
        }
    }
    
    gen_na1();

    lo he renombrado como «codigo_inscripcion.js» y lo he subido a mi servidor a la carpeta «public»
    2º- en el apartado de edición del formulario de CF7 he añadido este codigo:

    <label> Tu codigo:
    <div hidden="hidden" id="id_generador" style="margin:2em 0">
    <label hidden for="xdesde2">Generador de</label>:
    <input type="text" name="desde" value="0" id="xdesde2" style="width:150px"/>
    <label hidden for="xhasta2">a</label>:
    <input type="text" name="hasta" value="100000000" id="xhasta2" style="width:150px" />
    <label hidden for="xveces2">número de repeticiones</label>:
    <input type="text" name="veces" value="1" id="xveces2" style="width:150px" />
    <label hidden for="xrep">sin repetición</label>:
    <input hidden type="checkbox" name="rep" id="xrep" checked="checked" />
    <br/><br/>
    </div>
    <div id="g1br" style="font-weight:bold; font-size: 1.5em"></div>
    
    <script src="/codigo_inscripcion.js"></script>
    [text* text-codigo placeholder "Copia y pega aqui tu codigo"]</label>

    Con esta opción me apaño, pero…alguna idea de como generar numeros+letras? lo de incluirlo directamente (por las busquedas que he hecho en la web) creo que es bastante más complicado de lo que creia en un principio…asi que me vale tal cual esta ahora.
    Un saludo!

    • Esta respuesta fue modificada hace 4 meses por fran.
    Moderador Jose Luis

    (@jose64)

    Por aquí te dejo otra opción que creo que te lo resuelve, este código para generar el código:

    add_action('wpcf7_init', 'custom_code_generator');
    function custom_code_generator(){
        wpcf7_add_form_tag('coupon_code', 'custom_code_handler');
    }
    
    function custom_code_handler($tag){
        $input_code_name = 'codigo';
        $charsList = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $randomString = '';
    	$lastchar = strlen($charsList) - 1;
     
        //change the value of i to meet your requirements
    
        for ($i=0; $i < 10; $i++){
    		$indice = rand(0, $lastchar);
            $randomString .= $charsList[$indice];
        }
     
        //create html and return
     
        $html = '<input type="text" readonly name="'. $input_code_name .'" value="' . $randomString . '" />';
        return $html;
    }

    Para el formulario en Contact Form 7:

    <label> Tu código:  
    [coupon_code] </label>
    
    <label> Tu nombre
        [text* your-name] </label>
    
    <label> Tu correo electrónico
        [email* your-email] </label>
    
    <label> Asunto
        [text* your-subject] </label>
    
    <label> Tu mensaje (opcional)
        [textarea your-message] </label>

    Para el correo:

    De: [your-name] <[your-email]>
    Asunto: [your-subject]
    
    Cuerpo del mensaje:
    [your-message]
    
    Tu código: [codigo] 
    
    -- 
    Este mensaje se ha enviado desde un formulario de contacto en [_site_title] ([_site_url])

    Este código está basado en How to generate dynamic tag and input values for Contact Form 7

    • Esta respuesta fue modificada hace 4 meses por Jose Luis. Razón: Añadir fuente
    Iniciador del debate fran

    (@circunovo)

    Hola!! Jose luis!!!!!!!!
    Ahora SIIIIIII!!!!, ja,ja,ja. Un millon de gracias!!!!
    form.num.aleatorio

    …peeeeroooo (siempre hay un pero por el medio, ja,ja,ja ;)…una vez que mando el email, se reinician todos los campos…excepto el del código, que se queda tal cual. Si se vuelve a rellenar el formulario (sin recargar la pagina), con otros datos, y se envia (en este caso, a veces un usuario pide la inscripcion para varias personas y son formularios independientes)…tenemos dos formularios con datos distintos y el mismo código…lo mas sencillo (para mi) seria poner un texto indicandole al usuario que recarge la pagina para obtener un nuevo codigo, pero si hay otra forma «facilita» de hacer que tambien se reinicie el campo del código aleatorio… 😉

    Muchisimas gracias por tu ayuda!!!
    Un saludo!!

    • Esta respuesta fue modificada hace 4 meses por fran.
    Moderador Jose Luis

    (@jose64)

    Hola Fran.

    Puedes desactivar el JavaScript añadiéndole este código:

    add_filter( 'wpcf7_load_js', '__return_false' );

    O redireccionar a otra página de agradecimiento con un plugin, por ejemplo:

    Redirection for Contact Form 7

    Successful Redirection for Contact Form 7

    Iniciador del debate fran

    (@circunovo)

    Hola Jose Luis!
    Me quedo con la opcion del plugin para redireccionar, con eso cumple mis necesidades y funciona a la perfección.

    Gracias por tu tiempo/ayuda!!

Viendo 7 respuestas - de la 1 a la 7 (de un total de 7)
  • Debes estar registrado para responder a este debate.