wp_redirect no funciona después de enviar un formulario
Estoy usando esta redirección después de insertar un post. No funciona, solo actualiza la página donde está el formulario. Sé que $pid está obteniendo el ID del post, entonces ¿cuál es el problema? Este es el final de mi código PHP para manejar el envío del formulario.
$pid = wp_insert_post($new_post);
update_post_meta($pid,'domain',$domain);
update_post_meta($pid,'keywords',$keywords);
wp_redirect( get_permalink($pid) );
exit();
Aquí hay un pastebin del código completo.
Usando Better HTTP Redirects, la salida es esta, y enlaza la palabra aquí
al nuevo post publicado correctamente.
302 Found
El documento se ha movido aquí.

Solo puedes usar wp_redirect
antes de que se envíe contenido al navegador. Si activas la depuración de PHP, verás un error de "headers already sent" debido a get_header()
en la primera línea.
En lugar de procesar el formulario en la plantilla, puedes enganchar una acción previa, como wp_loaded
, y ahorrar algunas consultas a la base de datos si solo vas a redirigir.
EDITADO, ejemplo:
add_action( 'wp_loaded', 'wpa76991_process_form' );
function wpa76991_process_form(){
if( isset( $_POST['my_form_widget'] ) ):
// procesar formulario, y luego
wp_redirect( get_permalink( $pid ) );
exit();
endif;
}
Usando una acción, puedes mantener el código fuera de tus plantillas y separado de ellas. Combínalo con un shortcode para mostrar el formulario y envuélvelo todo en una clase para guardar estados entre el procesamiento y la salida, y podrás hacerlo todo sin tocar las plantillas del front-end.

@Miloe sí, acabo de ver el mensaje de headers already sent ahora con la depuración activada y el plugin better http redirect encendido. No estoy familiarizado con cómo usar los hooks, ¿puedes indicarme algún tutorial o mostrar algún código de ejemplo por favor?

Gracias, entonces lo que sugieres es poner el formulario en un shortcode y luego usar do_shortcode() dentro de la plantilla para mostrar el formulario. El hook iría en mi functions.php. ¿En qué se convierte la acción del formulario para ejecutar la función/hook?

no tendrías que usar do_shortcode
, mi punto era que podrías agregarlo mediante un shortcode al contenido de una publicación/página, entonces todo tu código de procesamiento y renderizado está separado de la plantilla, de esa manera el formulario podría funcionar en cualquier página donde coloques el shortcode del formulario dentro del contenido. la acción puede simplemente apuntar a la página actual con un #
, o estar vacía, ya que estás enganchando todas las solicitudes para verificar si se envió tu formulario, funcionará desde/a cualquier página.

Mover get_header();
al final de ese código debería solucionar el problema. Tu código se ejecutará antes de que se envíen las cabeceras y la redirección funcionará.
// ...
wp_redirect( get_permalink($pid) );
exit();
//insertar taxonomías
}
get_header(); ?>
Supongo que hay más código en la página debajo de lo que has publicado? Si no es así, no veo la necesidad de get_header()
en absoluto.
El único beneficio que puedo ver al usar un hook como sugiere Milo es que podrías evitar cierta sobrecarga si eliges un hook lo suficientemente temprano. Podrías ahorrar una fracción de segundo en el procesamiento.

Sí, hay algo de HTML, y algunas funciones más de wp como get_sidebars(), y get_footer() etc. No estoy familiarizado en absoluto con el uso de hooks pero realmente me gustaría ver un ejemplo. Ya estoy buscando en Google y veo a gente hablando sobre add_action('wp_loaded', 'your_function')
pero no estoy seguro de cómo usarlo. Cualquier ejemplo es apreciado, gracias.

Esperaré un rato para ver si @Milo publica un ejemplo usando un hook, ya que esa es su respuesta. Si no lo hace, editaré mi respuesta.

Gracias, mover el get_header() debajo del código de manejo del formulario y la redirección funcionó. Aún me gustaría ver cómo usar el hook.
