Problema de la función Ajax al devolver verdadero y falso en wordpress

5 minutos de lectura

avatar de usuario
Shabán

Estoy validando un formulario con ajax y jquery en el área de texto de comentarios de publicaciones de WordPress para expresiones regulares. Pero hay un problema cuando quiero alertar un mensaje de error con retorno falso. Funciona bien con datos no válidos y muestra una alerta y no se envía. Pero cuando pongo datos válidos, el formulario no se envía. Puede ser un problema con el retorno falso.

Intenté hacer variable y almacenar verdadero y falso y aplicar la condición fuera del bloque de éxito de ajax, pero no funcionó para mí.

Funciona bien cuando lo hago con core php, ajax, jquery pero no funciona en WordPress.

Aquí está mi código ajax, jquery.

require 'nmp_process.php';

add_action('wp_ajax_nmp_process_ajax', 'nmp_process_func');
add_action('wp_ajax_nopriv_nmp_process_ajax', 'nmp_process_func');

add_action('wp_head', 'no_markup');
function no_markup() {
    ?>    
<script type="text/javascript">
        jQuery(document).ready(function () {
            jQuery('form').submit(function (e) {
                var comment = jQuery('#comment').val();
                jQuery.ajax({
                    method: "POST",
                    url: '<?php echo admin_url('admin-ajax.php'); ?>',
                    data: 'action=nmp_process_ajax&comment=" + comment,
                    success: function (res) {
                        count = res;
                        if (count > 10) {
                            alert("Sorry You Can"t Put Code Here.");
                            return false;
                        }
                    }
                });
                return false;
            });
        });

    </script>
<?php
}

Y estoy usando wordpress wp_ajax hook.

Y aquí está mi código php.

    <?php
function nmp_process_func (){
$comment = $_REQUEST['comment'];
preg_match_all("/(->|;|=|<|>|{|})/", $comment, $matches, PREG_SET_ORDER);
$count = 0;
foreach ($matches as $val) {
    $count++;
}
echo $count;
wp_die();
}
?> 

Gracias por adelantado.

  • el problema es con return false. devolver falso detendrá el envío de su formulario. que yo sepa, desea validar con ajax y, si está validado, desea enviar el formulario. ¿Correcto?

    – Harry Bomrah

    19 de noviembre de 2015 a las 7:27

  • Creo que deberías quitar el segundo. return false;

    – Muhammad Bilal

    19 de noviembre de 2015 a las 7:29

  • Si claro. Y cuando no son datos válidos, no debe enviar el formulario.

    – Shabán

    19 de noviembre de 2015 a las 7:30

  • lo intenté. Funciona bien con datos válidos pero, por otro lado, cuando hay datos no válidos, también se envía con alerta.

    – Shabán

    19 de noviembre de 2015 a las 7:34

  • que tienes en tu $matches ¿formación?

    – madalinivascu

    19 noviembre 2015 a las 8:00

avatar de usuario
Shabán

Finalmente, lo descubrí por mi cuenta.

Sólo hay que poner async: false en llamada ajax. Y ahora está funcionando bien. Además, cree una variable vacía y almacene valores booleanos en ella y luego, después de la llamada ajax, devuelva esa variable.

Aquí está mi código anterior:

    require 'nmp_process.php';

add_action('wp_ajax_nmp_process_ajax', 'nmp_process_func');
add_action('wp_ajax_nopriv_nmp_process_ajax', 'nmp_process_func');

add_action('wp_head', 'no_markup');
function no_markup() {
    ?>    
<script type="text/javascript">
        jQuery(document).ready(function () {
            jQuery('form').submit(function (e) {
                var comment = jQuery('#comment').val();
                jQuery.ajax({
                    method: "POST",
                    url: '<?php echo admin_url('admin-ajax.php'); ?>',
                    data: 'action=nmp_process_ajax&comment=" + comment,
                    success: function (res) {
                        count = res;
                        if (count > 10) {
                            alert("Sorry You Can"t Put Code Here.");
                            return false;
                        }
                    }
                });
                return false;
            });
        });

    </script>
<?php
}

Y el problema que resolví es,

Nuevo código

var returnval = false;
jQuery.ajax({
           method: "POST",
           url: '<?php echo admin_url('admin-ajax.php'); ?>',
           async: false, // Add this
           data: 'action=nmp_process_ajax&comment=" + comment,

por qué lo uso

Async:False mantendrá la ejecución del código de descanso. Una vez que obtenga la respuesta de ajax, solo entonces, se ejecutará el resto del código.

Y luego simplemente almacene Boolean en una variable como esta,

success: function (res) {
                        count = res;
                        if (count > 10) {
                            alert("Sorry You Can"t Put Code Here.");
                            returnval = false;
                        } else {
                            returnval = true;
                        }
                    }
                });
                // Prevent Default Submission Form
                return returnval; });

Eso es todo.

Gracias por las respuestas por cierto.

avatar de usuario
madalinivascu

Intente hacer una llamada ajax con un evento de clic y, si los campos son válidos, envíe el formulario:

jQuery(document).ready(function () {
            jQuery("input[type=submit]").click(function (e) {
                var form = $(this).closest('form');
                e.preventDefault();
                var comment = jQuery('#comment').val();
                jQuery.ajax({
                    method: "POST",
                    url: '<?php echo admin_url('admin-ajax.php'); ?>',
                    data: {'action':'nmp_process_ajax','comment':comment},
                    success: function (res) {
                       var count = parseInt(res);
                        if (count > 10) {
                            alert("Sorry You Can't Put Code Here.");

                        } else {
                              form.submit();
                        }
                    }
                });
            });
        });

nota: ¡usted necesita llamar a esa función en php y devolver solo el conteo!

En lugar de enviar el formulario, vincule el botón Enviar a un evento de clic.

jQuery("input[type=submit]").on("click",function(){
   //ajax call here
   var comment = jQuery('#comment').val();
   jQuery.ajax({
       method: "POST",
       url: '<?php echo admin_url('admin-ajax.php'); ?>',
       data: 'action=nmp_process_ajax&comment=" + comment,
       success: function (res) {
             count = res;
              if (count > 10) {
                  alert("Sorry You Can"t Put Code Here.");
                  return false;
               }else{
                  jQuery("form").submit();
               }
           }
      });
   return false;
})

Además, también es una buena idea ponerle tipo de retorno a su solicitud ajax. Hazme saber si esto funciona.

  • Entonces, incluso si está ingresando datos válidos, ¿no puede enviar el formulario?

    – Harry Bomrah

    19 de noviembre de 2015 a las 7:45

  • el formulario se presenta en ambos casos en datos válidos o no válidos.,. En caso de datos no válidos, aparece una alerta emergente y cuando hago clic en Aceptar, se envía el formulario.

    – Shabán

    19 de noviembre de 2015 a las 7:54


  • ¿Por qué usar un evento de clic en un botón, si simplemente puede escuchar el evento de envío del formulario? ¿Qué sucede si alguien envía el formulario presionando Intro en uno de los campos de entrada?

    – wawa

    19 de noviembre de 2015 a las 8:04

¿Ha sido útil esta solución?