¿Cómo manejar el envío de formularios?
Soy nuevo en WordPress y por lo tanto estoy enfrentando algunos problemas.
El escenario de uso es el siguiente:
- Se muestra al usuario un formulario de solicitud para iniciar un club en su escuela.
- El usuario completa el formulario y presiona el botón 'Enviar'.
- El formulario necesita ser validado.
- 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. - 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ónstoreInDB()
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.

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);
}
}

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.

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

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 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.

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

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

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]
}
}
}

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