Modificare headere înainte de afișare pentru redirecționare în WordPress
Am scris niște cod care ajută la securizarea fișierelor clienților mei și l-am adăugat în fișierul de funcții al WordPress. Totuși, de fiecare dată când vin actualizări, acesta îmi suprascrie funcția.
Așadar, am vrut să o creez ca un plugin.
Însă, primesc constant această eroare:
PHP Warning: Cannot modify header information - headers already sent by...
Deci trebuie să execut codul meu ÎNAINTE ca WordPress să trimită headerele.
Cum pot face acest lucru?
Mulțumesc, Richard
Actualizare. OK, iată codul, am schimbat tag-urile, dar logica e aceeași...
<?php
/*
* Nume Plugin: Pluginul Meu WP
* URI Plugin: http://www.example.com/plugins
* Descriere: Pluginul Meu
* Versiune: 1.0
* Autor: Numele Meu
* URI Autor: 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');
?>
Încă primesc eroarea "PHP Warning: Cannot modify header information - headers already sent by...".
Îți dai seama de ce? Nu reușesc să identific problema. Poate am făcut ceva greșit pe care nu-l văd.
Richard
Hook-ul corect de utilizat este template_redirect
, care îți permite să ai informațiile necesare disponibile pentru verificări, dar și suficient de devreme pentru a efectua redirecționarea. Conform exemplului de pe pagina 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' );
Pagina Codex aici - template_redirect

Cum ar fi să folosim această acțiune? Link Codex - acțiunea send_headers
add_action( 'send_headers', 'add_redirect_header' );
function add_redirect_header() {
header( 'Location: http://www.google.com' );
}

folosește add_action('init', 'your_function');
sau orice action hook înainte ca headerele să fie trimise: http://codex.wordpress.org/Plugin_API/Action_Reference

template_redirect
poate fi folosit dacă funcția care se ocupă de redirecționare depinde de încărcarea WP

@karpstrucking Am încercat asta, aceeași eroare. "PHP Warning: Cannot modify header information - headers already sent by..." fișierele pe care le menționează că au trimis deja headere, este codul pe care l-am actualizat în postarea originală... dar eu nu am inițiat niciodată headere.

când apare această eroare, când încerci să activezi pluginul? poți posta întreaga eroare, inclusiv informațiile despre calea fișierului

Apare în jurnalul de erori. Pe site-ul WordPress, primesc o pagină goală. Nimic.
Iată întregul șir de eroare, doar am schimbat numele de utilizator în cale...
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

Verificările tale, if($_GET['dl'])
și else if($_GET['download'])
, aruncă erori Undefined index:
, iar acest lucru pare să cauzeze probleme cu headere în My Security Plugin.
Încearcă să le modifici astfel:
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;
}
}
}

Aceasta este o funcție pe care am folosit-o pentru a verifica dacă un utilizator nelogat încearcă să acceseze direct o pagină personalizată (doar pentru utilizatori), verificând dacă cineva a intrat pe o anumită pagină.
De asemenea, face o a doua verificare dacă cookie-urile principale sunt create (util pentru a evita erorile de index nedefinit)
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();
}
}
}
La fel ca celelalte răspunsuri, am folosit hook-ul 'template_redirect'
add_action('template_redirect', 'validate_sesion');
Sper că poate ajuta pe cineva
