admin管理员组

文章数量:1414938

I'm developing WordPress plugins. When I activate my plugin, I'm getting the following message:

The plugin generated 293 characters of unexpected output during activation. If you notice “headers already sent” messages, problems with syndication feeds or other issues, try deactivating or removing this plugin.

The plugin is working very well but I don't know why I'm getting this message. My plugin is : /

I'm developing WordPress plugins. When I activate my plugin, I'm getting the following message:

The plugin generated 293 characters of unexpected output during activation. If you notice “headers already sent” messages, problems with syndication feeds or other issues, try deactivating or removing this plugin.

The plugin is working very well but I don't know why I'm getting this message. My plugin is : http://wordpress/extend/plugins/facebook-send-like-button/

Share Improve this question edited May 14, 2019 at 17:18 butlerblog 5,1213 gold badges28 silver badges44 bronze badges asked May 6, 2011 at 13:23 ErayEray 4452 gold badges5 silver badges19 bronze badges 3
  • if debugging is enabled, you might get this if php outputted a warning. – Milo Commented May 6, 2011 at 13:46
  • 1 Check if you left any white space after php close tags at the end of your plugin php files. – Sisir Commented Dec 26, 2011 at 9:16
  • 1 If you are using a debugger, then put a breakpoint around in the activate_plugin method in wordpress/wp-admin/includes/plugin.php. The content of the $output variable will show you the data loaded into the Exception invariably being thrown, and then obfuscated by wordpress. – Todd Holmberg Commented Feb 1, 2017 at 22:07
Add a comment  | 

10 Answers 10

Reset to default 10

My guess is you get a PHP error, which generates output before the headers are sent. If you have E_NOTICE enabled, calling $_POST['foo'] may generate a "Notice: undefined variable" error if that variable is not set.

Best practice: never assume anything about GET, POST, COOKIE and REQUEST variables. Always check first using isset() or empty().

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

This is typically caused by spaces or new lines before the opening <?php tag or after the closing ?> tag.

Check out this page to see some solutions: How do I solve the Headers already sent warning problem?

UPDATE

After examining your plugin code, the one thing I noticed is that you don't have a closing PHP tag. On the last line, add ?>

In the beginning of your activation function put a ob_start(); and at the end put a trigger_error(ob_get_contents(),E_USER_ERROR);

Then try activating your plugin, and you can then see what the 'generated 293 characters of unexpected output' really are. From then on debugging this will be easier (either remove new line characters or resolve some errors).

I have faced the same problem before, for me it was extra white space. After I removed all those white spaces the plugin could activate without any error/warning.

I know this is an old question and it does have an accepted answer. There are a lot of answers that cover what the activation issue could potentially be. However, none of the answers really get at the core issue of HOW to debug issues with plugin activation.

If you're going to develop WP plugins, you may as well use the correct tools for the job. One of those is the Debug Bar. This is a plugin that helps you debug issues in WP. If you are a plugin developer, it should be in your toolbox.

The Debug Bar has a number of add-ons - plugins for the plugin, if you will. One of those is Debug Bar Plugin Activation, which will show you the PHP error generated when the plugin activates. Once you know what the PHP error is that causes the headers to be sent, then you know where you need to look to correct it. Trust me, knowing what the error is can save you a ton of time instead of trying to figure out what the error could be.

I'm not positive this is the problem, but I'm pretty sure of it.

You need to use a valid callback as the second argument in register_activation_hook():

register_activation_hook(__FILE__,'twl_tablo_olustur');

As far as I can tell, you haven't defined twl_tablo_olustur() anywhere. This would certainly explain the unexpected output (PHP error generated from trying to call a non-existent function), and would explain why it works fine in all other circumstances.

I tend to get these messages a lot when I'm outputting plugin / theme debug messages, especially when I'm outputting stuff before wp_header gets called.

If you're outputting any characters, then I believe (could be wrong here) that there's an implicit header declaration, so when the normal header() call occurs, you get the error as you can't have 2 header declarations.

You can use ob_start() to buffer the output, which should remove the error - have a look at the comments here: http://php/manual/en/function.header.php

Looking at the last revision of the plugin (381724) the problem is Too many spaces

every time you want to create this structure:

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

in your code use TAB and not spaces.

Here is you code where i replaced all spaces with tabs and i do not get any messages at activation:

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

wp_register_script('fgb_script', "http://connect.facebook/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/extend/plugins/facebook-send-like-button/">vote</a> .
    Author : <a href="http://www.teknoblogo">Eray Alakese</a>
    You can <a href="mailto:[email protected]">mail me</a> for bugs, thanks.</em>

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

You remove the php close tag ( ?> ) from end of every file. and also remove all blank space after php close tag ( ?> )

when you activate the plugin just check if table already exist or not .

i removed the issue by the 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);
    }

My issue was that the file was saved as a UTF-8 file. Saving it with Codepage 1252 resolved the error.

本文标签: WordPress Plugin DevelopmentHeaders Already Sent Message