Formulario personalizado, shortcode y manejador de envío
Tengo un formulario en el frontend con varios campos. Mis requisitos me obligan a usar un shortcode personalizado para crear el formulario. Ya he probado una página con ese shortcode.
Aquí está mi código:
<form name="myform" method="post" action="<?php echo str_replace( '%7E', '~', $_SERVER['REQUEST_URI']); ?>" enctype="multipart/form-data">
Basado en esto, debería abrir la misma página (y lo hizo). Sin embargo, cuando hago clic en enviar, obtengo un error 404 en esa misma URL. ¿Hay alguna solución?
ACTUALIZACIÓN #1
Intento una ruta diferente, usando add_action('init'):
add_action('init', 'mbro1_intercept_form_input');
function mbro1_intercept_form_input()
{
if( !(isset($_POST['action_code']) && $_POST['action_code'] == 'mbro_intercept_form_input') )
return "";
if( isset( $_POST['submit'] ) )
{
//ejecutar mi código aquí
wp_redirect( get_permalink(35) );//página que tiene [shortcode]
}
}
Esto ejecuta correctamente mi acción deseada al enviar. ¡Pero! tras la redirección, sigue apareciendo el error 404. No sé qué está mal.

¿Tu formulario tiene un campo de entrada con el nombre "name"? Por ejemplo:
<input type="text" name="name">
Si es así, eso causará problemas. Cambia el valor del atributo name.
Ver también: El atributo 'name' en formularios rompe y redirige a página 404.

Asumo que la línea cerca del final
wp_redirect( get_permalink(35) );//página que contiene el formulario
es lo que está fallando. Lo cambiaría a esto
$redirect_link = get_permalink(35) ; //página que contiene el formulario
wp_redirect( $redirect_link ); // activar redirección
exit;
eso debería hacer que la función funcione correctamente

¿Cuál es el enlace 404, específicamente? es decir, ¿cuál es la URL de la página a la que intenta redirigir y por lo tanto da error 404?

viene de example.com/?page_id=35 y al enviar, va a example.com/?page_id=35. Después del proceso, debería redirigir a example.com/?page_id=35 para que cuando el usuario actualice, no tenga ningún efecto en el sitio.

Tomo die()
como solución. Aunque no es mi preferida.
$redirect_link = get_permalink(35); //página que contiene el formulario
$script_redirect = "<div>Tu formulario ha sido enviado. Por favor espera un momento. Si tu navegador no redirige, haz clic <a href='$redirect_link'>aquí</a>.</div>
<script type='text/javascript' language='javascript'>
window.location = '$redirect_link';
</script> ";
die($script_redirect);

¿Funciona si agregas el die()
después de tu llamada a wp_redirect()
? Solo llamar al redirect no detiene la ejecución del script. También puedes ver este patrón en el código core: wp_redirect( $somewhere ); exit;
.
