Come posso far caricare il mio plugin prima dell'output degli header per reindirizzare in WordPress?

13 gen 2015, 20:50:07
Visualizzazioni: 17.2K
Voti: 5

Ho scritto del codice che aiuta a proteggere i file dei miei clienti e l'ho aggiunto al file functions.php di WordPress. Tuttavia, quando arrivano gli aggiornamenti, ovviamente sovrascrivono la mia funzione.

Quindi volevo crearlo come plugin.

Ma continuo a ricevere questo errore:

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

Quindi ho bisogno di eseguire il mio codice PRIMA che WordPress invii gli header.

Come posso fare?

Grazie, Richard

Aggiornamento. Ecco il codice, ho cambiato i tag ma il concetto è lo stesso...

<?php 
/*
 * Plugin Name: My WP Plugin
 * Plugin URI: http://www.example.com/plugins
 * Description: My Plugin
 * Version: 1.0
 * Author: My Name
 * Author 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');
?>

Sto ancora ricevendo l'errore "PHP Warning: Cannot modify header information - headers already sent by...".

Vedi perché? Non riesco a trovarlo. Forse ho fatto qualcosa di sbagliato che non vedo.

Richard

14
Commenti

Come stai chiamando il tuo codice? A quale action/filter ti stai agganciando?

czerspalace czerspalace
13 gen 2015 20:55:56

@czerspalace, ho aggiornato il post sopra, ora mostra l'intero codice, l'ho appena aggiornato, ma ottengo ancora un errore.

Richard Richard
13 gen 2015 21:08:19

La cosa ancora più strana è che anche se metto solo il controllo e non faccio nulla, nessuna azione nell'if statement, ottengo comunque l'errore "headers already sent". Ma se non sto stampando nulla sulla pagina, o cercando di impostare un header, o tentando un redirect, perché dovrei ottenere questo errore? Non capisco.

Richard Richard
13 gen 2015 21:15:24

Ora, ho SOLO aggiunto la funzione:

code function somebit_init() {/ Non fare niente / } add_action('template_redirect', 'somebit_init'); code e continuo a ricevere l'errore.

Richard Richard
13 gen 2015 21:17:01

Cosa succede se rimuovi il ?> che si trova dopo il add_action

czerspalace czerspalace
13 gen 2015 21:38:16

@czerspalace così la pagina si è caricata, ma il codice non sembra eseguire... il ?> non deve essere presente affinché PHP elabori il codice?

Richard Richard
13 gen 2015 21:42:06

@czerspalace, ok, ho aggiunto del codice di test, viene eseguito all'interno dell'istruzione if, ma se inserisco un redirect lì dentro, continua a darmi questo errore: 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 non capisco perché. Se viene eseguito con init dovrebbe essere prima degli header, giusto?

Richard Richard
13 gen 2015 21:53:55

@czerspalace in realtà, mostra quell'errore anche se ho solo un echo di un messaggio come "niente da vedere qui"... poi exit wordpress. Continuo a vedere quel cannot modify headers. Ma cosa sta cercando di modificare gli header? Se init viene eseguito prima che gli header vengano inviati?

Richard Richard
13 gen 2015 21:58:20

Se vedi qui nel Codex, rimuovere il tag di chiusura php è preferibile. Quindi cosa succede se rimuovi ?> e poi esegui l'istruzione echo? O è quello che hai già provato?

czerspalace czerspalace
13 gen 2015 22:31:05

L'ho rimosso, ma non ha risolto il problema. Continua a registrare l'errore nel log degli errori che ti ho mostrato prima, riguardante l'impossibilità di modificare gli header, anche se nulla sta tentando di modificare alcun header.

Richard Richard
13 gen 2015 23:44:12

Hai altri plugin attivi? In caso affermativo, hai provato a disattivarli per verificare se sono la causa del problema?

czerspalace czerspalace
13 gen 2015 23:53:00

@czerspalace, nessun altro plugin attivato. Sto testando questo su un sito che non ho ancora configurato, si tratta comunque di un sito demo... quindi posso sperimentare e non importa se è danneggiato dato che non l'ho ancora impostato, quindi non lo mostro a nessuno... Non capisco perché succeda questo.

Richard Richard
14 gen 2015 00:01:01

Nel file functions.php del tuo tema c'è anche una chiusura ?>, e se sì, cosa succede se la rimuovi e poi provi il tuo codice?

czerspalace czerspalace
14 gen 2015 02:46:19

C'è un motivo per cui vuoi usare un reindirizzamento header invece di wp_redirect?

juz juz
15 apr 2016 14:10:42
Mostra i restanti 9 commenti
Tutte le risposte alla domanda 6
0

L'hook corretto da utilizzare è template_redirect che ti permette di avere le informazioni necessarie disponibili per fare i controlli essendo comunque abbastanza precoce da effettuare effettivamente il reindirizzamento. Come nell'esempio presente nella pagina 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' );

Pagina del Codex qui - template_redirect

28 ott 2016 16:37:17
1

Che ne dici di usare questa azione? Link Codex - azione 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
Commenti

utilizzerei l'hook wp_headers così puoi modificare gli header prima che vengano inviati, con la funzione WP wp_redirect()

frizzant frizzant
26 set 2023 14:45:06
5

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

o qualsiasi hook di azione prima che gli header vengano inviati: http://codex.wordpress.org/Plugin_API/Action_Reference

13 gen 2015 20:57:00
Commenti

template_redirect può essere utilizzato se la funzione che gestisce il reindirizzamento dipende dal fatto che WP sia caricato

karpstrucking karpstrucking
13 gen 2015 21:01:02

@karpstrucking Ho provato così, stesso errore. "PHP Warning: Cannot modify header information - headers already sent by..." i file che dice aver già inviato l'output sono il codice che ho aggiornato nel post originale... ma non ho mai avviato alcun header.

Richard Richard
13 gen 2015 21:11:50

quando appare questo errore, quando provi ad attivare il plugin? puoi postare l'errore completo, comprese le informazioni sul percorso del file

karpstrucking karpstrucking
13 gen 2015 21:13:41

Appare nel log degli errori. Sul sito WordPress, ottengo una pagina bianca. Niente.

Ecco l'intera stringa di errore, ho solo modificato il nome utente nel percorso...

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 gen 2015 21:23:33

il plugin è attivato. Diceva che c'erano 3 caratteri inaspettati in output quando è stato attivato, ma è rimasto attivo e nessun errore e la pagina si carica, ma l'errore succede quando metto dl=nomefile.zip o qualsiasi cosa con ?dl= nell'URL.

Richard Richard
13 gen 2015 21:24:16
0

I tuoi controlli, if($_GET['dl']) e else if($_GET['download']) stanno generando errori Undefined index:, e questo sembra causare un problema con gli header nel tuo My Security Plugin.

Prova a modificarlo in:

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 gen 2015 05:54:45
0

Questa è una funzione che ho utilizzato per verificare se un utente non loggato sta cercando di accedere direttamente a una pagina personalizzata (riservata solo agli utenti). Controlla se qualcuno è entrato in una determinata pagina.

Effettua anche un secondo controllo per verificare che i cookie principali siano stati creati (utile per evitare errori di indice non definito)

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

Proprio come nelle altre risposte, ho utilizzato l'hook 'template_redirect'

    add_action('template_redirect', 'validate_sesion');

Spero possa essere utile a qualcuno

22 mag 2019 13:52:43
0

Aggiungi un hook all'azione headers

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

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

Semplice e pulito.

26 set 2023 14:49:24