La función wp_redirect() no está funcionando

21 mar 2012, 16:31:50
Vistas: 122K
Votos: 12

wp_redirect($post->guid) no está funcionando. ¿Cómo puedo arreglarlo?

Este es mi código:

if(isset($_REQUEST['vid']) ){

    $id=$_REQUEST['vid'];

    $post_title = 'sasa';

    $post_content ='zxczxczxc';

    $new_post = array(
      'ID' => '',
      'post_author' => $user->ID, 
      'post_content' => $post_content,
      'post_title' => $post_title,
      'post_status' => 'publish',
      // AHORA YA ES UN ARRAY

    );

    $post_id = wp_insert_post($new_post);

    // Esto te redirigirá a la entrada recién creada
    $post = get_post($post_id);
    $url=$post->guid;

    wp_redirect($post->guid);

} 
0
Todas las respuestas a la pregunta 9
6
29

Dos cosas están mal aquí:

  1. No uses $post->guid como una URL
  2. Debes obligatoriamente usar exit() después de wp_redirect() (ver el Codex)

wp_redirect() no termina la ejecución automáticamente y casi siempre debe ir seguido de exit. Para redirigir a la página de tu nueva entrada:

//..... código como en la pregunta
$post_id = wp_insert_post($new_post);
$url = get_permalink( $post_id );
wp_redirect($url);
exit();
21 mar 2012 16:44:52
Comentarios

Te gané por 30 segundos :D

soulseekah soulseekah
21 mar 2012 16:45:19

esto no está funcionando, si ejecuto la página la consola muestra 302 Found 479ms jquery...r=1.7.1 (línea 4) GET http://localhost/wordpress/newpages-17/

200 OK 1.2s cargando..........

SANS780730 SANS780730
21 mar 2012 16:51:56

Eso es un error de JS. No tiene nada que ver con wp_redirect. La respuesta anterior es la forma correcta de hacerlo, así que debes estar haciendo algo más mal.

Stephen Harris Stephen Harris
21 mar 2012 17:00:46

sorry.it solo muestra GET localhost/wordpress/newpages-17 200 OK 1.2s de carga..........

SANS780730 SANS780730
21 mar 2012 17:04:01

@StephenHarris ¿te importaría revisar mi pregunta sobre redirecciones en http://wordpress.stackexchange.com/q/76991/10413? También probé tu código de esta respuesta usando $pid pero aún no logro que funcione. Gracias

Anagio Anagio
22 dic 2012 19:33:49

Esta pregunta recibe un gran número de visitas, así que por favor considera aceptar esta respuesta si resolvió tu problema. De esa manera la pregunta aparecerá como respondida y nos ayuda a mantener el sitio ordenado. Gracias.

Andy Macaulay-Brook Andy Macaulay-Brook
23 jul 2016 18:06:47
Mostrar los 1 comentarios restantes
6
14

Tengo una solución sencilla, por favor lee:

  1. Si estás usando wp_redirect($url) en archivos del tema y no funciona, añade ob_clean() ob_start() en tu archivo de funciones al inicio.

  2. Si lo usas en un plugin, añade ob_clean() ob_start() en el archivo principal del plugin al inicio.

Y asegúrate de haber añadido la función exit() después de wp_redirect($url) Así:

$url = 'http://example.com';
wp_redirect($url);
exit();
10 dic 2015 07:16:25
Comentarios

Esto resuelve el problema con Mozilla Firefox que devolvía 200 en lugar de 302 para que ocurriera la redirección. Chrome redirige mientras que Firefox no. Esta solución ayuda. ¡Gracias!

El'Magnifico El'Magnifico
12 sept 2018 16:36:49

Esta es una respuesta más detallada si estás creando un plugin o diseñando una plantilla. Funcionó para mí.

Sayed Mohd Ali Sayed Mohd Ali
10 jul 2019 11:43:04

He estado teniendo problemas para hacer que esto funcione en mi tema personalizado... Funciona perfectamente...

ShivangiBilora ShivangiBilora
8 oct 2019 13:24:54

Nota, como se mencionó en otra respuesta, que en las plantillas necesitas hacer la verificación de inicio de sesión y la redirección antes de la función 'get_header()', o colocar tu función de verificación de inicio de sesión en el add_filter('init','miverificacionlogin') en tu plantilla. De lo contrario, aparecerá un error de 'headers already sent' que podría no mostrarse en tu registro de errores (dependiendo de la configuración de errores).

Rick Hellewell Rick Hellewell
27 mar 2022 23:46:26

¡Funcionó! Por cortesía hacia otros desarrolladores, asegúrate de llamar a ob_clean una segunda vez. ob_clean();ob_start(); /*código del plugin*/ ob_clean();

wizardzeb wizardzeb
30 jun 2022 04:36:31

Si lo usas en un plugin, agrega ob_clean() ob_start() en el archivo principal del plugin al inicio, este código solo funcionó para mí.

M.Idrish M.Idrish
27 feb 2023 11:24:12
Mostrar los 1 comentarios restantes
3

No estoy seguro si esto ayudará... pero descubrí que tenía algo de código en una plantilla y estaba comenzando con get_header() de esta manera:

<?php
/**
 * .. Comentarios de la plantilla
 */

 get_header();

 if(...) {
    ...
    if(...) {
      ...
      wp_redirect($url);
      exit();
    }
 }
 ?>

y estaba obteniendo el mismo problema de encabezados enviados previamente... Lo que hice fue simplemente mover get_header() al final del bloque y ¡voilá!

<?php
/**
 * .. Comentarios de la plantilla
 */


 if(...) {
    ...
    if(...) {
      ...
      wp_redirect($url);
      exit();
    }
 }
 get_header();
 ?>

No se deshabilitó ningún plugin y todo estuvo bien... puedes intentarlo a ver si te funciona.

1 may 2013 20:53:18
Comentarios

Esta es una buena forma de hacerlo, si tienes acceso al código fuente del tema. Los redireccionamientos deben ejecutarse antes de la llamada a get_header.

s_ha_dum s_ha_dum
1 may 2013 21:28:32

¡Eliminar get_header() también funcionó para mí!

Magico Magico
31 oct 2014 12:01:31

Apuesto a que esta es la causa más común para la mayoría de las personas que tienen problemas con que wp_redirect no funcione

joehanna joehanna
25 feb 2019 07:53:49
2

Nunca uses el valor GUID de la entrada, no tiene que coincidir con la URL real de la entrada.

http://codex.wordpress.org/Changing_The_Site_URL#Important_GUID_Note

wp_redirect( get_permalink( $post_id ) );
exit(); // siempre haz exit

Además, asegúrate de que wp_redirect no esté siendo interceptado por algo más que impida que funcione correctamente. Desactiva todos los plugins y vuelve a Twenty Ten/Eleven para comprobarlo.

21 mar 2012 16:44:21
Comentarios

+1 buen punto sobre que wp_redirect sea conectable

Stephen Harris Stephen Harris
21 mar 2012 16:47:17

gracias....

SANS780730 SANS780730
21 mar 2012 18:49:04
1

Tuve los mismos problemas aquí, Probé varios métodos como

add_action( 'init', 'mi_nombre_de_funcion'); o add_action( 'wp_head', 'mi_nombre_de_funcion'); pero no funcionaban

Finalmente encontré el hook que funciona perfectamente para redireccionar, aquí está mi código completo en functions.php

function redireccionar_pagina_inicio(){
    ob_clean();
    ob_start();
    $args = array(
        'public'   => true,
        '_builtin' => false,
     );
    
     $output = 'names'; // names or objects, note names is the default
     $operator = 'and'; // 'and' or 'or'
    
     $post_types = get_post_types( $args, $output, $operator ); 
        if(is_singular($post_types)){

            $url = get_bloginfo('url');
            wp_redirect($url, '301');
            exit();
    }
}
add_action( 'template_redirect', 'redireccionar_pagina_inicio');

Solo usa el hook add_action( 'template_redirect', 'mi_nombre_de_funcion');

Nota: Estoy usando un child-theme

7 mar 2021 06:25:11
Comentarios

¡Muchas gracias! Probé muchas combinaciones con wp_redirect, exit, die, header. ¡La solución fue usar ob_clean(); ob_start(); al principio!

Galina Bublik Galina Bublik
13 sept 2022 08:46:25
0

El error "headers already sent" es la razón principal. Como los encabezados ya fueron enviados, no es posible reenviarlos y falla la redirección. Usa antes de los encabezados, como en el hook init.

add_action('init', 'tu_funcion_de_aplicacion');
22 jul 2020 10:57:19
0

Asegúrate de no tener: get_header(); o cualquier función de WordPress que potencialmente pueda crear contenido como el encabezado (header) y pie de página (footer) en tu plantilla. De lo contrario, la redirección no funcionará.

Algunos desarrolladores intentan limpiar la página usando ob_start(); pero si tienes contenido en tu página, incluso si usas ob_start();, la redirección no funcionará.

Y luego simplemente prueba este código:

wp_redirect(get_permalink($post->ID));
exit;
16 ene 2019 23:33:18
1
if( is_page( ['wfp-dashboard', 'wfp-checkout'] ) ){
   if(!is_user_logged_in()){
      @ob_flush();
      @ob_end_flush();
      @ob_end_clean();
      wp_redirect( wp_login_url() );
      exit();
   }
}
6 ago 2019 09:28:06
Comentarios

¿Podrías incluir alguna explicación de cómo esto soluciona el problema? No estoy seguro de por qué hay buffers de salida en el código, y tienen el operador @, @ no evita que ocurran errores, solo los oculta del registro de errores

Tom J Nowell Tom J Nowell
22 jul 2020 11:53:14
0

Acabo de notar que el plugin W3 Total Cache debe estar activo para que esto funcione. Por alguna razón, desactivó el mío.

wp_redirect("/");
exit;
28 dic 2022 19:53:38