Modificare headere înainte de afișare pentru redirecționare în WordPress

13 ian. 2015, 20:50:07
Vizualizări: 17.2K
Voturi: 5

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

14
Comentarii

Cum apelezi codul tău? Pe ce acțiune/filtru te conectezi?

czerspalace czerspalace
13 ian. 2015 20:55:56

@czerspalace, am actualizat postul de mai sus, acum afișează întregul cod, tocmai l-am actualizat, dar încă primesc o eroare.

Richard Richard
13 ian. 2015 21:08:19

Și mai ciudat este că, chiar dacă pun doar verificarea și nu fac nimic, nicio acțiune în instrucțiunea if, tot primesc eroarea de anteturi deja trimise. Dar dacă nu afișez nimic pe pagină, sau nu încerc să setez un antet, sau nu încerc să redirecționez, de ce aș primi această eroare? Nu înțeleg.

Richard Richard
13 ian. 2015 21:15:24

Acum, am ADAUGAT doar funcția:

code function somebit_init() {/ Nu face nimic / } add_action('template_redirect', 'somebit_init'); code și tot primesc eroarea.

Richard Richard
13 ian. 2015 21:17:01

Ce se întâmplă dacă elimini ?> care se află după add_action

czerspalace czerspalace
13 ian. 2015 21:38:16

@czerspalace asta a făcut pagina să se încarce, dar codul nu pare să se execute... nu trebuie să fie ?> acolo pentru ca PHP să proceseze?

Richard Richard
13 ian. 2015 21:42:06

@czerspalace, bine, am adăugat niște cod de test, se execută în interiorul instrucțiunii if, dar dacă pun o redirecționare acolo, în continuare primesc această eroare: 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 nu știu de ce. dacă se execută cu init, ar trebui să fie înainte de headers, nu?

Richard Richard
13 ian. 2015 21:53:55

@czerspalace de fapt, arată acea eroare chiar dacă am doar un mesaj de tip echo "nimic de văzut aici"... apoi exit din WordPress. Tot văd acel cannot modify headers. Ce încearcă să modifice headers însă? Dacă init-ul se execută înainte de trimiterea headers?

Richard Richard
13 ian. 2015 21:58:20

Dacă te uiți aici în Codex, eliminarea tag-ului de închidere php este preferată. Deci ce se întâmplă dacă elimini ?> și apoi rulezi instrucțiunea echo? Sau asta ai încercat deja?

czerspalace czerspalace
13 ian. 2015 22:31:05

Am eliminat-o, dar nu a rezolvat problema. În continuare apare eroarea în jurnalul de erori pe care ți-am arătat-o mai sus, despre imposibilitatea de a modifica anteturile, chiar dacă nimic nu încearcă să modifice vreun antet.

Richard Richard
13 ian. 2015 23:44:12

Ai alte pluginuri activate? Dacă da, ai încercat să le dezactivezi pentru a vedea dacă ele cauzează problema?

czerspalace czerspalace
13 ian. 2015 23:53:00

@czerspalace, nu am alte pluginuri activate. Testez acest lucru pe un site pe care nu l-am configurat încă, care oricum este un site demo... așa că pot să experimentez și nu contează dacă este stricat, deoarece nu l-am setat încă, așa că nu îl arăt nimănui... Nu înțeleg de ce ar face asta.

Richard Richard
14 ian. 2015 00:01:01

În fișierul functions.php al temei tale există și un ?> de închidere, și dacă da, ce se întâmplă dacă îl elimini și apoi încerci codul tău?

czerspalace czerspalace
14 ian. 2015 02:46:19

Există vreun motiv pentru care dorești să folosești o redirecționare prin header în loc de wp_redirect?

juz juz
15 apr. 2016 14:10:42
Arată celelalte 9 comentarii
Toate răspunsurile la întrebare 6
0

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

28 oct. 2016 16:37:17
1

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' );
}
15 apr. 2016 14:13:09
Comentarii

ar folosi hook-ul wp_headers pentru a putea modifica headerele înainte de trimitere, cu funcția WP wp_redirect()

frizzant frizzant
26 sept. 2023 14:45:06
5

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

13 ian. 2015 20:57:00
Comentarii

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

karpstrucking karpstrucking
13 ian. 2015 21:01:02

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

Richard Richard
13 ian. 2015 21:11:50

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

karpstrucking karpstrucking
13 ian. 2015 21:13:41

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

Richard Richard
13 ian. 2015 21:23:33

plugin-ul este activat. A spus că au existat 3 caractere neașteptate la ieșire când a fost activat, dar a rămas activ și fără erori, iar pagina se încarcă, dar eroarea apare când pun dl=filename.zip sau orice cu ?dl= în URL.

Richard Richard
13 ian. 2015 21:24:16
0

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;
        }
    }
}
14 ian. 2015 05:54:45
0

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

22 mai 2019 13:52:43
0

Conectare la hook-ul pentru headere

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

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

Simplu și concis.

26 sept. 2023 14:49:24