Phát triển plugin WordPress - Tiêu đề đã gửi tin nhắn


15

Tôi đang phát triển các plugin WordPress. Khi tôi kích hoạt plugin của mình, tôi nhận được thông báo sau:

Plugin tạo ra 293 ký tự đầu ra bất ngờ trong quá trình kích hoạt. Nếu bạn nhận thấy các tiêu đề của Wikipedia đã gửi tin nhắn, các vấn đề với nguồn cấp dữ liệu cung cấp hoặc các vấn đề khác, hãy thử tắt hoặc xóa plugin này.

Plugin đang hoạt động rất tốt nhưng tôi không biết tại sao tôi lại nhận được thông báo này. Plugin của tôi là: http://wordpress.org/extend/plugins/facebook-send-like-button/


nếu gỡ lỗi được bật, bạn có thể nhận được điều này nếu php đưa ra cảnh báo.
Milo

1
Kiểm tra xem bạn có để lại bất kỳ khoảng trắng nào sau khi đóng thẻ php ở cuối tệp php của plugin không.
Sisir

1
Nếu bạn đang sử dụng trình gỡ lỗi, sau đó đặt một điểm dừng xung quanh activate_plugin methodtrong wordpress/wp-admin/includes/plugin.php. Nội dung của biến $ output sẽ hiển thị cho bạn dữ liệu được tải vào Ngoại lệ luôn bị ném, và sau đó bị xáo trộn bởi wordpress.
Todd Holmberg

Câu trả lời:


10

Tôi đoán là bạn gặp lỗi PHP, tạo ra đầu ra trước khi các tiêu đề được gửi. Nếu bạn đã E_NOTICEbật, việc gọi $_POST['foo']có thể tạo ra lỗi "Thông báo: biến không xác định" nếu biến đó không được đặt.

Thực hành tốt nhất: không bao giờ giả định bất cứ điều gì về các biến GET, POST, COOKIE và YÊU CẦU. Luôn luôn kiểm tra đầu tiên bằng cách sử dụng isset()hoặc empty().

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

13

Điều này thường được gây ra bởi khoảng trắng hoặc dòng mới trước <?phpthẻ mở hoặc sau khi đóng?> thẻ .

Kiểm tra trang này để xem một số giải pháp: Làm cách nào để giải quyết vấn đề cảnh báo đã gửi?

CẬP NHẬT

Sau khi kiểm tra mã plugin của bạn, một điều tôi nhận thấy là bạn không có thẻ PHP đóng. Trên dòng cuối cùng, thêm?>


4
Các tệp PHP không cần ?>thẻ đóng . Trên thực tế, một cách để đảm bảo rằng nó sẽ không gây ra Headers already sentvấn đề là bỏ thẻ đóng.
John P Bloch

2
Đây là vấn đề của tôi. Tôi đã có một loạt các dòng trống sau khi đóng cửa ?>.
Cam Jackson

1
Không khuyến nghị sử dụng thẻ PHP đóng. Đó là một thực tiễn tồi dẫn đến loại sự cố trong OP và nó đi ngược lại với các tiêu chuẩn mã hóa WP Core (xem make.wordpress.org/core/handbook/best-practices/ rủi )
butlerblog

4

Khi bắt đầu chức năng kích hoạt của bạn, hãy đặt ob_start();và cuối cùng đặt mộttrigger_error(ob_get_contents(),E_USER_ERROR);

Sau đó thử kích hoạt plugin của bạn và sau đó bạn có thể thấy ' 293 ký tự đầu ra không mong muốn ' thực sự là gì. Từ đó, việc gỡ lỗi này sẽ dễ dàng hơn (loại bỏ các ký tự dòng mới hoặc giải quyết một số lỗi).


đây thực sự là một giải pháp thiên tài để khắc phục lỗi .. Cảm ơn ..
Obmerk Kronen

3

Tôi đã phải đối mặt với cùng một vấn đề trước đây, đối với tôi đó là khoảng trắng thêm. Sau khi tôi xóa tất cả các khoảng trắng đó, plugin có thể kích hoạt mà không có bất kỳ lỗi / cảnh báo nào.


1

Tôi không tích cực đây là vấn đề, nhưng tôi khá chắc chắn về nó.

Bạn cần sử dụng một cuộc gọi lại hợp lệ làm đối số thứ hai trong register_activation_hook():

register_activation_hook(__FILE__,'twl_tablo_olustur');

Theo như tôi có thể nói, bạn chưa xác định ở twl_tablo_olustur()bất cứ đâu. Điều này chắc chắn sẽ giải thích đầu ra bất ngờ (lỗi PHP được tạo ra từ việc cố gắng gọi một hàm không tồn tại) và sẽ giải thích lý do tại sao nó hoạt động tốt trong tất cả các trường hợp khác.


cảm ơn bạn. Nhưng register_activation_hook(__FILE__,'twl_tablo_olustur');mã này từ phiên bản cũ. Trong phiên bản mới (bạn có thể kiểm tra, v1.3) nó đã được cập nhật nhưng vẫn bị lỗi tương tự.
Xóa

1

Tôi có xu hướng nhận được các tin nhắn này rất nhiều khi tôi xuất các thông báo gỡ lỗi plugin / chủ đề, đặc biệt là khi tôi xuất nội dung trước khi wp_header được gọi.

Nếu bạn xuất bất kỳ ký tự nào, thì tôi tin rằng (có thể sai ở đây) rằng có một khai báo tiêu đề ngầm, vì vậy khi cuộc gọi tiêu đề () bình thường xảy ra, bạn sẽ gặp lỗi vì bạn không thể có 2 khai báo tiêu đề.

Bạn có thể sử dụng ob_start () để đệm đầu ra, việc này sẽ loại bỏ lỗi - hãy xem các nhận xét tại đây: http://php.net/manual/en/feft.header.php


1

Tôi biết đây là một câu hỏi cũ và nó có một câu trả lời được chấp nhận. Có rất nhiều câu trả lời bao gồm những gì vấn đề kích hoạt có thể xảy ra. Tuy nhiên, không có câu trả lời nào thực sự có được ở vấn đề cốt lõi của CÁCH để gỡ lỗi các vấn đề với kích hoạt plugin.

Nếu bạn định phát triển plugin WP, bạn cũng có thể sử dụng các công cụ chính xác cho công việc. Một trong số đó là Debug Bar . Đây là một plugin giúp bạn gỡ lỗi các vấn đề trong WP. Nếu bạn là một nhà phát triển plugin, nó sẽ nằm trong hộp công cụ của bạn.

Thanh Debug có một số tiện ích bổ sung - plugin cho plugin, nếu bạn muốn. Một trong số đó là Kích hoạt Plugin Debug Bar , sẽ hiển thị cho bạn lỗi PHP được tạo khi plugin kích hoạt. Một khi bạn biết lỗi PHP là gì khiến các tiêu đề được gửi đi, thì bạn sẽ biết bạn cần tìm ở đâu để sửa nó. Tin tôi đi, biết lỗi là gì có thể giúp bạn tiết kiệm rất nhiều thời gian thay vì cố gắng tìm ra lỗi có thể là gì .


Cảm ơn bạn, điều này rất hữu ích!
dùng1190132

0

Nhìn vào bản sửa đổi cuối cùng của plugin (381724), vấn đề là quá nhiều khoảng trống

mỗi khi bạn muốn tạo cấu trúc này:

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

trong mã của bạn sử dụng TAB và không phải khoảng trắng.

Đây là mã của bạn nơi tôi đã thay thế tất cả các khoảng trắng bằng các tab và tôi không nhận được bất kỳ thông báo nào khi kích hoạt:

<?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
Điều đó không nên có bất cứ điều gì để làm với nó. Không gian và các tab bên trong các chức năng của bạn được chấp nhận và không tạo ra lỗi này.
Matthew Muro

bên trong một hàm bạn đúng nhưng nếu hàm xuất ra một cái gì đó trực tiếp, ví dụ: function blabla(){?> <input> <?php code... ?> output something <?php code.. }thì đó không phải là trường hợp.
BaiNET

2
@MatthewMuro: nếu bạn để khoảng trống bên trong một hàm okey của nó nhưng nếu bạn để lại bất kỳ dấu ngắt / khoảng trắng nào sau các thẻ đóng php ?>thì bạn sẽ nhận được header already send errorvì các khoảng trắng thừa đó sẽ in ra khi công cụ php phân tích cú pháp.
Sisir

0

Bạn xóa thẻ đóng php (?>) Từ cuối mỗi tệp. và cũng xóa tất cả khoảng trống sau thẻ đóng php (?>)

Khi bạn kích hoạt plugin, chỉ cần kiểm tra xem bảng đã tồn tại hay chưa.

tôi đã loại bỏ vấn đề bằng mã

    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

Vấn đề của tôi là tệp đã được lưu dưới dạng tệp UTF-8. Lưu nó với Codepage 1252 đã giải quyết lỗi.


1
Xin lỗi, điều đó sai. Mọi thứ trong WordPress đều được mã hóa UTF-8, Windows-1252 sẽ phá vỡ trang web ngay khi bạn sử dụng ký tự không phải ASCII.
fuxia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.