wp_redirect no funciona después de enviar un formulario

22 dic 2012, 19:28:32
Vistas: 19.2K
Votos: 8

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í.
5
Comentarios

Es difícil adivinar algo con esta información, ¿has intentado depurarlo para obtener más detalles? El plugin Better HTTP Redirects es una buena herramienta para investigar problemas de redirección.

Rarst Rarst
22 dic 2012 19:32:09

Por favor, publica este código en contexto.

s_ha_dum s_ha_dum
22 dic 2012 19:33:47

@s_ha_dum He actualizado mi pregunta para incluir un pastebin

Anagio Anagio
22 dic 2012 19:38:08

@Rarst He actualizado la pregunta con un pastebin de todo el código

Anagio Anagio
22 dic 2012 19:38:24

@Rarst He instalado el plugin, por favor mira mi publicación actualizada, muestra un 302 y enlaza al nuevo post pero no se actualiza allí

Anagio Anagio
22 dic 2012 19:44:55
Todas las respuestas a la pregunta 2
5
15

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.

22 dic 2012 19:53:07
Comentarios

@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?

Anagio Anagio
22 dic 2012 19:55:46

@Anagio - agregué un ejemplo

Milo Milo
22 dic 2012 21:53:52

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?

Anagio Anagio
23 dic 2012 09:36:29

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.

Milo Milo
23 dic 2012 19:54:48

@Milo lo solucionaste perfectamente para mí. "headers already sent" era el problema en mi caso. Gracias

henrywright henrywright
24 sept 2013 18:38:34
4

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.

22 dic 2012 20:20:14
Comentarios

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.

Anagio Anagio
22 dic 2012 20:22:35

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.

s_ha_dum s_ha_dum
22 dic 2012 20:25:03

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.

Anagio Anagio
22 dic 2012 20:31:41

@s_ha_dum esa sugerencia es un diamante en pocas palabras. :) Lo explicó todo. Probé muchas formas - todas esas cosas con wp_loaded, template_redirect, pero no logré que funcionara. Muchas gracias.

Mayeenul Islam Mayeenul Islam
27 abr 2015 08:44:10