Développement de plugins WordPress - En-têtes déjà envoyés Message

15

Je développe des plugins WordPress. Lorsque j'active mon plugin, je reçois le message suivant:

Le plugin a généré 293 caractères de sortie inattendue lors de l'activation. Si vous remarquez des messages «en-têtes déjà envoyés», des problèmes avec les flux de syndication ou d'autres problèmes, essayez de désactiver ou de supprimer ce plugin.

Le plugin fonctionne très bien mais je ne sais pas pourquoi je reçois ce message. Mon plugin est: http://wordpress.org/extend/plugins/facebook-send-like-button/

Eray
la source
si le débogage est activé, vous pourriez l'obtenir si php a émis un avertissement.
Milo
1
Vérifiez si vous avez laissé un espace blanc après les balises de fermeture php à la fin de vos fichiers php de plugin.
Sisir
1
Si vous utilisez un débogueur, puis mettre un point d' arrêt autour de l' activate_plugin methoden wordpress/wp-admin/includes/plugin.php. Le contenu de la variable $ output vous montrera les données chargées dans l'exception invariablement levées, puis obscurcies par wordpress.
Todd Holmberg

Réponses:

10

Je suppose que vous obtenez une erreur PHP, qui génère une sortie avant l'envoi des en-têtes. Si vous l'avez E_NOTICEactivé, l'appel $_POST['foo']peut générer une erreur "Remarque: variable non définie" si cette variable n'est pas définie.

Meilleure pratique: ne supposez jamais rien sur les variables GET, POST, COOKIE et REQUEST. Vérifiez toujours d'abord en utilisant isset()ou empty().

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

Cela est généralement causé par des espaces ou de nouvelles lignes avant la <?phpbalise d' ouverture ou après la ?>balise de fermeture .

Consultez cette page pour voir quelques solutions: Comment résoudre le problème d'avertissement des en-têtes déjà envoyés?

MISE À JOUR

Après avoir examiné le code de votre plugin, la seule chose que j'ai remarquée est que vous n'avez pas de balise PHP de fermeture. Sur la dernière ligne, ajoutez?>

Matthew Muro
la source
4
Les fichiers PHP n'ont pas besoin de la ?>balise de fermeture . En fait, une façon de garantir que cela ne causera pas de Headers already sentproblèmes est de laisser la balise de fermeture.
John P Bloch
2
C'était mon problème. J'ai eu un tas de lignes blanches après ma fermeture ?>.
Cam Jackson
1
Ne recommande pas d'utiliser une balise PHP de fermeture. C'est une mauvaise pratique qui conduit au type de problèmes dans l'OP, et cela va à l'encontre des normes de codage WP Core (voir make.wordpress.org/core/handbook/best-practices/… )
butlerblog
4

Au début de votre fonction d'activation, mettez un ob_start();et à la fin mettez untrigger_error(ob_get_contents(),E_USER_ERROR);

Ensuite, essayez d'activer votre plugin, et vous pourrez alors voir ce que sont réellement les « 293 caractères générés d'une sortie inattendue ». À partir de là, le débogage sera plus facile (supprimez les nouveaux caractères de ligne ou résolvez certaines erreurs).

lulalala
la source
c'est en fait une solution géniale pour corriger l'erreur .. Merci ..
Obmerk Kronen
3

J'ai déjà rencontré le même problème, pour moi, c'était un espace blanc supplémentaire. Après avoir supprimé tous ces espaces blancs, le plugin pourrait s'activer sans aucune erreur / avertissement.

yashbinani
la source
1

Je ne suis pas certain que c'est le problème, mais j'en suis presque sûr.

Vous devez utiliser un rappel valide comme deuxième argument dans register_activation_hook():

register_activation_hook(__FILE__,'twl_tablo_olustur');

Pour autant que je sache, vous n'avez défini twl_tablo_olustur()nulle part. Cela expliquerait certainement la sortie inattendue (erreur PHP générée en essayant d'appeler une fonction inexistante), et expliquerait pourquoi cela fonctionne bien dans toutes les autres circonstances.

John P Bloch
la source
Merci. Mais register_activation_hook(__FILE__,'twl_tablo_olustur');ce code de l'ancienne version. Dans la nouvelle version (vous pouvez vérifier, v1.3), elle est mise à jour, mais toujours la même erreur.
Eray
1

J'ai tendance à recevoir ces messages beaucoup lorsque je génère des messages de débogage de plugin / thème, en particulier lorsque je génère des éléments avant que wp_header ne soit appelé.

Si vous générez des caractères, je pense (peut-être que c'est faux ici) qu'il y a une déclaration d'en-tête implicite, donc lorsque l'appel normal de header () se produit, vous obtenez l'erreur car vous ne pouvez pas avoir 2 déclarations d'en-tête.

Vous pouvez utiliser ob_start () pour tamponner la sortie, ce qui devrait supprimer l'erreur - consultez les commentaires ici: http://php.net/manual/en/function.header.php

anu
la source
1

Je sais que c'est une vieille question et qu'elle a une réponse acceptée. Il y a beaucoup de réponses qui couvrent ce que pourrait être le problème d'activation . Cependant, aucune des réponses n'aborde vraiment le problème central de COMMENT déboguer les problèmes d'activation du plugin.

Si vous allez développer des plugins WP, vous pouvez aussi utiliser les bons outils pour le travail. L'un d'eux est la barre de débogage . Il s'agit d'un plugin qui vous aide à déboguer les problèmes dans WP. Si vous êtes un développeur de plugins, il devrait être dans votre boîte à outils.

La barre de débogage a un certain nombre de modules complémentaires - des plugins pour le plugin, si vous voulez. L'une d'entre elles est l' activation du plugin de la barre de débogage , qui vous montrera l'erreur PHP générée lors de l'activation du plugin. Une fois que vous savez quelle est l'erreur PHP qui provoque l'envoi des en-têtes, vous savez où vous devez chercher pour la corriger. Croyez - moi, en sachant ce que l'erreur est peut vous faire économiser une tonne de temps au lieu d'essayer de comprendre ce que l'erreur pourrait être .

butlerblog
la source
Merci, c'est très utile!
user1190132
0

En regardant la dernière révision du plugin (381724) le problème est Trop d'espaces

chaque fois que vous souhaitez créer cette structure:

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

dans votre code, utilisez TAB et non les espaces.

Voici votre code où j'ai remplacé tous les espaces par des tabulations et je ne reçois aucun message lors de l'activation:

<?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:[email protected]">mail me</a> for bugs, thanks.</em>

    <?php
    echo '</div>';
}
Bainternet
la source
2
Cela ne devrait rien avoir à voir avec ça. Les espaces et les tabulations à l'intérieur de vos fonctions sont acceptables et ne produisent pas cette erreur.
Matthew Muro
à l'intérieur d'une fonction, vous avez raison, mais si la fonction génère quelque chose directement, par exemple: function blabla(){?> <input> <?php code... ?> output something <?php code.. }alors ce n'est pas le cas.
Bainternet
2
@MatthewMuro: si vous laissez l'espace à l'intérieur d'une fonction, c'est correct mais si vous laissez un espace blanc / saut de ligne après la fermeture des balises php, ?>vous obtiendrez header already send errorcar ces espaces blancs supplémentaires s'imprimeront lorsque le moteur php les analysera.
Sisir
0

Vous supprimez la balise de fermeture php (?>) À la fin de chaque fichier. et également supprimer tout l'espace vide après la balise de fermeture php (?>)

lorsque vous activez le plugin, vérifiez simplement si la table existe déjà ou non.

j'ai supprimé le problème par le code

    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);
    }
Mamunur Rashid
la source
-3

Mon problème était que le fichier était enregistré en tant que fichier UTF-8. L'enregistrer avec Codepage 1252 a résolu l'erreur.

Shawn
la source
1
Désolé, c'est faux. Tout dans WordPress est encodé en UTF-8, Windows-1252 cassera le site au moment où vous utilisez un caractère non ASCII.
fuxia