WordPress插件开发-邮件头已发送

时间:2011-05-06 作者:Eray

我正在开发WordPress插件。当我激活插件时,我收到以下消息:

该插件在激活期间生成了293个字符的意外输出。如果您注意到“headers ready sent”消息、联合提要问题或其他问题,请尝试停用或删除此插件。

这个插件运行得很好,但我不知道为什么我会收到这个消息。我的插件是:http://wordpress.org/extend/plugins/facebook-send-like-button/

10 个回复
最合适的回答,由SO网友:Geert 整理而成

我猜您会遇到一个PHP错误,它会在发送头之前生成输出。如果你有E_NOTICE 已启用,正在调用$_POST[\'foo\'] 如果未设置该变量,则可能会生成“通知:未定义变量”错误。

最佳实践:永远不要假设关于GET、POST、COOKIE和请求变量的任何内容。始终先使用检查isset()empty().

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

SO网友:Matthew Muro

这通常是由洞口之前的空格或新线引起的<?php 标记或结束后?> 标签

查看此页面以查看一些解决方案:How do I solve the Headers already sent warning problem?

UPDATE

在检查了插件代码之后,我注意到的一件事是,您没有结束PHP标记。在最后一行,添加?>

SO网友:lulalala

在激活函数的开头,输入ob_start(); 最后放一个trigger_error(ob_get_contents(),E_USER_ERROR);

然后尝试激活你的插件,然后你就可以看到“生成的293个字符的意外输出”到底是什么。从那时起,调试将更加容易(删除新行字符或解决一些错误)。

SO网友:yashbinani

我以前也遇到过同样的问题,对我来说,这是额外的空白。在我删除所有这些空白后,插件可以在没有任何错误/警告的情况下激活。

SO网友:John P Bloch

我不敢肯定这是个问题,但我很肯定。

您需要将有效回调用作中的第二个参数register_activation_hook():

register_activation_hook(__FILE__,\'twl_tablo_olustur\');
据我所知,你还没有定义twl_tablo_olustur() 在任何地方这当然可以解释意外的输出(尝试调用不存在的函数时产生的PHP错误),并解释为什么它在所有其他情况下都能正常工作。

SO网友:anu

当我输出插件/主题调试消息时,我常常会收到这些消息,尤其是当我在调用wp\\u头之前输出东西时。

如果您要输出任何字符,那么我认为(这里可能是错误的)有一个隐式头声明,因此当发生正常的header()调用时,您会得到错误,因为您不能有两个头声明。

您可以使用ob\\u start()来缓冲输出,这应该会删除错误-请查看此处的注释:http://php.net/manual/en/function.header.php

SO网友:butlerblog

我知道这是一个老问题,它确实有一个公认的答案。有很多答案涵盖了激活问题可能是什么。然而,没有一个答案真正触及HOW 调试插件激活问题。

如果你要开发WP插件,你也可以使用正确的工具来完成这项工作。其中之一是Debug Bar. 这是一个插件,可以帮助您调试WP中的问题。如果你是一个插件开发人员,它应该在你的工具箱中。

如果你愿意,调试栏上有许多插件插件。其中之一是Debug Bar Plugin Activation, 这将显示插件激活时生成的PHP错误。一旦您知道导致发送头的PHP错误是什么,那么您就知道需要在哪里进行更正。相信我,知道是什么错误is 可以为您节省大量时间,而不是试图找出错误所在could be.

SO网友:Bainternet

查看插件的最新版本(381724),问题是Too many spaces

每次要创建此结构时:

function blabla(){
   <= space
   something...
}
在代码中使用制表符,而不是空格。

这是您的代码,我将所有空格替换为选项卡,激活时未收到任何消息:

<?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>\';
}

SO网友:Mamunur Rashid

从每个文件的末尾删除php close标记(?>)。并删除php close标记(?>)后的所有空格

激活插件时,只需检查表是否已经存在。

我通过代码删除了该问题

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

SO网友:Shawn

我的问题是该文件保存为UTF-8文件。使用代码页1252保存它解决了该错误。

结束

相关推荐