web-dev-qa-db-ja.com

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

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

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

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

13
Eray

私は、PHPエラーが発生したと考えています。このエラーは、ヘッダーが送信される前に出力を生成します。 E_NOTICEを有効にしている場合、その変数が設定されていないと$_POST['foo']を呼び出すと "Notice:undefined variable"エラーが発生する可能性があります。

ベストプラクティス:GET、POST、COOKIE、およびREQUEST変数については一切想定しないでください。必ず最初にisset()またはempty()を使って確認してください。

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

これは通常、開始<?phpタグの前または終了?>タグの後のスペースまたは改行によって引き起こされます。

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

UPDATE

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

13
Matthew Muro

アクティベーション関数の始めにob_start();を、最後にtrigger_error(ob_get_contents(),E_USER_ERROR);を入れてください。

それからプラグインを有効にしてみると、 ' 生成された293文字の予期しない出力 'が実際に何であるかがわかります。それ以降のデバッグでは、これがより簡単になります(改行文字を削除するか、いくつかのエラーを解決します)。

4
lulalala

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

3
yashbinani

私はこれが問題であることを肯定的ではありませんが、私はそれをかなり確信しています。

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

register_activation_hook(__FILE__,'twl_tablo_olustur');

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

1
John P Bloch

特にwp_headerが呼ばれる前にものを出力しているとき、私はプラグイン/テーマデバッグメッセージを出力しているとき私はこれらのメッセージをたくさん得る傾向があります。

文字を出力しているのであれば、暗黙のヘッダー宣言があると私は信じています(ここでは間違っているかもしれません)。通常のheader()呼び出しが発生すると、2つのヘッダー宣言がないのでエラーになります。

出力をバッファするためにob_start()を使用することができます、それはエラーを取り除くべきです - ここでコメントを見てください: http://php.net/manual/en/function.header.php

1
anu

プラグインの最後のリビジョン(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:[email protected]">mail me</a> for bugs, thanks.</em>

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

これは古い質問であり、回答が受け入れられていることは知っています。アクティベーションの問題の可能性をカバーする多くの回答があります。ただし、プラグインアクティベーションの問題をデバッグする方法の中心的な問題に答えがまったくありません。

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

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

0
butlerblog