¿Cómo hacer que mi plugin se cargue antes de que se envíen los encabezados en WordPress para redireccionar?

13 ene 2015, 20:50:07
Vistas: 17.2K
Votos: 5

Escribí un código que ayuda a proteger los archivos de mis clientes y lo añadí al archivo de funciones de WordPress. Sin embargo, cuando hay actualizaciones, obviamente sobrescribe mi función.

Así que quise crearlo como un plugin.

Pero sigo recibiendo este error:

PHP Warning:  Cannot modify header information - headers already sent by...

Necesito ejecutar mi código ANTES de que WordPress envíe los encabezados.

¿Cómo puedo hacer esto?

Gracias, Richard

Actualización. Aquí está el código, cambié las etiquetas pero es la misma premisa...

<?php 
/*
 * Nombre del Plugin: Mi Plugin WP
 * URI del Plugin: http://www.example.com/plugins
 * Descripción: Mi Plugin
 * Versión: 1.0
 * Autor: Mi Nombre
 * Autor URI: http://www.example.com/
*/

function somebit_init() {
    $_permaStruc = get_option('permalink_structure');
    if($_permaStruc != "") {
        if($_GET['dl']) {
            header("Location: http://google.com");
            exit;
        } else if($_GET['download']) {
            header("Location: http://google.com");
            exit;
        }
    }
}
add_action('init', 'somebit_init');
?>

Sigo recibiendo el error "PHP Warning: Cannot modify header information - headers already sent by...".

¿Ves por qué? No puedo encontrarlo. Tal vez hice algo mal que no logro ver.

Richard

14
Comentarios

¿Cómo estás llamando a tu código? ¿A qué acción/filtro lo estás enganchando?

czerspalace czerspalace
13 ene 2015 20:55:56

@czerspalace, actualicé la publicación anterior, ahora muestra todo el código, acabo de actualizarlo, pero aún tengo un error.

Richard Richard
13 ene 2015 21:08:19

Lo más extraño es que incluso si solo pongo la verificación y no hago nada, ninguna acción en la declaración if, sigo recibiendo el error de encabezados ya enviados. Pero si no estoy imprimiendo nada en la página, ni intentando establecer un encabezado, ni intentando redireccionar, ¿por qué obtendría ese error? No lo entiendo.

Richard Richard
13 ene 2015 21:15:24

Ahora, SOLO agregué la función:

code function somebit_init() {/ No hacer nada / } add_action('template_redirect', 'somebit_init'); code y todavía obtengo el error.

Richard Richard
13 ene 2015 21:17:01

¿Qué pasa si eliminas el ?> que está después del add_action?

czerspalace czerspalace
13 ene 2015 21:38:16

@czerspalace eso hizo que la página cargara, pero el código no parece estar ejecutándose... ¿no tiene que estar el ?> para que PHP lo procese?

Richard Richard
13 ene 2015 21:42:06

@czerspalace, vale, he añadido algo de código de prueba, se está ejecutando dentro de la sentencia if, pero si pongo un redireccionamiento ahí, me sigue dando este error: PHP Warning: Cannot modify header information - headers already sent by (output started at /home/username/public_html/hvac/wp-content/plugins/My-Security-Plugin/my_securit‌​y_security.php:1) in /home/username/public_html/hvac/wp-includes/pluggable.php on line 876 no estoy seguro de por qué. Si se está ejecutando con el init debería ser antes de los headers, ¿no?

Richard Richard
13 ene 2015 21:53:55

@czerspalace en realidad, muestra ese error incluso si solo hago que muestre un mensaje como "nada que ver aquí"... y luego salgo de wordpress. Sigo viendo ese cannot modify headers. ¿Qué está intentando modificar los headers? Si el init se ejecuta antes de que se envíen los headers?

Richard Richard
13 ene 2015 21:58:20

Si ves aquí en el Codex, se recomienda eliminar la etiqueta de cierre de php. ¿Qué pasa si eliminas el ?> y luego ejecutas la sentencia echo? ¿O es eso lo que ya intentaste?

czerspalace czerspalace
13 ene 2015 22:31:05

Lo eliminé, y no lo solucionó. Sigue apareciendo el error en el registro de errores que te mostré antes sobre no poder modificar los encabezados, a pesar de que nada está intentando modificar ningún encabezado.

Richard Richard
13 ene 2015 23:44:12

¿Tienes algún otro plugin activo? En tal caso, ¿has intentado desactivarlos para ver si son los que causan el problema?

czerspalace czerspalace
13 ene 2015 23:53:00

@czerspalace, no hay otros plugins activados. Estoy probando esto en un sitio que aún no he configurado, que de todos modos es un sitio demo... así que puedo experimentar con él y no importa si se rompe ya que no lo he configurado, así que no se lo muestro a nadie... No estoy seguro de por qué haría esto.

Richard Richard
14 ene 2015 00:01:01

En el archivo functions.php de tu tema, ¿también hay un cierre ?>, y si es así, qué sucede si lo eliminas y luego pruebas tu código?

czerspalace czerspalace
14 ene 2015 02:46:19

¿Hay alguna razón por la que quieras usar redirección por encabezado en lugar de wp_redirect?

juz juz
15 abr 2016 14:10:42
Mostrar los 9 comentarios restantes
Todas las respuestas a la pregunta 6
0

El hook correcto para usar es template_redirect que te permite tener la información necesaria disponible para realizar comprobaciones y además es lo suficientemente temprano para realizar redirecciones. Como se muestra en el ejemplo de la página del codex:

function my_page_template_redirect()
    {
    if( is_page( 'goodies' ) && ! is_user_logged_in() )
    {
        wp_redirect( home_url( '/signup/' ) );
        exit();
    }
}
add_action( 'template_redirect', 'my_page_template_redirect' );

Página del Codex aquí - template_redirect

28 oct 2016 16:37:17
1

¿Qué tal si usamos esta acción? Enlace al Codex - acción send_headers

add_action( 'send_headers', 'add_redirect_header' );
function add_redirect_header() {
    header( 'Location: http://www.google.com' );
}
15 abr 2016 14:13:09
Comentarios

usaría el hook wp_headers para que puedas modificar los encabezados antes de enviarlos, con la función de WP wp_redirect()

frizzant frizzant
26 sept 2023 14:45:06
5

usa add_action('init', 'tu_funcion');

o cualquier gancho de acción antes de que se envíen las cabeceras: http://codex.wordpress.org/Plugin_API/Action_Reference

13 ene 2015 20:57:00
Comentarios

template_redirect se puede usar si la función que maneja la redirección depende de que WP esté cargado

karpstrucking karpstrucking
13 ene 2015 21:01:02

@karpstrucking Lo intenté, mismo error. "PHP Warning: Cannot modify header information - headers already sent by..." los archivos que menciona ya los envió, es el código que actualicé en la publicación original... pero yo nunca inicié ningún header.

Richard Richard
13 ene 2015 21:11:50

¿cuándo aparece este error, cuando intentas activar el plugin? ¿puedes publicar el error completo, incluyendo la información de la ruta del archivo?

karpstrucking karpstrucking
13 ene 2015 21:13:41

Aparece en el registro de errores. En el sitio de WordPress, obtengo una página en blanco. Nada.

Aquí está toda la cadena de error, solo cambié el nombre de usuario en la ruta...

code"[13-Jan-2015 19:16:35 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/username/public_html/hvac/wp-content/plugins/My-Security-Plugin/my_security_security.php:1) in /home/username/public_html/hvac/wp-includes/pluggable.php on line 876"code

Richard Richard
13 ene 2015 21:23:33

el plugin está activado. Decía que había 3 caracteres inesperados en la salida al activarlo, pero permaneció activo sin errores y la página carga, pero el error ocurre cuando pongo dl=filename.zip o cualquier cosa con ?dl= en la URL.

Richard Richard
13 ene 2015 21:24:16
0

Tus verificaciones, if($_GET['dl']) y else if($_GET['download']), están generando errores de Undefined index:, y eso parece estar causando un problema con las cabeceras en tu My Security Plugin.

Intenta cambiarlo por:

function somebit_init() {
    $_permaStruc = get_option('permalink_structure');
    if($_permaStruc != "") {
        if( !empty($_GET['dl'])) {
            header("Location: http://google.com");
            exit;
        } else if( !empty($_GET['download'])) {
            header("Location: http://google.com");
            exit;
        }
    }
}
14 ene 2015 05:54:45
0

Esta es una función que utilicé para verificar si un usuario no registrado está intentando ingresar directamente a una página personalizada (solo para usuarios), comprueba si alguien ingresó a cierta página.

Incluso realiza una segunda verificación si las cookies principales están creadas (útil para evitar errores de índice indefinido)

    function validate_sesion() {
    if ((is_page('something'))||(is_singular('something'))) {
        if (!is_user_logged_in()) {
            wp_redirect(home_url('log-out'));
            exit();
        } elseif ((empty($_COOKIE["user_id"])) || (empty($_COOKIE["user_role"]))) {
            if (is_user_logged_in()) {
                wp_redirect(home_url('log-out'));
                exit();
            }
        }
    }

Al igual que las otras respuestas, utilicé el hook 'template_redirect'

    add_action('template_redirect', 'validate_sesion');

Espero que pueda ayudar a alguien

22 may 2019 13:52:43
0

Enganchar al hook de cabeceras

add_action( 'wp_headers', [ $this, 'forward_to_login' ] );

/**
 * @return void
 */
function forward_to_login() {
    wp_redirect( 'www.example.com' );
}

Sencillo y limpio.

26 sept 2023 14:49:24