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

15

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

Плагин генерировал 293 символа неожиданного вывода во время активации. Если вы заметили сообщения «заголовки уже отправлены», проблемы с каналами синдикации или другие проблемы, попробуйте деактивировать или удалить этот плагин.

Плагин работает очень хорошо, но я не знаю, почему я получаю это сообщение. Мой плагин: http://wordpress.org/extend/plugins/facebook-send-like-button/

Эрай
источник
если отладка включена, вы можете получить это, если php выдает предупреждение.
Майло
1
Проверьте, не оставили ли вы пустые места после php-тегов закрытия в конце ваших плагинов php-файлов.
Сисир
1
Если вы используете отладчик, установите точку останова в activate_plugin methodin wordpress/wp-admin/includes/plugin.php. Содержимое переменной $ output покажет вам, что данные, загруженные в исключение, неизменно выбрасываются, а затем скрываются в WordPress.
Тодд Холмберг

Ответы:

10

Я предполагаю, что вы получаете ошибку PHP, которая генерирует вывод перед отправкой заголовков. Если вы E_NOTICEвключили, вызов $_POST['foo']может генерировать ошибку «Notice: undefined variable», если эта переменная не установлена.

Лучшая практика: никогда не предполагайте ничего о переменных 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
Это была моя проблема. У меня была куча пустых строк после моего закрытия ?>.
Кэм Джексон
1
Не рекомендуем использовать закрывающий тег PHP. Это плохая практика, которая приводит к типу проблем в OP, и это идет вразрез со стандартами кодирования WP Core (см. Make.wordpress.org/core/handbook/best-practices/… )
butlerblog
4

В начале вашей функции активации положить ob_start();и в конце положитьtrigger_error(ob_get_contents(),E_USER_ERROR);

Затем попробуйте активировать свой плагин, и вы сможете увидеть, что на самом деле представляют собой « сгенерированные 293 символа неожиданного вывода ». С этого момента отладка станет проще (либо удалите символы новой строки, либо исправьте некоторые ошибки).

lulalala
источник
это на самом деле гениальное решение для исправления ошибки .. Спасибо ..
Obmerk Kronen
3

Я сталкивался с той же проблемой раньше, для меня это был дополнительный пробел. После того, как я удалил все эти пробелы, плагин мог активироваться без каких-либо ошибок / предупреждений.

yashbinani
источник
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.

Если вы выводите какие-либо символы, то я считаю (что здесь может быть неправильно), что существует неявное объявление заголовка, поэтому, когда происходит нормальный вызов header (), вы получаете ошибку, поскольку у вас не может быть двух объявлений заголовка.

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

ана
источник
1

Я знаю, что это старый вопрос, и на него есть принятый ответ. Есть много ответов , которые охватывают то , что проблема активации может потенциально быть. Тем не менее, ни один из ответов на самом деле не касается основной проблемы КАК отладить проблемы с активацией плагина.

Если вы собираетесь разрабатывать плагины WP, вы можете также использовать правильные инструменты для работы. Одним из них является панель отладки . Это плагин, который поможет вам отладить проблемы в WP. Если вы разработчик плагинов, он должен быть в вашем наборе инструментов.

Панель отладки имеет ряд дополнений - плагинов для плагина, если хотите. Одним из них является активация плагина отладочной панели , которая покажет вам ошибку PHP, сгенерированную при активации плагина. Как только вы узнаете, в чем заключается ошибка PHP, которая приводит к отправке заголовков, тогда вы знаете, где нужно искать, чтобы исправить ее. Поверьте мне, зная, что это за ошибка , вы сэкономите массу времени, вместо того, чтобы попытаться выяснить, в чем может быть ошибка .

butlerblog
источник
Спасибо, это очень полезно!
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>';
}
Bainternet
источник
2
Это не должно иметь к этому никакого отношения. Пробелы и вкладки внутри ваших функций допустимы и не приводят к этой ошибке.
Мэтью Муро
внутри функции вы правы, но если функция выводит что-то напрямую, например: function blabla(){?> <input> <?php code... ?> output something <?php code.. }тогда это не так.
Bainternet
2
@MatthewMuro: если вы оставите пробел внутри функции в порядке, но если вы оставите пробел / разрыв строки после закрывающих тегов php, ?>то получите, header already send errorпотому что эти лишние пробелы будут распечатаны, когда механизм php проанализирует их.
Сисир
0

Вы удаляете тег php close (?>) В конце каждого файла. а также удалить все пустое место после тега php close (?>)

когда вы активируете плагин, просто проверьте, существует ли таблица или нет.

я удалил проблему по коду

    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. Сохранение с помощью кодовой страницы 1252 устранило ошибку.

Шон
источник
1
Извините, это неправильно. Все в WordPress имеет кодировку UTF-8, Windows-1252 сломает сайт, как только вы используете не-ASCII символ.
fuxia