¿Cómo usar nonce con un formulario de envío en el frontend?
Gracias a una variedad de publicaciones aquí, he logrado armar un formulario de envío para el frontend. Después de aproximadamente 24 horas de ajustes, finalmente logré que todo funcione, incluyendo una redirección a una página de 'éxito' después del envío, pero no tengo idea de qué hacer con el nonce.
Aquí está la página del formulario: http://pastebin.com/YWyXL3jY
Y aquí está la página de éxito: http://pastebin.com/3Usu0Pt6
Ambas son plantillas de página personalizadas (sé que el formato está un poco desorganizado en este momento ya que diferentes partes vinieron de diferentes fuentes, y no creo que vaya a usar la función de carga de archivos ya que prefiero usar un plugin para mejor seguridad).
¿El nonce necesita ser procesado antes de que el usuario sea redirigido a la página de éxito? No tengo experiencia en absoluto con nonces y soy un programador PHP de 'copiar y pegar', ¡así que por favor sean amables!
¡Muchísimas gracias por cualquier consejo que puedan dar! :)

Utiliza el siguiente código justo antes de la etiqueta de cierre en tu código front-end.
wp_nonce_field('nombre_de_tu_accion', 'nombre_de_tu_campo_nonce');
El código anterior generará dos campos ocultos dentro de tu etiqueta de formulario. Ahora puedes verificar tu nonce en el backend donde procesarás tu formulario. Usa el siguiente código para verificar el nonce que acabas de crear arriba.
if(wp_verify_nonce($_REQUEST['nombre_de_tu_campo_nonce'], 'nombre_de_tu_accion')){
// El nonce coincide y es válido. Haz lo que necesites ahora.
} else {
// Nonce inválido. Puedes mostrar un error aquí.
}
Una nota importante: observa con cuidado cómo "nombre_de_tu_accion" es el primer argumento de la función 'wp_nonce_field()' y es el segundo argumento de la función 'wp_verify_nonce()'. :) Así que no lo uses como primer argumento en ambas funciones. Mucha gente comete este error, por eso quise mencionarlo.

Para añadir un nonce a un formulario puedes usar la siguiente función:
wp_nonce_field($action, $name, $referer, $echo)
- $action = (opcional) es una cadena que representa el nombre de la acción
- $name = (opcional) es una cadena que representa el nombre del nonce. Si dejas este campo en blanco, WordPress usará por defecto "_wpnonce"
Ejemplo:
Frontend:
<form action="" method="post">
<?php wp_nonce_field('my_delete_action'); ?>
<input type="hidden" name="id" value=" <?php echo $id; ?> " />
<input type="text" name="rec_name" value=" <?php echo $name; ?> " />
<input type="submit" value="Eliminar" />
</form>
Backend:
$retrieved_nonce = $_REQUEST['_wpnonce'];
if (!wp_verify_nonce($retrieved_nonce, 'delete_my_action' ) ) die( 'Falló la verificación de seguridad' );
Fuente: https://www.tipsandtricks-hq.com/introduction-to-wordpress-nonces-5357

Utiliza esto para el nonce y verificación.
wp_nonce_field('test_action', 'submit_post');
Esto generará el campo nonce y puedes verificarlo con el siguiente código.
if(wp_verify_nonce($_REQUEST['test_action'], 'submit_post')){
/// realiza tu trabajo
}else{
/// lanza un error
}

Comenzando con esta página: http://codex.wordpress.org/WordPress_Nonces
Luego, revisando el uso de wp_verify_nonce
y el ejemplo de uso de wp_nonce_field
, debes verificar el resultado de la verificación y decidir qué hacer (normalmente terminar la ejecución con die, pero en tu caso probablemente mostrar un mensaje de fallo con echo
). Probablemente podrías usar la verificación como tu "comprobación de si el formulario fue enviado" en la línea 8:
if ( empty($_POST) || wp_verify_nonce($_POST['name_of_nonce_field'],'name_of_my_action') === false ) {
/* fallo */
} else {
/* éxito, procesamiento, redirección */
}
Asumiendo que la respuesta es exitosa, entonces realizarías tu siguiente acción - como mostrar un mensaje de confirmación o, en tu caso, redirigir la página. Solo asegúrate de hacer la redirección antes de que se imprima cualquier salida.
Algo para considerar también - http://kovshenin.com/2012/nonces-on-the-front-end-is-a-bad-idea/ - aunque en este caso, dado que estás creando contenido, creo que el autor menciona que es "correcto" usar nonces.
