WordPressプラグイン開発-ヘッダー送信済みメッセージ


15

WordPressプラグインを開発しています。プラグインをアクティブにすると、次のメッセージが表示されます。

プラグインは、アクティベーション中に予期しない出力の293文字を生成しました。「ヘッダーは既に送信されています」というメッセージ、シンジケーションフィードの問題、またはその他の問題に気づいた場合は、このプラグインを無効にするか削除してみてください。

プラグインは非常にうまく機能していますが、なぜこのメッセージが表示されるのかわかりません。私のプラグインは:http : //wordpress.org/extend/plugins/facebook-send-like-button/


デバッグが有効になっている場合、phpが警告を出力すると、これを取得できます。
ミロ

1
プラグインphpファイルの最後にあるphp終了タグの後に空白が残っているかどうかを確認します。
シシル

1
デバッガを使用している場合は、activate_plugin methodinにブレークポイントを配置しますwordpress/wp-admin/includes/plugin.php。$ output変数の内容は、例外にロードされたデータが常にスローされ、その後wordpressによって難読化されることを示します。
トッドホルムバーグ

回答:


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タグの前または終了?>タグの後のスペースまたは改行によって引き起こされます。

このページをチェックして、いくつかの解決策を確認してください。既に送信されたヘッダーの警告問題を解決するにはどうすればよいですか

更新

プラグインコードを調べた後、気づいた1つのことは、PHPの終了タグがないことです。最後の行に追加します?>


4
PHPファイルを閉じる必要はありません ?>タグ。実際、Headers already sent問題が発生しないことを保証する1つの方法は、終了タグを省略することです。
ジョンPブロッホ

2
これが私の問題でした。閉店後にたくさんの空白行がありました?>
カムジャクソン

1
PHPの終了タグを使用することはお勧めしません。OPのタイプの問題を引き起こすのは悪い習慣であり、WP Coreコーディング標準に反します(make.wordpress.org/core/handbook/best-practices/…を参照)
butlerblog

4

アクティベーション関数の最初にを置きob_start();、最後にtrigger_error(ob_get_contents(),E_USER_ERROR);

次に、プラグインをアクティブにしてみてください。そうすると、「生成された293文字の予期しない出力」が実際に何であるかを確認できます。それ以降のデバッグでは、これは簡単になります(改行文字を削除するか、エラーを解決します)。


これは実際にはエラーを解決するための天才的な解決策です。ありがとうございます。
Obmerk Kronen

3

以前にも同じ問題に直面していましたが、私にとっては余分な空白でした。これらの空白をすべて削除した後、エラー/警告なしでプラグインをアクティブにできました。


1

私はこれが問題だとは思っていませんが、それは確かです。

の2番目の引数として有効なコールバックを使用する必要がありますregister_activation_hook()

register_activation_hook(__FILE__,'twl_tablo_olustur');

私が知る限り、あなたはtwl_tablo_olustur()どこにも定義していません。これは、予期しない出力(存在しない関数を呼び出そうとすると生成されるPHPエラー)を確実に説明し、他のすべての状況で正常に機能する理由を説明します。


ありがとうございました。しかし、register_activation_hook(__FILE__,'twl_tablo_olustur');このコードは古いバージョンのものです。新しいバージョン(v1.3で確認できます)では更新されていますが、それでも同じエラーです。
-Eray

1

プラグイン/テーマのデバッグメッセージを出力しているとき、特にwp_headerが呼び出される前に何かを出力しているときは、これらのメッセージを頻繁に受け取る傾向があります。

文字を出力している場合、暗黙的なヘッダー宣言があると信じています(ここでは間違っている可能性があります)ので、通常のheader()呼び出しが発生すると、2つのヘッダー宣言を取得できないためエラーが発生します。

ob_start()を使用して出力をバッファリングすることができます。これにより、エラーが削除されます-http : //php.net/manual/en/function.header.phpのコメントをご覧ください。


1

これは古い質問であり、回答が受け入れられていることは知っています。アクティベーションの問題潜在的に何であるかをカバーする多くの答えがあります。ただし、HOWの中核的な問題に答えが出てこないプラグインのアクティベーションに関する問題をデバッグするため。

WPプラグインを開発する場合は、ジョブに適切なツールを使用することもできます。それらの1つはデバッグバーです。これは、WPの問題をデバッグするのに役立つプラグインです。プラグイン開発者の場合、ツールボックスにあるはずです。

デバッグバーには、プラグインのプラグイン(必要に応じて)のアドオンがいくつかあります。それらの1つはDebug Bar Plugin Activationです。これは、プラグインがアクティブになったときに生成されるPHPエラーを表示します。PHPエラーが原因でヘッダーが送信されることがわかったら、それを修正するためにどこを調べる必要があるかがわかります。、私を信頼し、エラーが何を知っている代わりにしようとするあなたの時間のトンを保存することができ、エラーが何であるかを理解することができ


ありがとう、これはとても助かります!
user1190132

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のタグ?>を閉じた後に空白/改行を残すと、PHP header already send errorエンジンが解析するときに余分な空白が出力されるため、取得できます。
シシル

0

すべてのファイルの終わりからphp終了タグ(?>)を削除します。また、php終了タグ(?>)の後のすべての空白スペースを削除します

プラグインをアクティブにするときは、テーブルが既に存在するかどうかを確認してください。

私はコードによって問題を削除しました

    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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.