The plugin generated xxx characters of unexpected

2019-02-06 03:58发布

问题:

This question already has an answer here:

  • The plugin generated X characters of unexpected output during activation (WordPress) 15 answers

I am creating WordPress plugin to display Total Twitter counter & Feed Subscriber. You can manage it via widget.

I am getting this error.

The plugin generated 123 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.

<?php
/*
 * Plugin Name: Twitter & RSS Stats
 * Version: 1.0
 * Plugin URI: http://sss.com/
 * Description: Facebook, Twitter & RSS Social Stats widget <a href="http://jessealtman.com/2009/06/08/tutorial-wordpress-28-widget-api/">tutorial</a>.
 * Author: Ajay Patel
 * Author URI: http://sss.com/
 */

addHeaderCode();
 function addHeaderCode() {

            echo '<link type="text/css" rel="stylesheet" href="' . get_bloginfo('wpurl') . '/wp-content/plugins/TRR_Stats/css/style.css" />' . "\n";    
            }


 /*******************************/
 /*     Create table            */
 /********************************/
function my_plugin_create_table()
{
        // do NOT forget this global
    global $wpdb;

    // this if statement makes sure that the table doe not exist already
    if($wpdb->get_var("show tables like TRR_Stats") != 'TRR_Stats') 
    {
        $sql = "CREATE TABLE TRR_Stats (
        id mediumint(9) NOT NULL,
        rss_email tinytext NOT NULL,
        twitter tinytext NOT NULL,
        rss tinytext NOT NULL,
        UNIQUE KEY id (id)
        );";
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
    }
}
// this hook will cause our creation function to run when the plugin is activated
register_activation_hook( __FILE__, 'my_plugin_create_table' );


class FTRWidget extends WP_Widget
{
    /**
    * Declares the FTRWidget class.
    *
    */
    function FTRWidget(){
        $widget_ops = array('classname' => 'widget_hello_world', 'description' => __( "Example widget demoing WordPress 2.8 widget API") );
        $control_ops = array('width' => 300, 'height' => 300);
        $this->WP_Widget('helloworld', __('Twitter & RSS Social Stats'), $widget_ops, $control_ops);
    }

    /**
    * Displays the Widget
    *
    */
    function widget($args, $instance){
        extract($args);
        $rss_email = empty($instance['rss_email']) ? 'webdesignergeeks' : $instance['rss_email'];
        $twitter = empty($instance['twitter']) ? 'webdesignergeek' : $instance['twitter'];
        $rss = empty($instance['rss']) ? 'webdesignergeeks' : $instance['rss'];


        # Featch Data from table
        global $wpdb;
        $item_info = $wpdb->get_row("SELECT * FROM TRR_Stats WHERE id=1;");
        $rss_email_f = $item_info->rss_email;

        $url = file_get_contents('https://feedburner.google.com/api/awareness/1.0/GetFeedData?uri=24thfloor');
        preg_match( '/circulation="(\d+)"/', $url, $matches );
        if ( $matches[1] )
        $rss_f = $matches[1] . " Subscribers";
        else
        echo "0";

        $twit = file_get_contents('http://twitter.com/users/show/'.$twitter.'.xml');
        preg_match( '/\<followers_count\>(\d+)\<\/followers_count\>/', $twit, $matches );
        if ( $matches[1] )
        $twitter_f = $matches[1] . " Followers";
        else
        $twitter_f = "0";



        echo '
            <div class="sidebarContainer" id="sidebarSubscribe">

            <a target="_blank" href="http://twitter.com/'.$twitter.'" class="subscribeSidebarBox" id="followTwitter">
                <span class="icon"><img src="'.get_bloginfo('url').'/wp-content/plugins/TRR_Stats/img/twitter.png" alt="Twitter" /></span>
                <span class="title">Follow Us on Twitter</span>
                <span class="count">'.$twitter_f.'+</span>
            </a>

            <a target="_blank" href="http://feeds.feedburner.com/'.$rss.'" class="subscribeSidebarBox" id="subscribeRSS">
                <span class="icon"><img src="'.get_bloginfo('url').'/wp-content/plugins/TRR_Stats/img/rss_feed.png" alt="RSS"/></span>
                <span class="title">Subscribe to our RSS feed</span>
                <span class="count">'.$rss_f.'+</span>
            </a>

            <a target="_blank" href="http://feedburner.google.com/fb/a/mailverify?uri='.$rss_email_f.'" class="subscribeSidebarBox" id="subscribeEmail">
                <span class="icon"><img src="'.get_bloginfo('url').'/wp-content/plugins/TRR_Stats/img/rss_email.png" alt="rss_email" /></span>

                <span class="title">Subscribe for updates via</span>
                <span class="count">EMAIL</span>
            </a>
        </div>';

        # After the widget
        echo $after_widget;
    }


    /**
    * Saves the widgets settings.
    *
    */
    function update($new_instance, $old_instance){
        $instance = $old_instance;
        $instance['rss_email'] = strip_tags(stripslashes($new_instance['rss_email']));
        $instance['twitter'] = strip_tags(stripslashes($new_instance['twitter']));
        $instance['rss'] = strip_tags(stripslashes($new_instance['rss']));

        global $wpdb;
            //Insert First time
            $wpdb->insert( 'TRR_Stats', array(
            'id'    => 1,
            'rss_email' => $instance['rss_email'], 
            'twitter' => $instance['twitter'],
            'rss' => $instance['rss']
            ) 
        );

        //Rest Update Data
        global $wpdb;
            $wpdb->update( 'TRR_Stats', 
            array( 
                'rss_email' => $instance['rss_email'], 
                'twitter' => $instance['twitter'],
                'rss' => $instance['rss']
            ),
            array(
                'id' => 1
            )

        );

        return $instance;
    }

    /**
    * Creates the edit form for the widget.
    *
    */
    function form($instance){
        //Defaults
        $instance = wp_parse_args( (array) $instance, array('rss_email'=>'', 'twitter'=>'engiguide', 'rss'=>'www.rss_email.com/engiguide') );

        $rss_email = htmlspecialchars($instance['rss_email']);
        $twitter = htmlspecialchars($instance['twitter']);
        $rss = htmlspecialchars($instance['rss']);

        # Output the options

        # Twitter
        echo '<p style="text-align:right;"><label for="' . $this->get_field_name('twitter') . '">' . ('Twitter:') . ' <input style="width: 200px;" id="' . $this->get_field_id('twitter') . '" name="' . $this->get_field_name('twitter') . '" type="text" value="' . $twitter . '" /></label></p>';
        echo '<p style="padding-left: 110;">i.e: webdesignergeeks</p>';
        # Rss
        echo '<p style="text-align:right;"><label for="' . $this->get_field_name('rss') . '">' . __('Rss:') . ' <input style="width: 200px;" id="' . $this->get_field_id('rss') . '" name="' . $this->get_field_name('rss') . '" type="text" value="' . $rss . '" /></label></p>';
        echo '<p style="padding-left: 110;">i.e: webdesignergeeks</p>';
        # Rss Email
        echo '<p style="text-align:right;"><label for="' . $this->get_field_name('rss_email') . '">' . ('Rss Email:') . ' <input style="width: 200px;" id="' . $this->get_field_id('rss_email') . '" name="' . $this->get_field_name('rss_email') . '" type="text" value="' . $rss_email . '" /></label></p>';
        echo '<p style="padding-left: 110;">i.e: webdesignergeeks</p>';

    }

}// END class

    /**
    * 
    * Calls 'widgets_init' action after the Hello World widget has been registered.
    */
    function TTRInit() {
    register_widget('FTRWidget');
    }   
    add_action('widgets_init', 'TTRInit');
?>

回答1:

Remove space from start of tags. remove addHeaderCode(); from top and add this code add_action('wp_head', 'addHeaderCode'); to your file after addHeaderCode() function. its definitely resolve your problem.



回答2:

I got extra "xxx" white spaces after the final php closing tag. Removed it and the warning is gone. Those white spaces were the "unexpected output".



回答3:

it was a UTF8 related issue. I converted it with Notepad++ in UTF8 but I had to conert it in "UTF8 (without BOM)". Now I don't have any notice.



回答4:

You should try this:

  1. remove white spaces
  2. run function plugin_error()
  3. in wp_config.php file set wp_DEBUG true , that will help you to see errors

This might help you.



回答5:

I don't think you should be sending any output in addHeaderCode(), this occurs far too early. See Actions Run During a Typical Request.

Instead, try hooking to wp_head to add your stylesheet, which should be triggered between <head>...</head>.



回答6:

Try wrapping the message with __() like __("Hello, world!") did the trick for me.



回答7:

You can remove update() function without this function it will work fine and will do same thing you are doing.



回答8:

I had the same issue with WooCommerce Smart Coupons plugin. I removed all extra new lines from plugin php files and saved them in "UTF8 (without BOM)" (as @Umaie Hamid mentioned). This fixed the issue.



回答9:

I've fixed this by removing the spaces in the code using the "edit plugin" in the WP admin. I think when WP save the changes it also does all the necessary settings like saving the file as UTF-8.



回答10:

I Was getting same error just remove white spacing in your code.