¿Cómo hacer que mi plugin se cargue antes de que se envíen los encabezados en WordPress para redireccionar?
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

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

¿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' );
}

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

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

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

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

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

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;
}
}
}

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
