Розробка плагіну WordPress - заголовки вже надіслані


15

Я розробляю плагіни WordPress. Коли я активую свій плагін, я отримую таке повідомлення:

Під час активації плагін генерував 293 символи несподіваного виводу. Якщо ви помітили повідомлення "заголовки вже надіслані", проблеми з каналами синдикації або інші проблеми, спробуйте вимкнути або вилучити цей плагін.

Плагін працює дуже добре, але я не знаю, чому я отримую це повідомлення. Мій плагін: http://wordpress.org/extend/plugins/facebook-send-like-button/


якщо налагодження включено, ви можете отримати це, якщо php виведе попередження.
Міло

1
Перевірте, чи залишилося пробіл після тегів закриття php в кінці файлів PHP-плагіну.
Сісір

1
Якщо ви використовуєте налагоджувач, то поставте точку перерви activate_plugin methodв wordpress/wp-admin/includes/plugin.php. Зміст змінної $ $ покаже вам дані, завантажені у виняток, незмінно викинуті, а потім затуманені wordpress.
Тодд Холмберг

Відповіді:


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тегом або після закриття?> тега .

Перегляньте цю сторінку, щоб побачити деякі рішення: Як вирішити проблему із надісланими заголовками попередження?

ОНОВЛЕННЯ

Вивчивши ваш плагін-коду, одне, що я помітив, - це те, що у вас немає закритого тегу PHP. В останньому рядку додайте?>


4
Файли PHP не потребують ?>тега закриття . Насправді, одним із способів гарантувати, що це не спричинить Headers already sentпроблеми, є залишити закриваючий тег.
Джон П Блох

2
Це було моє питання. У мене після закриття була купа порожніх рядків ?>.
Cam Jackson

1
Не рекомендуйте використовувати закриваючий тег PHP. Це погана практика, яка призводить до проблем в ОП, і суперечить стандартам кодування WP Core (див. Make.wordpress.org/core/handbook/best-practices/… )
butlerblog

4

На початку вашої функції активації поставте a ob_start(); а в кінці поставте atrigger_error(ob_get_contents(),E_USER_ERROR);

Потім спробуйте активувати свій плагін, і ви зможете побачити, що насправді є " генерованими 293 символами несподіваного виводу ". З цього моменту налагодження буде простіше (або видаліть нові символи рядка, або усуньте деякі помилки).


це насправді геніальне рішення для виправлення помилки .. Дякую ..
Обмерк Кронен

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) вона оновлена, але все-таки помилка.
Ерай

1

Я схильний отримувати ці повідомлення дуже часто, коли я вивожу повідомлення про налагодження плагінів / теми, особливо коли я вивожу речі до того, як wp_header буде викликаний.

Якщо ви виводите будь-які символи, то я вважаю, що тут може бути помилково, що існує неявна декларація заголовка, тож коли відбувається звичайний виклик заголовка (), ви отримуєте помилку, оскільки у вас не може бути 2 оголошень заголовка.

Ви можете використовувати ob_start () для буфера виводу, який повинен усунути помилку - подивіться коментарі тут: http://php.net/manual/en/function.header.php


1

Я знаю, що це старе питання, і на нього є прийнята відповідь. Є багато відповідей, які висвітлюють те, що потенційно може бути проблемою активації . Однак жоден з відповідей насправді не отримує основної проблеми HOW для налагодження проблем із активацією плагіна.

Якщо ви збираєтеся розробляти плагіни WP, ви можете також використовувати правильні інструменти для роботи. Одним з таких є Бар налагодження . Це плагін, який допомагає налагоджувати проблеми в WP. Якщо ви розробник плагінів, він повинен бути у вашій панелі інструментів.

На панелі налагодження є декілька доповнень - плагінів для плагіна, якщо ви хочете. Однією з таких є активація плагіну налагодження для налагодження , яка покаже вам помилку PHP, що виникає при активації плагіна. Як тільки ви дізнаєтеся, що таке помилка PHP, яка викликає надсилання заголовків, знаєте, куди потрібно шукати, щоб виправити це. Повірте, знаючи, що таке помилка , ви можете заощадити багато часу, а не намагатися зрозуміти, що може бути за помилку .


Дякую, це дуже корисно!
користувач1190132

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
Це не повинно мати нічого спільного. Пробіли та вкладки всередині ваших функцій є прийнятними і не призводять до цієї помилки.
Матвій Муро

всередині функції ви праві, але якщо функція виводить щось безпосередньо, наприклад: function blabla(){?> <input> <?php code... ?> output something <?php code.. }тоді це не так.
Bainternet

2
@MatthewMuro: якщо ви залишите простір усередині функції, її все в порядку, але якщо ви залишите пробіл / пробіл рядків після тегів закриття php, ?>тоді ви отримаєте, header already send errorтому що ці додаткові пробіли будуть роздруковуватися, коли php engine розбирає його.
Сісір

0

Ви видаляєте тег закриття php (?>) З кінця кожного файлу. а також видаліть все порожнє місце після тега закриття 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.
фуксія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.