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

13

Soy nuevo en WordPress y, por lo tanto, enfrento algunos problemas.

El escenario de caso de uso es el siguiente:

  1. A un usuario se le muestra un formulario de solicitud para comenzar un club en su escuela.
  2. El usuario llena el formulario y presiona el botón 'Enviar'.
  3. El formulario debe ser validado.
  4. Si la validación es exitosa, los datos se almacenan en una tabla personalizada club_detailsen db y se muestra al usuario algún mensaje (por ejemplo: Gracias por enviarlo. Su solicitud se envía al administrador para su aprobación). De lo contrario, se muestran los mensajes de error apropiados para el usuario.
  5. El administrador va al panel de administración de Wordpress para aprobar las solicitudes pendientes para el club. (Los datos se obtienen de db y se muestran al administrador).

He hecho 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 tiene 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 aplicación en una tabla personalizada en db.
  • para 5) Creé mi propia carpeta de complementos y agregué un archivo php ( club.php) que muestra los detalles de la aplicación al administrador en el panel de administración de Wordpress.

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

Por favor, dame algunas sugerencias sobre cómo puedo lograr esto y ¿es este enfoque bueno? Muchas gracias por adelantado.

Pooja
fuente

Respuestas:

13

Debe usar wp_ajaxla wp_ajax_noprivfunción o la .

En primer lugar, debe colocar la URL de administrador ajax como el valor del atributo de acción en el formulario de envío.

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

De esa forma, el formulario se enviará a admin-ajax.php de forma predeterminada (sin JavaScript). Puede usar JavaScript para que funcione con AJAX.

Luego está la función que usará los datos enviados. Dentro del formulario, coloque wp_nonce_fielday una entrada oculta con la acción de nombre. Mi valor de acción es add_transfer.

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

Puede poner la función que manejará este formulario en functions.php o en su archivo de complemento. Puede usar wp_ajax_+ el nombre de la acción si este es un formulario solo para usuarios registrados. Para usuarios no registrados, use 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 'You targeted the right function, but sorry, your nonce did not verify.';
    die();
} else {
    // do your function here 
    wp_redirect($redirect_url_for_non_ajax_request);
}
ifdion
fuente
Gracias ifdion por la respuesta. Estoy creando el formulario en 'Editor HTML de Wordpress'. Entonces, ¿es bueno incluir el código php en el formulario ya que tendré que instalar el complemento 'Exec-PHP', que creo que es una exageración? Por favor comparte tus pensamientos.
Pooja
Simplemente reemplace el valor de acción con your-site-url.com/wp-admin/admin-ajax.php .
ifdion
¿Eso funciona?
ifdion
1
¿hay una buena manera de lograr lo mismo pero sin admin-ajax.php?
Tahir Yasin
1
@TheWPNovice Supongo que todavía está en el /wp-admin/directorio. Tenga en cuenta que no necesita cambiar ni agregar nada en ese archivo.
ifdion
2

Primero, déjame decirte que la validación de JavaScript funciona en el lado del cliente. así que si el usuario deshabilita js, tendrá problemas.

por lo tanto, también debe validar los valores de entrada, del lado del servidor.

Con eso en mente:

Se puede llamar al código js 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">Application</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="Send" />
</form>

page.php

Esta también puede ser su página de plantilla personalizada o single.php. en este caso, 99 es la identificación de la página específica que desea indicar al usuario si fue aprobada o tuvo un error.

if ( get_the_ID() == '99' ) {
  // lets validate the input
  if( !empty($_POST['app_application']) && $_POST['app_application'] == "1"  ) {
   if(!empty($_POST['app_email'])) {
    // check the codex for [Data_Validation][1]
    }
  }
}
pcarvalho
fuente
Gracias peteroak por la respuesta. ¿Dónde puedo llamar al código PHP para procesar más los datos del formulario?
Pooja
el atributo de acción apuntará a un archivo. en ese archivo puedes filtrar y validar tu formulario. Actualizaré mi respuesta para incluir eso.
pcarvalho