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


15

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

该插件在激活期间生成了293个字符的意外输出。如果您发现“标题已发送”消息,联合供稿问题或其他问题,请尝试停用或删除此插件。

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


如果启用了调试,如果php输出警告,则可能会得到此提示。
米洛

1
检查插件php文件末尾的php close标记后是否留有空白。
西西尔

1
如果您在使用调试器,然后把一个断点围在activate_plugin methodwordpress/wp-admin/includes/plugin.php。$ output变量的内容将向您显示加载到Exception中的数据总是被抛出,然后被wordpress混淆。
Todd Holmberg '02

Answers:


10

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

最佳实践:永远不要假设任何有关GET,POST,COOKIE和REQUEST变量的信息。请务必先使用isset()或检查empty()

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

13

这通常是由开始<?php标签之前或结束?>标签之后的空格或换行引起的。

签出此页面以查看一些解决方案:如何解决标头已发送的警告问题?

更新

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


4
PHP文件不需要结束?>标记。实际上,一种保证不会引起Headers already sent问题的方法是省略结束标记。
约翰·布洛赫

2
这是我的问题。我结账后有一堆空白行?>
坎·杰克逊

1
不建议使用封闭的PHP标记。这是一个不好的做法,导致在OP问题的类型,它会违背WP核心编码标准(见make.wordpress.org/core/handbook/best-practices/...
butlerblog

4

在激活函数的开头放置a ob_start();,最后放置atrigger_error(ob_get_contents(),E_USER_ERROR);

然后尝试激活您的插件,然后您可以看到“ 生成的293个意外输出字符 ”的真正含义。从那时起,调试将变得更加容易(删除换行符或解决一些错误)。


这实际上是
找出

3

我以前也遇到过同样的问题,对我来说,这是多余的空白。在删除所有这些空白之后,插件可以激活而不会出现任何错误/警告。


1

我不是很肯定这是问题所在,但是我很确定。

您需要使用有效的回调作为第二个参数register_activation_hook()

register_activation_hook(__FILE__,'twl_tablo_olustur');

据我所知,您尚未定义twl_tablo_olustur()任何地方。这肯定可以解释意外的输出(试图调用不存在的函数会产生PHP错误),并且可以解释为什么它在所有其他情况下都能正常工作。


谢谢。但是register_activation_hook(__FILE__,'twl_tablo_olustur');这段代码来自旧版本。在新版本(您可以检查v1.3)中,它已更新,但仍然是相同的错误。
伊莱

1

在输出插件/主题调试消息时,尤其是在wp_header被调用之前输出内容时,我往往会收到很多这些消息。

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

您可以使用ob_start()缓冲输出,这应该消除错误-在此处查看注释:http : //php.net/manual/en/function.header.php


1

我知道这是一个老问题,确实有一个可以接受的答案。有很多答案涵盖了激活问题可能是什么。但是,没有一个真正的答案是如何调试插件激活问题的核心问题。

如果要开发WP插件,则最好使用正确的工具来完成工作。其中之一是“ 调试栏”。这是一个插件,可帮助您调试WP中的问题。如果您是插件开发人员,则应在工具箱中。

调试栏上有许多附加组件-插件插件(如果有)。其中之一是Debug Bar Plugin Activation,它将显示插件激活时生成的PHP错误。一旦知道导致标题发送的PHP错误是什么,就知道需要在哪里纠正它了。相信我,知道错误什么可以节省大量时间,而不是试图找出错误的可能


谢谢,这是非常有帮助的!
user1190132 '19

0

查看插件的最新版本(381724),问题是空间太多

每次您要创建此结构时:

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

在您的代码中使用TAB而不是空格。

这是您的代码,其中我用制表符替换了所有空格,并且在激活时未收到任何消息:

<?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
那不应该有任何关系。函数内部的空格和制表符是可以接受的,并且不会产生此错误。
马修·穆罗

在函数内部,您是正确的,但是如果函数直接输出某些内容,例如:function blabla(){?> <input> <?php code... ?> output something <?php code.. }则不是这样。
Bainternet

2
@MatthewMuro:如果您在函数内部保留空格,但是如果在php关闭标签后留下任何空格/换行符,?>那么您会得到,header already send error因为当php引擎解析它时,这些多余的空格会打印出来。
西西尔(Sisir)

0

您从每个文件的末尾删除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);
    }

-3

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


1
对不起,那是错的。WordPress中的所有内容都是UTF-8编码的,一旦您使用非ASCII字符,Windows-1252就会破坏该站点。
fuxia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.