Pengembangan Plugin WordPress - Header Sudah Mengirim Pesan


15

Saya sedang mengembangkan plugin WordPress. Ketika saya mengaktifkan plugin saya, saya menerima pesan berikut:

Plugin menghasilkan 293 karakter dari output tak terduga selama aktivasi. Jika Anda melihat pesan "header sudah terkirim", masalah dengan umpan sindikasi atau masalah lain, coba nonaktifkan atau hapus plugin ini.

Plugin ini berfungsi dengan baik tetapi saya tidak tahu mengapa saya menerima pesan ini. Plugin saya adalah: http://wordpress.org/extend/plugins/facebook-send-like-button/


jika debugging diaktifkan, Anda mungkin mendapatkan ini jika php mengeluarkan peringatan.
Milo

1
Periksa apakah Anda meninggalkan spasi kosong setelah tag penutup php di akhir file php plugin Anda.
Sisir

1
Jika Anda menggunakan debugger, lalu letakkan breakpoint di activate_plugin methoddalam wordpress/wp-admin/includes/plugin.php. Isi dari variabel $ output akan menunjukkan kepada Anda data yang dimuat ke dalam Pengecualian selalu dilemparkan, dan kemudian dikaburkan oleh wordpress.
Todd Holmberg

Jawaban:


10

Dugaan saya adalah Anda mendapatkan kesalahan PHP, yang menghasilkan output sebelum header dikirim. Jika Anda telah E_NOTICEmengaktifkan, panggilan $_POST['foo']dapat menghasilkan kesalahan "Pemberitahuan: variabel tidak terdefinisi" jika variabel itu tidak disetel.

Praktik terbaik: jangan pernah berasumsi tentang variabel GET, POST, COOKIE, dan REQUEST. Selalu periksa dulu menggunakan isset()atau empty().

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

13

Ini biasanya disebabkan oleh spasi atau baris baru sebelum <?phptag pembuka atau setelah ?>tag penutup .

Lihat halaman ini untuk melihat beberapa solusi: Bagaimana cara saya mengatasi Header yang sudah mengirim masalah peringatan?

MEMPERBARUI

Setelah memeriksa kode plugin Anda, satu hal yang saya perhatikan adalah Anda tidak memiliki tag PHP penutup. Di baris terakhir, tambahkan?>


4
File PHP tidak perlu ?>tag penutup . Bahkan, salah satu cara untuk menjamin bahwa itu tidak akan menyebabkan Headers already sentmasalah adalah dengan meninggalkan tag penutup.
John P Bloch

2
Ini masalah saya. Saya memiliki banyak garis kosong setelah penutupan ?>.
Cam Jackson

1
Jangan rekomendasikan menggunakan tag PHP penutup. Ini adalah praktik buruk yang mengarah pada jenis masalah dalam OP, dan itu bertentangan dengan standar pengkodean WP Core (lihat make.wordpress.org/core/handbook/best-practices/… )
butlerblog

4

Di awal fungsi aktivasi Anda beri tanda ob_start();dan pada akhirnya beri tanda atrigger_error(ob_get_contents(),E_USER_ERROR);

Kemudian coba aktifkan plugin Anda, dan Anda kemudian dapat melihat apa sebenarnya ' menghasilkan 293 karakter dari hasil yang tak terduga '. Sejak saat debugging ini akan lebih mudah (baik menghapus karakter baris baru atau menyelesaikan beberapa kesalahan).


ini sebenarnya solusi jenius untuk sirip kesalahan .. Terima kasih ..
Obmerk Kronen

3

Saya pernah menghadapi masalah yang sama sebelumnya, bagi saya itu adalah ruang ekstra putih. Setelah saya menghapus semua spasi putih plugin itu dapat diaktifkan tanpa kesalahan / peringatan.


1

Saya tidak yakin ini masalahnya, tapi saya cukup yakin.

Anda perlu menggunakan panggilan balik yang valid sebagai argumen kedua di register_activation_hook():

register_activation_hook(__FILE__,'twl_tablo_olustur');

Sejauh yang saya tahu, Anda belum menentukan di twl_tablo_olustur()mana pun. Ini tentu akan menjelaskan output yang tidak terduga (kesalahan PHP yang dihasilkan dari mencoba memanggil fungsi yang tidak ada), dan akan menjelaskan mengapa itu berfungsi dengan baik dalam semua keadaan lainnya.


Terima kasih. Tetapi register_activation_hook(__FILE__,'twl_tablo_olustur');kode ini dari versi lama. Dalam versi baru (Anda dapat memeriksa, v1.3) diperbarui, tetapi kesalahan masih sama.
Eray

1

Saya cenderung mendapatkan pesan-pesan ini banyak ketika saya mengeluarkan pesan plugin / tema debug, terutama ketika saya mengeluarkan barang-barang sebelum wp_header dipanggil.

Jika Anda mengeluarkan karakter apa pun, maka saya percaya (mungkin salah di sini) bahwa ada deklarasi tajuk implisit, jadi ketika panggilan tajuk normal () terjadi, Anda mendapatkan kesalahan karena Anda tidak dapat memiliki 2 deklarasi tajuk.

Anda dapat menggunakan ob_start () untuk buffer output, yang seharusnya menghapus kesalahan - lihat komentar di sini: http://php.net/manual/en/function.header.php


1

Saya tahu ini adalah pertanyaan lama dan memang ada jawaban yang diterima. Ada banyak jawaban yang mencakup apa masalah aktivasi bisa berpotensi menjadi. Namun, tidak ada jawaban yang benar-benar mendapatkan inti masalah BAGAIMANA untuk men-debug masalah dengan aktivasi plugin.

Jika Anda akan mengembangkan plugin WP, Anda juga dapat menggunakan alat yang benar untuk pekerjaan itu. Salah satunya adalah Debug Bar . Ini adalah plugin yang membantu Anda men-debug masalah di WP. Jika Anda seorang pengembang plugin, itu harus di kotak alat Anda.

Debug Bar memiliki sejumlah add-on - plugins untuk plugin, jika Anda mau. Salah satunya adalah Aktivasi Plugin Debug Bar , yang akan menunjukkan kepada Anda kesalahan PHP yang dihasilkan ketika plugin diaktifkan. Setelah Anda tahu apa kesalahan PHP yang menyebabkan tajuk dikirim, maka Anda tahu ke mana Anda harus mencari untuk memperbaikinya. Percayalah, mengetahui apa kesalahan yang dapat menghemat banyak waktu daripada mencoba untuk mencari tahu apa kesalahan bisa .


Terima kasih, ini sangat membantu!
user1190132

0

Melihat revisi terakhir dari plugin (381724) masalahnya adalah terlalu banyak ruang

setiap kali Anda ingin membuat struktur ini:

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

dalam kode Anda gunakan TAB dan bukan spasi.

Ini kode Anda tempat saya mengganti semua spasi dengan tab dan saya tidak mendapatkan pesan saat aktivasi:

<?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
Seharusnya tidak ada hubungannya dengan itu. Spasi dan tab di dalam fungsi Anda dapat diterima dan tidak menghasilkan kesalahan ini.
Matthew Muro

di dalam suatu fungsi Anda benar tetapi jika fungsi menghasilkan sesuatu secara langsung misalnya: function blabla(){?> <input> <?php code... ?> output something <?php code.. }maka itu tidak terjadi.
Bainternet

2
@ MatthewMuro: jika Anda meninggalkan ruang di dalam fungsi okey tetapi jika Anda meninggalkan spasi putih / garis istirahat setelah tag penutup php ?>maka Anda akan mendapatkan header already send errorkarena spasi ekstra putih akan dicetak ketika mesin php menguraikannya.
Sisir

0

Anda menghapus tag penutup php (?>) Dari akhir setiap file. dan juga menghapus semua ruang kosong setelah tag penutup php (?>)

ketika Anda mengaktifkan plugin cukup periksa apakah tabel sudah ada atau tidak.

saya menghapus masalah dengan kode

    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

Masalah saya adalah bahwa file tersebut disimpan sebagai file UTF-8. Menyimpannya dengan Codepage 1252 menyelesaikan kesalahan.


1
Maaf, itu salah. Semua yang ada di WordPress dikodekan UTF-8, Windows-1252 akan memecah situs saat Anda menggunakan karakter non-ASCII.
fuxia
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.