Sviluppo plugin WordPress - Header Già inviato


15

Sto sviluppando plugin per WordPress. Quando attivo il mio plugin, ricevo il seguente messaggio:

Il plugin ha generato 293 caratteri di output imprevisto durante l'attivazione. Se noti messaggi "header già inviati", problemi con i feed di syndication o altri problemi, prova a disattivare o rimuovere questo plugin.

Il plugin funziona molto bene ma non so perché ricevo questo messaggio. Il mio plugin è: http://wordpress.org/extend/plugins/facebook-send-like-button/


se il debug è abilitato, potresti ottenerlo se php ha emesso un avviso.
Milo,

1
Controlla se hai lasciato degli spazi vuoti dopo aver chiuso i tag php alla fine dei file php del plugin.
Sisir,

1
Se si utilizza un debugger, inserire un punto di interruzione in activate_plugin methodin wordpress/wp-admin/includes/plugin.php. Il contenuto della variabile di output $ ti mostrerà i dati caricati nell'eccezione invariabilmente lanciati e quindi offuscati da wordpress.
Todd Holmberg,

Risposte:


10

Suppongo che ricevi un errore PHP, che genera output prima che le intestazioni vengano inviate. Se hai E_NOTICEabilitato, la chiamata $_POST['foo']può generare un errore "Avviso: variabile non definita" se quella variabile non è impostata.

Best practice: non assumere mai nulla sulle variabili GET, POST, COOKIE e REQUEST. Controlla sempre prima usando isset()o empty().

if ( isset( $_POST['foo'] ) ) {
    $foo = (string) $_POST['foo'];
    // apply more sanitizations here if needed
}

13

Ciò è in genere causato da spazi o nuove righe prima del <?phptag di apertura o dopo il ?>tag di chiusura .

Dai un'occhiata a questa pagina per vedere alcune soluzioni: Come posso risolvere il problema di avviso delle intestazioni già inviate?

AGGIORNARE

Dopo aver esaminato il tuo codice plugin, l'unica cosa che ho notato è che non hai un tag PHP di chiusura. Nell'ultima riga, aggiungi?>


4
I file PHP non richiedono il ?>tag di chiusura . In effetti, un modo per garantire che non causi Headers already sentproblemi è quello di lasciare fuori il tag di chiusura.
John P Bloch,

2
Questo era il mio problema. Ho avuto un sacco di righe vuote dopo la mia chiusura ?>.
Cam Jackson,

1
Non raccomandare di usare un tag PHP di chiusura. È una cattiva pratica che porta al tipo di problemi nel PO, e va contro gli standard di codifica WP Core (vedi make.wordpress.org/core/handbook/best-practices/… )
butlerblog

4

All'inizio della tua funzione di attivazione metti a ob_start();e alla fine metti atrigger_error(ob_get_contents(),E_USER_ERROR);

Quindi prova ad attivare il tuo plug-in e potrai vedere quali sono realmente i " 293 caratteri generati di output imprevisto ". Da quel momento in poi il debug sarà più semplice (rimuovendo i nuovi caratteri di riga o risolvendo alcuni errori).


questa è in realtà una soluzione geniale per correggere l'errore .. Grazie ..
Obmerk Kronen,

3

Ho già affrontato lo stesso problema prima, per me era uno spazio extra bianco. Dopo aver rimosso tutti quegli spazi bianchi, il plug-in potrebbe attivarsi senza errori / avvisi.


1

Non sono sicuro che questo sia il problema, ma ne sono abbastanza sicuro.

È necessario utilizzare un callback valido come secondo argomento in register_activation_hook():

register_activation_hook(__FILE__,'twl_tablo_olustur');

Per quanto posso dire, non hai definito da twl_tablo_olustur()nessuna parte. Ciò spiegherebbe sicuramente l'output imprevisto (errore PHP generato dal tentativo di chiamare una funzione inesistente) e spiegherebbe perché funziona bene in tutte le altre circostanze.


grazie. Ma register_activation_hook(__FILE__,'twl_tablo_olustur');questo codice dalla vecchia versione. Nella nuova versione (puoi controllare, v1.3) è aggiornato, ma rimane lo stesso errore.
Eray

1

Tendo a ricevere questi messaggi molto quando sto inviando messaggi di debug di plugin / temi, specialmente quando sto inviando roba prima che venga chiamato wp_header.

Se stai emettendo dei caratteri, allora credo (potrebbe essere sbagliato qui) che ci sia una dichiarazione di intestazione implicita, quindi quando si verifica la normale chiamata di intestazione (), ottieni l'errore in quanto non puoi avere 2 dichiarazioni di intestazione.

Puoi usare ob_start () per bufferizzare l'output, che dovrebbe rimuovere l'errore - dai un'occhiata ai commenti qui: http://php.net/manual/en/function.header.php


1

So che questa è una vecchia domanda e ha una risposta accettata. Ci sono molte risposte che coprono quale potrebbe essere potenzialmente il problema di attivazione . Tuttavia, nessuna delle risposte arriva davvero al problema principale di COME eseguire il debug dei problemi con l'attivazione del plugin.

Se hai intenzione di sviluppare plugin WP, puoi anche utilizzare gli strumenti corretti per il lavoro. Uno di questi è la barra di debug . Questo è un plugin che ti aiuta a eseguire il debug dei problemi in WP. Se sei uno sviluppatore di plug-in, dovrebbe essere nella tua casella degli strumenti.

La barra di debug ha un numero di componenti aggiuntivi - plugin per il plugin, se vuoi. Uno di questi è Attivazione plugin barra di debug , che ti mostrerà l'errore PHP generato quando il plugin si attiva. Una volta che sai qual è l'errore PHP che causa l'invio delle intestazioni, allora sai dove devi cercare per correggerlo. Fidati di me, sapendo che l'errore è che si può risparmiare un sacco di tempo invece di cercare di capire cosa l'errore potrebbe essere .


Grazie, è molto utile!
user1190132

0

Guardando l'ultima revisione del plugin (381724) il problema è Troppi spazi

ogni volta che vuoi creare questa struttura:

function blabla(){
   <= space
   something...
}

nel tuo codice usa TAB e non spazi.

Ecco il tuo codice in cui ho sostituito tutti gli spazi con le schede e non ricevo alcun messaggio all'attivazione:

<?php
/*
Plugin Name: Facebook Send Button By Teknoblogo.com
Plugin URI: http://www.teknoblogo.com/facebook-gonder-butonu-eklenti
Description: Adds Facebook's Send and Like buttons to your posts ! Author : <a href="http://www.teknoblogo.com">teknoblogo.com</a>
Version: 1.3
Author: Eray Alakese
Author URI: http://www.teknoblogo.com
License: GPL2
*/

wp_register_script('fgb_script', "http://connect.facebook.net/en_US/all.js#xfbml=1");
wp_enqueue_script('fgb_script');

function fgb_ayarlari_yap()
{
    add_option('fgb_yer', 'u');
    add_option('fgb_buton', 'snl');
    add_option('fgb_manual', 'hayir');
}
register_activation_hook( __FILE__, 'fgb_ayarlari_yap' );
function fgb_ayarlari_sil()
{
    delete_option('fgb_yer');
    delete_option('fgb_buton');
    delete_option('fgb_manual');
}
register_deactivation_hook( __FILE__, 'fgb_ayarlari_sil' );


function fgb_ekle($content)
{
    $fgb_yer = get_option('fgb_yer'); 
    $fgb_buton_opt = get_option('fgb_buton'); 
    $fgb_manual = get_option('fgb_manual');
    $fgb_perma  = rawurlencode(get_permalink());
    $fgb_send_button = "<fb:send href=\"$fgb_perma\" font=\"\"></fb:send>";
    $fgb_like_button = "<fb:like href=\"$fgb_perma\" send=\"false\" width=\"450\" show_faces=\"true\" font=\"\"></fb:like>";
    $fgb_snl_button = "<fb:like href=\"$fgb_perma\" send=\"true\" width=\"450\" show_faces=\"true\" font=\"\"></fb:like>";
    if($fgb_buton_opt == "send")
    {
        $fgb_buton = $fgb_send_button;
    }
    elseif($fgb_buton_opt == "like")
    {
        $fgb_buton = $fgb_like_button;
    }
    elseif($fgb_buton_opt == "snl")
    {
        $fgb_buton = $fgb_snl_button;
    }
    else
    {
        echo "Buton türü alınamadı!";
    }

    if ($fgb_manual=="hayir"){
        if ($fgb_yer == "u")
        {
            $content = $fgb_buton."<br />".$content;
        }
        elseif ($fgb_yer == "a")
        {
            $content = $content."<br />".$fgb_buton;
        }
        return $content;
    }
    elseif($fgb_manual=="evet"){
        echo $fgb_buton;
    }
}
if (get_option('fgb_manual')=="hayir"){ add_filter( "the_content", "fgb_ekle" ); }

add_action('admin_menu', 'fgb_admin_menu');
function fgb_admin_menu() {
    add_options_page('Facebook Send Button', 'Facebook Send Button', 'manage_options', 'fgb', 'fgb_admin_options');
}
function fgb_admin_options() {
    if (!current_user_can('manage_options'))  {
        wp_die( __('You do not have sufficient permissions to access this page.') );
    }
    echo '<div class="wrap">';
    ?>
    <h2>Facebook Send & Like Button</h2>
    <? 
    if($_POST["fgb_gonder"])
    {
      echo "<h3>saved</h3>";
      update_option('fgb_yer', $_POST["fgb_yer"]);
      update_option('fgb_buton', $_POST["fgb_buton"]);    
      update_option('fgb_manual', $_POST["fgb_manual"]);

        $fgb_admin_yer = get_option('fgb_yer');
        $fgb_admin_buton = get_option('fgb_buton');
        $fgb_admin_manual = get_option('fgb_manual');
    }
    ?>
    <form action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="POST">
    Show Facebook buttons <select name="fgb_yer">
        <option value="u" <?php if($fgb_admin_yer == "u"){echo "SELECTED";}?>>before content</option>
        <option value="a" <?php if($fgb_admin_yer == "a"){echo "SELECTED";}?>>after content</option>
    </select> and i want <select name="fgb_buton">
        <option value="snl" <?php if($fgb_admin_buton=="snl"){echo "SELECTED";}?>>send and like buttons together</option>
        <option value="send" <?php if($fgb_admin_buton=="send"){echo "SELECTED";}?>>just send button</option>
        <option value="like" <?php if($fgb_admin_buton=="like"){echo "SELECTED";}?>>just like button</option>
    </select> . <br />
    <input type="radio" value="hayir" name="fgb_manual" <?php if($fgb_admin_manual=="hayir"){echo "CHECKED";}?> /> put buttons for me, AUTOMATICALLY <br />
    <input type="radio" value="evet" name="fgb_manual" <?php if($fgb_admin_manual=="evet"){echo "CHECKED";}?> /> i can put them, MANUALLY <br />

    <input type="submit" class="button-primary" name="fgb_gonder" value="<?php _e('Save Changes') ?>" />
    </form>
    <br />If you use <strong>manuel insertion</strong> , you have to add this code to your theme : 
    <strong>&lt;?php if(function_exists('fgb_ekle')) {   fgb_ekle(); }?&gt;</strong>

    <hr />
    <em>If you like this plugin, please <a href="http://wordpress.org/extend/plugins/facebook-send-like-button/">vote</a> .
    Author : <a href="http://www.teknoblogo.com">Eray Alakese</a>
    You can <a href="mailto:info@teknoblogo.com">mail me</a> for bugs, thanks.</em>

    <?php
    echo '</div>';
}

2
Non dovrebbe avere nulla a che fare con questo. Spazi e schede all'interno delle tue funzioni sono accettabili e non generano questo errore.
Matthew Muro,

all'interno di una funzione hai ragione, ma se la funzione genera qualcosa direttamente, ad esempio: function blabla(){?> <input> <?php code... ?> output something <?php code.. }allora non è così.
Bainternet,

2
@MatthewMuro: se lasci lo spazio all'interno di una funzione il suo okey ma se lasci qualsiasi spazio bianco / interruzione di riga dopo i tag di chiusura di php ?>, otterrai header already send errorperché quegli spazi bianchi extra verranno stampati quando il motore php lo analizza.
Sisir,

0

Rimuovete il tag di chiusura php (?>) Dalla fine di ogni file. e rimuovi anche tutto lo spazio vuoto dopo il tag di chiusura php (?>)

quando attivi il plugin, controlla se la tabella esiste già o meno.

ho rimosso il problema dal codice

    if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {

        $sql = "CREATE TABLE {$table_name}(
            id INT NOT NULL AUTO_INCREMENT,
            name VARCHAR(250),
            email VARCHAR(250),
            PRIMARY KEY (id)
        );";
        dbDelta($sql);
    }

-3

Il mio problema era che il file era stato salvato come file UTF-8. Il salvataggio con Codepage 1252 ha risolto l'errore.


1
Scusa, è sbagliato. Tutto in WordPress è codificato UTF-8, Windows-1252 interromperà il sito nel momento in cui si utilizza un carattere non ASCII.
fuxia
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.