Desarrollo de complementos de WordPress: encabezados ya enviados

15

Estoy desarrollando complementos de WordPress. Cuando activo mi complemento, recibo el siguiente mensaje:

El complemento generó 293 caracteres de salida inesperada durante la activación. Si observa mensajes de "encabezados ya enviados", problemas con los canales de distribución u otros problemas, intente desactivar o eliminar este complemento.

El complemento funciona muy bien, pero no sé por qué recibo este mensaje. Mi complemento es: http://wordpress.org/extend/plugins/facebook-send-like-button/

Eray
fuente
si la depuración está habilitada, puede obtener esto si php genera una advertencia.
Milo
1
Compruebe si dejó algún espacio en blanco después de las etiquetas de cierre de php al final de sus archivos php del complemento.
Sisir
1
Si está utilizando un depurador, a continuación, poner un punto de interrupción en el torno activate_plugin methoden wordpress/wp-admin/includes/plugin.php. El contenido de la variable $ output le mostrará los datos cargados en la excepción que se arrojan invariablemente y luego se ofuscan con wordpress.
Todd Holmberg

Respuestas:

10

Supongo que obtienes un error de PHP, que genera resultados antes de que se envíen los encabezados. Si ha E_NOTICEhabilitado, la llamada $_POST['foo']puede generar un error de "Aviso: variable indefinida" si esa variable no está configurada.

Mejor práctica: nunca asuma nada sobre las variables GET, POST, COOKIE y REQUEST. Siempre verifique primero usando isset()o empty().

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

Esto generalmente es causado por espacios o nuevas líneas antes de la <?phpetiqueta de apertura o después de la ?>etiqueta de cierre .

Consulte esta página para ver algunas soluciones: ¿Cómo resuelvo el problema de advertencia de encabezados ya enviados?

ACTUALIZAR

Después de examinar su código de complemento, lo único que noté es que no tiene una etiqueta PHP de cierre. En la última línea, agregue?>

Matthew Muro
fuente
44
Los archivos PHP no necesitan la ?>etiqueta de cierre . De hecho, una forma de garantizar que no causará Headers already sentproblemas es dejar fuera la etiqueta de cierre.
John P Bloch
2
Este fue mi problema. Tenía un montón de líneas en blanco después de mi cierre ?>.
Cam Jackson el
1
No recomiendo usar una etiqueta PHP de cierre. Es una mala práctica que conduce al tipo de problemas en el OP, y va en contra de los estándares de codificación WP Core (ver make.wordpress.org/core/handbook/best-practices/… )
butlerblog
4

Al comienzo de su función de activación, coloque ob_start();ay al final, coloque untrigger_error(ob_get_contents(),E_USER_ERROR);

Luego, intente activar su complemento, y podrá ver cuáles son realmente los ' 293 caracteres de salida inesperada '. A partir de ese momento, la depuración será más fácil (eliminar caracteres de línea nuevos o resolver algunos errores).

lulalala
fuente
esta es realmente una solución genial para encontrar el error ... Gracias ...
Obmerk Kronen
3

Me he enfrentado al mismo problema antes, para mí era un espacio en blanco adicional. Después de eliminar todos esos espacios en blanco, el complemento podría activarse sin ningún error / advertencia.

yashbinani
fuente
1

No estoy seguro de que este sea el problema, pero estoy bastante seguro de ello.

Debe usar una devolución de llamada válida como segundo argumento en register_activation_hook():

register_activation_hook(__FILE__,'twl_tablo_olustur');

Por lo que puedo decir, no has definido nada twl_tablo_olustur(). Esto ciertamente explicaría la salida inesperada (error PHP generado al intentar llamar a una función inexistente), y explicaría por qué funciona bien en todas las demás circunstancias.

John P Bloch
fuente
gracias. Pero register_activation_hook(__FILE__,'twl_tablo_olustur');este código de la versión anterior. En la nueva versión (puede verificar, v1.3) está actualizada, pero sigue siendo el mismo error.
Eray
1

Tiendo a recibir muchos de estos mensajes cuando estoy enviando mensajes de depuración de plugins / temas, especialmente cuando estoy enviando cosas antes de que se llame a wp_header.

Si está generando caracteres, creo (podría estar equivocado aquí) que hay una declaración de encabezado implícita, por lo que cuando se produce la llamada normal de encabezado (), obtiene el error ya que no puede tener 2 declaraciones de encabezado.

Puede usar ob_start () para almacenar el resultado en el búfer, lo que debería eliminar el error. Eche un vistazo a los comentarios aquí: http://php.net/manual/en/function.header.php

anu
fuente
1

Sé que esta es una vieja pregunta y tiene una respuesta aceptada. Hay muchas respuestas que cubren cuál podría ser el problema de activación . Sin embargo, ninguna de las respuestas realmente llega al tema central de CÓMO depurar problemas con la activación del complemento.

Si va a desarrollar complementos de WP, también puede usar las herramientas correctas para el trabajo. Una de ellas es la barra de depuración . Este es un complemento que te ayuda a depurar problemas en WP. Si usted es un desarrollador de complementos, debe estar en su caja de herramientas.

La barra de depuración tiene una serie de complementos: complementos para el complemento, si lo desea. Uno de ellos es la activación del complemento de la barra de depuración , que le mostrará el error PHP generado cuando se activa el complemento. Una vez que sepa cuál es el error de PHP que hace que se envíen los encabezados, entonces sabrá dónde debe buscar para corregirlo. Confía en mí, sabiendo lo que el error es que se puede ahorrar un montón de tiempo en lugar de tratar de averiguar lo que el error podría ser .

butlerblog
fuente
¡Gracias, esto es muy útil!
user1190132
0

Mirando la última revisión del complemento (381724) el problema es Demasiados espacios

cada vez que quieras crear esta estructura:

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

en su código use TAB y no espacios.

Aquí está su código donde reemplacé todos los espacios con pestañas y no recibo ningún mensaje en la activación:

<?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
fuente
2
Eso no debería tener nada que ver con eso. Los espacios y pestañas dentro de sus funciones son aceptables y no producen este error.
Matthew Muro
dentro de una función está en lo correcto, pero si la función genera algo directamente, por ejemplo: function blabla(){?> <input> <?php code... ?> output something <?php code.. }entonces ese no es el caso.
Bainternet
2
@MatthewMuro: si deja el espacio dentro de una función, está bien pero si deja algún espacio en blanco / salto de línea después de cerrar las etiquetas php ?>, obtendrá header already send erroresos espacios en blanco adicionales que se imprimirán cuando el motor php lo analice.
Sisir
0

Elimina la etiqueta de cierre php (?>) Del final de cada archivo. y también elimine todo el espacio en blanco después de la etiqueta de cierre de php (?>)

cuando active el complemento, simplemente verifique si la tabla ya existe o no.

eliminé el problema por el código

    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
fuente
-3

Mi problema fue que el archivo se guardó como un archivo UTF-8. Guardarlo con la página de códigos 1252 resolvió el error.

Shawn
fuente
1
Lo siento, eso está mal. Todo en WordPress está codificado en UTF-8, Windows-1252 romperá el sitio en el momento en que use un carácter no ASCII.
fuxia