¿Cómo manejar el envío de formularios?

4 ago 2012, 00:56:23
Vistas: 54.5K
Votos: 17

Soy nuevo en WordPress y por lo tanto estoy enfrentando algunos problemas.

El escenario de uso es el siguiente:

  1. Se muestra al usuario un formulario de solicitud para iniciar un club en su escuela.
  2. El usuario completa el formulario y presiona el botón 'Enviar'.
  3. El formulario necesita ser validado.
  4. Si la validación es exitosa, entonces los datos se almacenan en la tabla personalizada club_details en la base de datos y se muestra un mensaje al usuario (ej: Gracias por su envío. Su solicitud ha sido enviada al administrador para su aprobación.) de lo contrario se muestran los mensajes de error apropiados al usuario.
  5. El administrador va al panel de administración de WordPress para aprobar las solicitudes pendientes del club. (Los datos se obtienen de la base de datos y se muestran al administrador).

He realizado lo siguiente:

  • para 1) He creado un formulario/página de solicitud usando el editor HTML de WordPress.
  • para 3) Tengo un archivo JavaScript (validation.js) que contiene el código de validación.
  • para 4) Tengo un archivo PHP (club-functions.php) que tiene una función storeInDB() para almacenar los detalles de la solicitud en una tabla personalizada en la base de datos.
  • para 5) He creado mi propia carpeta de plugin y agregado un archivo PHP (club.php) que muestra los detalles de la solicitud al administrador en el panel de administración de WordPress.

Estoy atascado en el siguiente punto: Cómo manejar el envío del formulario. ¿Dónde debería colocar el código que llama a la función de validación de JavaScript y posteriormente llama a la función storeInDB()?

Por favor, proporciónenme algunas sugerencias sobre cómo lograr esto y si este enfoque es bueno. Muchas gracias de antemano.

0
Todas las respuestas a la pregunta 2
9
16

Debes usar la función wp_ajax o wp_ajax_nopriv.

Primero que nada, debes colocar la URL de admin-ajax como valor del atributo action en el formulario de envío.

<form id="" action="<?php echo admin_url('admin-ajax.php'); ?>" method="post" class="form" >

De esta manera, el formulario se enviará a admin-ajax.php por defecto (sin JavaScript). Puedes usar JavaScript para hacer que funcione mediante AJAX.

Lo siguiente es la función que utilizará los datos enviados. Dentro del formulario, coloca un wp_nonce_field y un campo oculto con el nombre action. Mi valor para action es add_transfer.

<?php wp_nonce_field('add_transfer','security-code-here'); ?>
<input name="action" value="add_transfer" type="hidden">

Puedes colocar la función que manejará este formulario en el archivo functions.php o en tu archivo de plugin. Puedes usar wp_ajax_ + el nombre de la acción si este es un formulario solo para usuarios logueados. Para usuarios no logueados, usa wp_ajax_nopriv + el nombre de la acción en su lugar.

add_action('wp_ajax_add_transfer', 'process_add_transfer');

function process_add_transfer() {
    if ( empty($_POST) || !wp_verify_nonce($_POST['security-code-here'],'add_transfer') ) {
        echo 'Apuntaste a la función correcta, pero lo siento, tu nonce no se verificó.';
        die();
    } else {
        // realiza tu función aquí 
        wp_redirect($redirect_url_for_non_ajax_request);
    }
}
4 ago 2012 02:39:00
Comentarios

Gracias ifdion por la respuesta. Estoy creando el formulario en el 'Editor HTML de Wordpress'. Entonces, ¿es bueno incluir código php en el formulario ya que tendré que instalar el plugin 'Exec-PHP' que creo que es excesivo? Por favor, comparte tus pensamientos.

Pooja Pooja
4 ago 2012 17:00:39

Solo reemplaza el valor de action con http://your-site-url.com/wp-admin/admin-ajax.php.

ifdion ifdion
5 ago 2012 00:36:46

¿Funciona eso?

ifdion ifdion
9 ago 2012 00:55:33

¿hay una buena manera de lograr lo mismo pero sin admin-ajax.php?

Tahir Yasin Tahir Yasin
19 feb 2014 12:17:40

Me doy cuenta de que esta es una respuesta antigua, pero esto no funcionará ya que wp_redirect no hará nada aquí; las solicitudes AJAX se ejecutan en segundo plano y wp_redirect es solo un envoltorio inteligente para una llamada header('location:...') que necesita ejecutarse antes de cualquier salida. Si deseas una redirección después de una llamada AJAX, necesitas devolver una URL y manejar la redirección mediante JS. Como referencia: http://wordpress.stackexchange.com/a/133939/17826

indextwo indextwo
9 sept 2015 15:27:45

@indextwo gracias por el comentario. Tienes razón, necesitas pasar una URL adecuada y luego redirigir mediante JS para una solicitud AJAX. El wp_redirect tampoco será útil en una solicitud AJAX. Pero mi respuesta no utiliza ningún JS, por lo tanto no es una solicitud AJAX, aunque utiliza las funciones wp_ajax y wp_ajax_nopriv. El wp_redirect se usa para enviar al usuario lejos de la página en blanco de wp-admin/admin-ajax.php. Espero que esto aclare las cosas.

ifdion ifdion
10 sept 2015 19:18:13

'admin-ajax.php' → ¿Dónde se encuentra este archivo? Quiero decir, ¿en qué carpeta?

WordCent WordCent
26 feb 2019 12:06:27

@TheWPNovice Supongo que todavía está en el directorio /wp-admin/. Ten en cuenta que no necesitas cambiar ni agregar nada en ese archivo.

ifdion ifdion
27 feb 2019 08:59:31

¿Este sistema también puede funcionar en un formulario que intenta enviar correos electrónicos?

WordCent WordCent
27 feb 2019 19:06:00
Mostrar los 4 comentarios restantes
2

Primero, déjame decirte que la validación de JavaScript funciona en el lado del cliente. Así que si el usuario desactiva JS, vas a tener problemas.

Por lo tanto, también deberías validar los valores de entrada en el servidor.

Con eso en mente:

El código JS se puede llamar directamente desde la página donde está el formulario. El atributo onsubmit es la forma habitual de llamarlo.

ejemplo

<form onSubmit="validateForms()" method="post" action="domain.com/club-contacts">
    <label for="app_email">Aplicación</label>
    <input type="text" name="app_email" id="app_email" value="" />
    <input type="hidden" name="app_application" value="1" />
    <input type="submit" name="app_form_send" value="Enviar" />
</form>

page.php

Este también puede ser tu página de plantilla personalizada o single.php. En este caso, 99 es el ID de la página específica que deseas indicar al usuario si fue aprobada o tuvo un error.

if ( get_the_ID() == '99' ) {
  // validemos la entrada
  if( !empty($_POST['app_application']) && $_POST['app_application'] == "1"  ) {
   if(!empty($_POST['app_email'])) {
    // revisa el codex para [Data_Validation][1]
    }
  }
}
4 ago 2012 01:38:09
Comentarios

Gracias peteroak por la respuesta. ¿Dónde puedo llamar código PHP para procesar más los datos del formulario?

Pooja Pooja
4 ago 2012 17:02:00

El atributo action apuntará a un archivo. En ese archivo puedes filtrar y validar tu formulario. Actualizaré mi respuesta para incluir eso.

pcarvalho pcarvalho
4 ago 2012 22:37:11