WordPress Plugin Entwicklung - Header bereits gesendete Nachricht

15

Ich entwickle WordPress-Plugins. Wenn ich mein Plugin aktiviere, erhalte ich die folgende Meldung:

Das Plugin hat während der Aktivierung 293 Zeichen unerwartete Ausgabe generiert. Wenn Sie bereits gesendete Header-Nachrichten, Probleme mit Syndication-Feeds oder andere Probleme bemerken, deaktivieren oder entfernen Sie dieses Plugin.

Das Plugin funktioniert sehr gut, aber ich weiß nicht, warum ich diese Nachricht erhalte. Mein Plugin ist: http://wordpress.org/extend/plugins/facebook-send-like-button/

Eray
quelle
Wenn das Debuggen aktiviert ist, erhalten Sie dies möglicherweise, wenn PHP eine Warnung ausgibt.
Milo
1
Überprüfen Sie, ob Sie nach dem Schließen von PHP-Tags am Ende Ihrer Plugin-PHP-Dateien Leerzeichen hinterlassen haben.
Sisir
1
Wenn Sie einen Debugger verwenden, setzen Sie einen Haltepunkt in das Feld activate_plugin methodin wordpress/wp-admin/includes/plugin.php. Der Inhalt der Ausgabevariablen $ zeigt Ihnen die in die Exception geladenen Daten, die ausnahmslos geworfen und dann von WordPress verschleiert werden.
Todd Holmberg

Antworten:

10

Ich vermute, Sie erhalten einen PHP-Fehler, der die Ausgabe generiert, bevor die Header gesendet werden. Wenn Sie dies E_NOTICEaktiviert haben, $_POST['foo']kann ein Aufruf den Fehler "Hinweis: undefinierte Variable" erzeugen, wenn diese Variable nicht gesetzt ist.

Best Practice: Nehmen Sie niemals etwas über GET-, POST-, COOKIE- und REQUEST-Variablen an. Überprüfen Sie immer zuerst mit isset()oder empty().

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

Dies wird normalerweise durch Leerzeichen oder neue Zeilen vor dem öffnenden <?phpTag oder nach dem schließenden ?>Tag verursacht.

Auf dieser Seite finden Sie einige Lösungen: Wie löse ich das Problem mit bereits gesendeten Headern?

AKTUALISIEREN

Nach der Überprüfung Ihres Plugin-Codes ist mir aufgefallen, dass Sie kein schließendes PHP-Tag haben. Fügen Sie in der letzten Zeile hinzu?>

Matthew Muro
quelle
4
PHP-Dateien benötigen kein schließendes ?>Tag. Ein Weg, um sicherzustellen, dass es keine Headers already sentProbleme verursacht , ist das Weglassen des schließenden Tags.
John P Bloch
2
Das war mein Problem. Ich hatte nach meinem Abschluss ein paar leere Zeilen ?>.
Cam Jackson
1
Verwenden Sie kein schließendes PHP-Tag. Es ist eine schlechte Praxis, die zu Problemen im OP führt, und sie widerspricht den Kodierungsstandards von WP Core (siehe make.wordpress.org/core/handbook/best-practices/… )
Butlerblog
4

Am Anfang Ihrer Aktivierungsfunktion setzen Sie ein ob_start();und am Ende eintrigger_error(ob_get_contents(),E_USER_ERROR);

Versuchen Sie dann, Ihr Plugin zu aktivieren, und Sie können sehen, was die " generierten 293 Zeichen unerwarteter Ausgabe " wirklich sind. Ab diesem Zeitpunkt ist das Debuggen einfacher (entweder entfernen Sie neue Zeilenzeichen oder beheben Sie einige Fehler).

lulalala
quelle
Dies ist eigentlich eine geniale Lösung, um den Fehler zu
beheben
3

Ich habe das gleiche Problem schon einmal gehabt, für mich war es ein zusätzlicher weißer Raum. Nachdem ich alle diese Leerzeichen entfernt hatte, konnte das Plugin ohne Fehler / Warnung aktiviert werden.

Yashbinani
quelle
1

Ich bin mir nicht sicher, ob das das Problem ist, aber ich bin mir ziemlich sicher.

Sie müssen einen gültigen Rückruf als zweites Argument in verwenden register_activation_hook():

register_activation_hook(__FILE__,'twl_tablo_olustur');

Soweit ich das beurteilen kann, haben Sie twl_tablo_olustur()nirgends definiert . Dies würde sicherlich die unerwartete Ausgabe erklären (PHP-Fehler beim Versuch, eine nicht vorhandene Funktion aufzurufen) und erklären, warum sie unter allen anderen Umständen einwandfrei funktioniert.

John P Bloch
quelle
Danke. Aber register_activation_hook(__FILE__,'twl_tablo_olustur');dieser Code aus alter Version. In der neuen Version (Sie können überprüfen, v1.3) ist es aktualisiert, aber immer noch der gleiche Fehler.
Eray
1

Ich neige dazu, diese Meldungen häufig zu erhalten, wenn ich Plugin / Theme-Debug-Meldungen ausgebe, insbesondere, wenn ich Dinge ausgebe, bevor wp_header aufgerufen wird.

Wenn Sie irgendwelche Zeichen ausgeben, dann glaube ich (könnte hier falsch sein), dass es eine implizite Header-Deklaration gibt. Wenn also der normale Header () -Aufruf auftritt, erhalten Sie den Fehler, da Sie keine 2 Header-Deklarationen haben können.

Sie können ob_start () verwenden, um die Ausgabe zu puffern. Dies sollte den Fehler beheben. Beachten Sie die Kommentare hier: http://php.net/manual/en/function.header.php

anu
quelle
1

Ich weiß, dass dies eine alte Frage ist und eine akzeptierte Antwort hat. Es gibt viele Antworten , die , was die Aktivierung Problem abdecken könnte möglicherweise sein. Bei der Kernausgabe von HOW zum Debuggen von Problemen mit der Plugin-Aktivierung wird jedoch keine der Antworten angezeigt.

Wenn Sie WP-Plugins entwickeln, können Sie auch die richtigen Tools für den Job verwenden. Eine davon ist die Debug-Leiste . Dies ist ein Plugin, mit dem Sie Probleme in WP beheben können. Wenn Sie ein Plugin-Entwickler sind, sollte es in Ihrer Toolbox sein.

Die Debug-Leiste enthält eine Reihe von Add-Ons - Plugins für das Plugin, wenn Sie so wollen. Eine davon ist die Aktivierung des Debug-Leisten- Plugins, die den PHP-Fehler anzeigt, der bei der Aktivierung des Plugins auftritt. Sobald Sie wissen, was der PHP-Fehler ist, durch den die Header gesendet werden, wissen Sie, wo Sie nachsehen müssen, um sie zu korrigieren. Vertrauen Sie mir, zu wissen, was der Fehler ist, kann Ihnen eine Menge Zeit sparen, anstatt herauszufinden, was der Fehler sein könnte .

Butlerblog
quelle
Danke, das ist sehr hilfreich!
user1190132
0

Bei der letzten Überarbeitung des Plugins (381724) ist das Problem, dass zu viele Leerzeichen vorhanden sind

Jedes Mal, wenn Sie diese Struktur erstellen möchten:

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

Verwenden Sie in Ihrem Code TAB und keine Leerzeichen.

Hier ist Ihr Code, in dem ich alle Leerzeichen durch Tabulatoren ersetzt habe und bei der Aktivierung keine Nachrichten erhalte:

<?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:[email protected]">mail me</a> for bugs, thanks.</em>

    <?php
    echo '</div>';
}
Bainternet
quelle
2
Das sollte nichts damit zu tun haben. Leerzeichen und Tabulatoren in Ihren Funktionen sind akzeptabel und erzeugen diesen Fehler nicht.
Matthew Muro
Innerhalb einer Funktion sind Sie korrekt, aber wenn die Funktion etwas direkt ausgibt, zB: function blabla(){?> <input> <?php code... ?> output something <?php code.. }dann ist das nicht der Fall.
Bainternet
2
@MatthewMuro: Wenn Sie das Leerzeichen in einer Funktion belassen, ist es in Ordnung, aber wenn Sie nach dem Schließen von PHP-Tags Leerzeichen / Zeilenumbrüche hinterlassen ?>, header already send errorwerden diese zusätzlichen Leerzeichen ausgegeben, wenn die PHP-Engine sie analysiert.
Sisir
0

Sie entfernen das PHP-Schließtag (?>) Vom Ende jeder Datei. und entferne auch alle Leerzeichen nach dem Schließen des PHP-Tags (?>)

Wenn Sie das Plugin aktivieren, überprüfen Sie einfach, ob die Tabelle bereits existiert oder nicht.

Ich habe das Problem durch den Code entfernt

    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);
    }
Mamunur Rashid
quelle
-3

Mein Problem war, dass die Datei als UTF-8-Datei gespeichert wurde. Durch Speichern mit Codepage 1252 wurde der Fehler behoben.

Shawn
quelle
1
Entschuldigung, das ist falsch. Alles in WordPress ist UTF-8-codiert. Windows-1252 zerstört die Site, sobald Sie ein Nicht-ASCII-Zeichen verwenden.
fuxia