Rozwój wtyczek WordPress - nagłówki już wysłały wiadomość


15

Tworzę wtyczki WordPress. Po aktywacji wtyczki pojawia się następujący komunikat:

Wtyczka wygenerowała 293 znaki nieoczekiwanego wyjścia podczas aktywacji. Jeśli zauważysz komunikaty „nagłówki już wysłane”, problemy z kanałami syndykacyjnymi lub inne problemy, spróbuj dezaktywować lub usunąć tę wtyczkę.

Wtyczka działa bardzo dobrze, ale nie wiem, dlaczego otrzymuję ten komunikat. Moja wtyczka to: http://wordpress.org/extend/plugins/facebook-send-like-button/


jeśli debugowanie jest włączone, możesz to zrobić, jeśli php wyświetli ostrzeżenie.
Milo,

1
Sprawdź, czy nie zostawiłeś żadnych białych znaków po zamknięciu tagów php na końcu plików php wtyczki.
Sisir,

1
Jeśli używasz debugera, umieść punkt przerwania activate_plugin methodw wordpress/wp-admin/includes/plugin.php. Zawartość zmiennej wyjściowej $ pokaże dane załadowane do wyjątku niezmiennie rzucane, a następnie zaciemniane przez wordpress.
Todd Holmberg

Odpowiedzi:


10

Domyślam się, że pojawia się błąd PHP, który generuje dane wyjściowe przed wysłaniem nagłówków. Jeśli E_NOTICEwłączyłeś, wywołanie $_POST['foo']może wygenerować błąd „Uwaga: zmienna niezdefiniowana”, jeśli ta zmienna nie jest ustawiona.

Najlepsza praktyka: nigdy nie zakładaj niczego o zmiennych GET, POST, COOKIE i REQUEST. Zawsze sprawdź najpierw za pomocą isset()lub empty().

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

13

Jest to zwykle spowodowane spacjami lub nowymi liniami przed <?phptagiem otwierającym lub za ?>tagiem zamykającym .

Sprawdź tę stronę, aby zobaczyć niektóre rozwiązania: Jak rozwiązać problem z ostrzeżeniami, które już wysłano?

AKTUALIZACJA

Po sprawdzeniu kodu wtyczki zauważyłem, że nie masz zamykającego znacznika PHP. W ostatnim wierszu dodaj?>


4
Pliki PHP nie potrzebują ?>tagu zamykającego . W rzeczywistości jednym ze sposobów zagwarantowania, że ​​nie spowoduje Headers already sentto problemów, jest pozostawienie tagu zamykającego.
John P Bloch,

2
To był mój problem. Po zamknięciu miałem kilka pustych linii ?>.
Cam Jackson

1
Nie zalecamy używania zamykającego tagu PHP. Jest to zła praktyka, która prowadzi do problemów w PO i jest sprzeczna ze standardami kodowania WP Core (patrz make.wordpress.org/core/handbook/best-practices/... )
butlerblog

4

Na początku swojej funkcji aktywacji umieść a, ob_start();a na końcu umieść atrigger_error(ob_get_contents(),E_USER_ERROR);

Następnie spróbuj aktywować wtyczkę, a zobaczysz, czym tak naprawdę są „ wygenerowane 293 znaki nieoczekiwanego wyjścia ”. Od tego momentu debugowanie będzie łatwiejsze (usuń znaki nowej linii lub usuń niektóre błędy).


to jest naprawdę genialne rozwiązanie, by
naprawić

3

Wcześniej miałem ten sam problem, dla mnie była to dodatkowa biała przestrzeń. Po usunięciu wszystkich białych znaków wtyczka mogła się aktywować bez żadnego błędu / ostrzeżenia.


1

Nie jestem pewien, czy to jest problem, ale jestem tego całkiem pewien.

Musisz użyć poprawnego wywołania zwrotnego jako drugiego argumentu w register_activation_hook():

register_activation_hook(__FILE__,'twl_tablo_olustur');

O ile wiem, twl_tablo_olustur()nigdzie nie zdefiniowałeś . To z pewnością wyjaśniłoby nieoczekiwane wyjście (błąd PHP wygenerowany podczas próby wywołania nieistniejącej funkcji) i wyjaśniłoby, dlaczego działa dobrze we wszystkich innych okolicznościach.


Dziękuję Ci. Ale register_activation_hook(__FILE__,'twl_tablo_olustur');ten kod ze starej wersji. W nowej wersji (można sprawdzić, wersja 1.3) jest zaktualizowany, ale nadal występuje ten sam błąd.
Eray

1

Często otrzymuję te wiadomości, gdy wysyłam komunikaty debugowania wtyczek / motywów, szczególnie gdy wysyłam rzeczy przed wywołaniem wp_header.

Jeśli wypisujesz jakieś znaki, to uważam (może być tutaj źle), że istnieje niejawna deklaracja nagłówka, więc gdy wystąpi normalne wywołanie header (), pojawia się błąd, ponieważ nie możesz mieć 2 deklaracji nagłówka.

Możesz użyć ob_start () do buforowania danych wyjściowych, co powinno usunąć błąd - spójrz na komentarze tutaj: http://php.net/manual/en/function.header.php


1

Wiem, że to stare pytanie i ma akceptowaną odpowiedź. Istnieje wiele odpowiedzi obejmujących problem z aktywacją mogłaby być potencjalnie. Jednak żadna z odpowiedzi tak naprawdę nie dotyczy sedna wydania HOW jak debugować problemy z aktywacją wtyczki.

Jeśli zamierzasz opracować wtyczki WP, równie dobrze możesz użyć odpowiednich narzędzi do tego zadania. Jednym z nich jest pasek debugowania . To jest wtyczka, która pomaga debugować problemy w WP. Jeśli jesteś programistą wtyczek, powinien on znajdować się w twoim zestawie narzędzi.

Pasek debugowania ma wiele dodatków - wtyczek do wtyczki, jeśli chcesz. Jednym z nich jest Aktywacja wtyczki Debug Bar , która pokaże błąd PHP generowany podczas aktywacji wtyczki. Gdy wiesz, co to jest błąd PHP, który powoduje wysłanie nagłówków, wiesz, gdzie trzeba go naprawić. Zaufaj mi, wiedząc, jaki jest błąd, możesz zaoszczędzić mnóstwo czasu, zamiast próbować dowiedzieć się, jaki może być błąd .


Dziękuję, to jest bardzo pomocne!
user1190132

0

Patrząc na ostatnią wersję wtyczki (381724) problemem jest zbyt wiele spacji

za każdym razem, gdy chcesz utworzyć tę strukturę:

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

w kodzie użyj TAB, a nie spacji.

Oto kod, w którym zastąpiłem wszystkie spacje tabulatorami i nie otrzymuję żadnych wiadomości przy aktywacji:

<?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
To nie powinno mieć z tym nic wspólnego. Odstępy i tabulatory w funkcjach są dopuszczalne i nie powodują tego błędu.
Matthew Muro,

wewnątrz funkcji masz rację, ale jeśli funkcja wyprowadza coś bezpośrednio, np .: function blabla(){?> <input> <?php code... ?> output something <?php code.. }to nie jest tak.
Bainternet

2
@MatthewMuro: jeśli zostawisz spację wewnątrz funkcji, jest w porządku, ale jeśli pozostawisz białe spacje / podział linii po tagach zamykających php ?>, otrzymasz, header already send errorponieważ te dodatkowe białe spacje zostaną wydrukowane, gdy silnik php parsuje je.
Sisir,

0

Usuwasz php close tag (?>) Na końcu każdego pliku. a także usuń całe puste miejsce po tagu php close (?>)

po aktywowaniu wtyczki sprawdź, czy tabela już istnieje, czy nie.

usunąłem problem przez kod

    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

Mój problem polegał na tym, że plik został zapisany jako plik UTF-8. Zapisanie go za pomocą strony kodowej 1252 rozwiązało błąd.


1
Przepraszam, to źle. Wszystko w WordPress jest zakodowane w UTF-8, Windows-1252 zepsuje stronę, gdy użyjesz znaku spoza ASCII.
fuxia
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.