Desenvolvimento de plug-in WordPress - Cabeçalhos já enviados

15

Estou desenvolvendo plugins para WordPress. Quando ativo meu plug-in, recebo a seguinte mensagem:

O plug-in gerou 293 caracteres de saída inesperada durante a ativação. Se você notar mensagens de "cabeçalho já enviado", problemas com feeds de organização ou outros problemas, tente desativar ou remover este plug-in.

O plug-in está funcionando muito bem, mas não sei por que estou recebendo esta mensagem. Meu plugin é: http://wordpress.org/extend/plugins/facebook-send-like-button/

Eray
fonte
se a depuração estiver ativada, você poderá obtê-lo se o php emitir um aviso.
Milo
1
Verifique se você deixou algum espaço em branco após as tags php close no final dos arquivos php do plug-in.
Sisir
1
Se você estiver usando um depurador, coloque um ponto de interrupção no activate_plugin methodin wordpress/wp-admin/includes/plugin.php. O conteúdo da variável $ output mostrará os dados carregados na exceção sempre sendo lançados e, em seguida, ofuscados pelo wordpress.
Todd Holmberg

Respostas:

10

Meu palpite é que você recebe um erro de PHP, que gera saída antes do envio dos cabeçalhos. Se você tiver E_NOTICEativado, a chamada $_POST['foo']poderá gerar um erro "Aviso: variável indefinida" se essa variável não estiver definida.

Prática recomendada: nunca assuma nada sobre as variáveis ​​GET, POST, COOKIE e REQUEST. Sempre verifique primeiro usando isset()ou empty().

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

Isso geralmente é causado por espaços ou novas linhas antes da <?phpmarca de abertura ou após a ?>marca de fechamento .

Confira esta página para ver algumas soluções: Como resolver o problema de aviso dos cabeçalhos já enviados?

ATUALIZAR

Depois de examinar o código do plug-in, a única coisa que notei é que você não tem uma tag PHP de fechamento. Na última linha, adicione?>

Matthew Muro
fonte
4
Os arquivos PHP não precisam da ?>tag de fechamento . De fato, uma maneira de garantir que isso não causará Headers already sentproblemas é deixar de fora a marca de fechamento.
John P Bloch
2
Este foi o meu problema. Eu tinha um monte de linhas em branco após o meu fechamento ?>.
Cam Jackson
1
Não recomendamos o uso de uma tag PHP de fechamento. É uma prática ruim que leva ao tipo de problemas no OP e é contrária aos padrões de codificação do WP Core (consulte make.wordpress.org/core/handbook/best-practices/… )
butlerblog
4

No início da sua função de ativação, coloque um ob_start();e, no final, coloque umtrigger_error(ob_get_contents(),E_USER_ERROR);

Em seguida, tente ativar seu plug-in e poderá ver o que realmente são os ' 293 caracteres gerados de saída inesperada '. A partir daí, a depuração será mais fácil (remova os novos caracteres de linha ou resolva alguns erros).

lulalala
fonte
esta é realmente uma solução gênio para barbatanas o erro .. Obrigado ..
Obmerk Kronen
3

Eu já enfrentei o mesmo problema antes, para mim era um espaço em branco extra. Depois de remover todos esses espaços em branco, o plug-in pode ser ativado sem nenhum erro / aviso.

yashbinani
fonte
1

Não tenho certeza de que esse é o problema, mas tenho certeza disso.

Você precisa usar um retorno de chamada válido como o segundo argumento em register_activation_hook():

register_activation_hook(__FILE__,'twl_tablo_olustur');

Até onde eu sei, você não definiu em twl_tablo_olustur()lugar algum. Isso certamente explicaria a saída inesperada (erro do PHP gerado ao tentar chamar uma função inexistente) e explicaria por que funciona bem em todas as outras circunstâncias.

John P Bloch
fonte
obrigado. Mas register_activation_hook(__FILE__,'twl_tablo_olustur');esse código da versão antiga. Na nova versão (você pode verificar, v1.3), ela é atualizada, mas continua o mesmo erro.
Eray
1

Costumo receber essas mensagens muito quando estou enviando mensagens de depuração de plugins / temas, especialmente quando estou produzindo coisas antes que o wp_header seja chamado.

Se você estiver produzindo caracteres, acredito (pode estar errado aqui) que há uma declaração implícita de cabeçalho; portanto, quando a chamada normal de header () ocorre, você recebe o erro, pois não pode ter duas declarações de cabeçalho.

Você pode usar ob_start () para armazenar em buffer a saída, o que deve remover o erro - dê uma olhada nos comentários aqui: http://php.net/manual/en/function.header.php

anu
fonte
1

Eu sei que esta é uma pergunta antiga e tem uma resposta aceita. Há muitas respostas que cobrem qual poderia ser o problema de ativação . No entanto, nenhuma das respostas realmente chega ao problema principal de COMO depurar problemas com a ativação do plugin.

Se você estiver desenvolvendo plug-ins do WP, também poderá usar as ferramentas corretas para o trabalho. Uma delas é a barra de depuração . Este é um plugin que ajuda a depurar problemas no WP. Se você é desenvolvedor de plug-ins, ele deve estar na sua caixa de ferramentas.

A barra de depuração possui vários complementos - plugins para o plug-in, se você desejar. Uma delas é a ativação do plug-in da barra de depuração , que mostra o erro do PHP gerado quando o plug-in é ativado. Depois de saber qual é o erro do PHP que faz com que os cabeçalhos sejam enviados, você sabe para onde precisa corrigi-lo. Confie em mim, sabendo o que o erro é você pode economizar uma tonelada de tempo em vez de tentar descobrir o que o erro poderia ser .

butlerblog
fonte
Obrigado, isso é muito útil!
user1190132
0

Observando a última revisão do plug-in (381724), o problema é Demasiados espaços

toda vez que você deseja criar essa estrutura:

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

no seu código, use TAB e não espaços.

Aqui está o código em que substituí todos os espaços por tabulações e não recebo nenhuma mensagem na ativação:

<?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>';
}
Bainternet
fonte
2
Isso não deveria ter nada a ver com isso. Espaços e guias dentro de suas funções são aceitáveis ​​e não produzem esse erro.
Matthew Muro
dentro de uma função, você está correto, mas se a função gerar algo diretamente, por exemplo: function blabla(){?> <input> <?php code... ?> output something <?php code.. }então não é esse o caso.
Bainternet
2
@ MatthewMuro: se você deixar o espaço dentro de uma função, seu ok, mas se você deixar algum espaço em branco / linha após as tags de fechamento do php ?>, será possível obter header already send erroresses espaços em branco extras quando o mecanismo php a analisar.
Sisir
0

Você remove a tag fechar php (?>) Do final de cada arquivo. e também remover todo o espaço em branco após a tag fechar php (?>)

quando você ativar o plugin, basta verificar se a tabela já existe ou não.

eu removi o problema pelo código

    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);
    }
Mamunur Rashid
fonte
-3

Meu problema foi que o arquivo foi salvo como um arquivo UTF-8. Salvá-lo com a página de código 1252 resolveu o erro.

Shawn
fonte
1
Desculpe, isso está errado. Tudo no WordPress é codificado em UTF-8, o Windows-1252 quebrará o site no momento em que você usar um caractere não ASCII.
fuxia