การพัฒนาปลั๊กอิน WordPress - ส่วนหัวได้ส่งข้อความไปแล้ว


15

ฉันกำลังพัฒนาปลั๊กอิน WordPress เมื่อฉันเปิดใช้งานปลั๊กอินฉันได้รับข้อความต่อไปนี้:

ปลั๊กอินสร้างผลลัพธ์ 293 ตัวอักษรของผลลัพธ์ที่ไม่คาดคิดในระหว่างการเปิดใช้งาน หากคุณสังเกตเห็นข้อความ“ ส่วนหัวที่ส่งไปแล้ว” ปัญหาเกี่ยวกับฟีด Syndication หรือปัญหาอื่น ๆ ให้ลองปิดใช้งานหรือลบปลั๊กอินนี้

ปลั๊กอินทำงานได้ดีมาก แต่ฉันไม่รู้ว่าทำไมฉันถึงได้รับข้อความนี้ ปลั๊กอินของฉันคือ: http://wordpress.org/extend/plugins/facebook-send-like-button/


หากเปิดใช้งานการแก้ไขข้อบกพร่องคุณอาจได้รับสิ่งนี้หาก php แสดงคำเตือน
Milo

1
ตรวจสอบว่าคุณออกจากพื้นที่สีขาวหลังจากแท็กปิด php ที่ท้ายไฟล์ปลั๊กอิน php
Sisir

1
หากคุณกำลังใช้ดีบักแล้วใส่เบรกพอยต์ในรอบในactivate_plugin method wordpress/wp-admin/includes/plugin.phpเนื้อหาของตัวแปร $ output จะแสดงข้อมูลที่คุณโหลดลงในข้อยกเว้นที่จะถูกโยนทิ้งไปเรื่อย ๆ จากนั้นบีบอัดโดย wordpress
Todd Holmberg

คำตอบ:


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แท็กเปิดหรือหลัง?>แท็กปิด

ลองดูหน้านี้เพื่อดูวิธีแก้ไข: ฉันจะแก้ปัญหาส่วนหัวที่ส่งปัญหาการเตือนได้อย่างไร?

UPDATE

หลังจากตรวจสอบโค้ดปลั๊กอินของคุณแล้วสิ่งหนึ่งที่ฉันสังเกตเห็นคือคุณไม่มีแท็ก PHP ปิด ในบรรทัดสุดท้ายให้เพิ่ม?>


4
ไฟล์ PHP ไม่จำเป็นต้องมี?>แท็กปิด อันที่จริงวิธีหนึ่งที่จะรับประกันว่าจะไม่ทำให้เกิดHeaders already sentปัญหาคือการออกจากแท็กปิด
John P Bloch

2
นี่คือปัญหาของฉัน ฉันมีบรรทัดว่างมากมายหลังจากปิด?>แล้ว
Cam Jackson

1
ไม่แนะนำให้ใช้แท็ก PHP ปิด มันเป็นวิธีปฏิบัติที่ไม่ดีที่นำไปสู่ประเภทของปัญหาใน OP และมันขัดกับมาตรฐานการเข้ารหัส WP Core (ดูmake.wordpress.org/core/handbook/best-practices/ … )
butlerblog

4

ในจุดเริ่มต้นของฟังก์ชั่นการเปิดใช้งานของคุณใส่ a ob_start();และท้ายใส่trigger_error(ob_get_contents(),E_USER_ERROR);

จากนั้นลองเปิดใช้งานปลั๊กอินของคุณและจากนั้นคุณจะเห็นว่า ' สร้าง 293 ตัวอักษรของผลลัพธ์ที่ไม่คาดคิด ' คืออะไร จากนั้นการดีบั๊กจะง่ายขึ้น (ลบอักขระบรรทัดใหม่หรือแก้ไขข้อผิดพลาดบางอย่าง)


นี้เป็นจริงการแก้ปัญหาอัจฉริยะครีบข้อผิดพลาด .. ขอบคุณ ..
Obmerk Kronen

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) อัปเดตแล้ว แต่ยังคงมีข้อผิดพลาดเหมือนเดิม
Eray

1

ฉันมักจะได้รับข้อความเหล่านี้จำนวนมากเมื่อฉันแสดงข้อความการแก้ไขข้อบกพร่องปลั๊กอิน / ธีมโดยเฉพาะอย่างยิ่งเมื่อฉันแสดงผลข้อมูลก่อนที่จะเรียก wp_header

หากคุณกำลังส่งออกอักขระใด ๆ ฉันเชื่อว่า (อาจผิดที่นี่) ว่ามีการประกาศส่วนหัวโดยนัยดังนั้นเมื่อมีการเรียกส่วนหัวปกติ () เกิดขึ้นคุณจะได้รับข้อผิดพลาดเนื่องจากคุณไม่สามารถมี 2 การประกาศส่วนหัว

คุณสามารถใช้ ob_start () เพื่อบัฟเฟอร์เอาต์พุตซึ่งควรลบข้อผิดพลาด - ดูความคิดเห็นที่นี่: http://php.net/manual/en/function.header.php


1

ฉันรู้ว่านี่เป็นคำถามเก่าและมีคำตอบที่ยอมรับได้ มีจำนวนมากของคำตอบที่ครอบคลุมสิ่งที่เป็นปัญหาการเปิดใช้งานมีความสามารถที่อาจจะ อย่างไรก็ตามไม่มีคำตอบใด ๆ ที่ได้รับในประเด็นหลักของHOWในการดีบักปัญหาด้วยการเปิดใช้งานปลั๊กอิน

หากคุณกำลังจะพัฒนาปลั๊กอิน WP คุณอาจใช้เครื่องมือที่ถูกต้องสำหรับงาน หนึ่งในนั้นคือการดีบักบาร์ นี่คือปลั๊กอินที่ช่วยให้คุณแก้ปัญหาใน WP หากคุณเป็นนักพัฒนาปลั๊กอินควรอยู่ในกล่องเครื่องมือของคุณ

Debug Bar มีส่วนเสริมจำนวนหนึ่ง - ปลั๊กอินสำหรับปลั๊กอินหากคุณต้องการ หนึ่งในนั้นคือการเปิดใช้งาน Debug Bar Pluginซึ่งจะแสดงข้อผิดพลาด 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
ไม่ควรมีอะไรเกี่ยวข้องกับมัน ช่องว่างและแท็บในฟังก์ชั่นของคุณเป็นที่ยอมรับและไม่ก่อให้เกิดข้อผิดพลาดนี้
Matthew Muro

ภายในฟังก์ชั่นคุณถูกต้อง แต่ถ้าฟังก์ชั่นส่งออกบางสิ่งโดยตรงเช่น: function blabla(){?> <input> <?php code... ?> output something <?php code.. }นั่นไม่ใช่กรณี
Bainternet

2
@ MatewMuro: ถ้าคุณเว้นช่องว่างในฟังก์ชั่นมันก็โอเค แต่ถ้าคุณเว้นช่องว่าง / บรรทัดใด ๆ หลังจากแท็กปิด php ?>แล้วคุณจะได้รับheader already send errorเพราะช่องว่างสีขาวเหล่านั้นจะพิมพ์ออกมาเมื่อ php engine แยกวิเคราะห์
Sisir

0

คุณลบ php close tag (?>) ออกจากท้ายไฟล์ทุกไฟล์ และลบพื้นที่ว่างทั้งหมดหลังจากแท็กปิด 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 บันทึกด้วย Codepage 1252 แก้ไขข้อผิดพลาด


1
ขออภัยมันผิด ทุกอย่างใน WordPress นั้นถูกเข้ารหัสแบบ UTF-8 Windows-1252 จะแตกเว็บไซต์เมื่อคุณใช้อักขระที่ไม่ใช่ ASCII
fuxia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.