워드 프레스 플러그인 개발-헤더는 이미 보낸 메시지


15

WordPress 플러그인을 개발 중입니다. 플러그인을 활성화하면 다음과 같은 메시지가 나타납니다.

플러그인은 활성화 중에 293 자의 예기치 않은 출력을 생성했습니다. '헤더가 이미 전송되었습니다'메시지, 신디케이션 피드 관련 문제 또는 기타 문제가 발견되면이 플러그인을 비활성화하거나 제거하십시오.

플러그인이 제대로 작동하지만 왜이 메시지가 표시되는지 모르겠습니다. 내 플러그인은 : http://wordpress.org/extend/plugins/facebook-send-like-button/


만약 디버깅이 가능하다면, php가 경고를 출력하면 이것을 얻을 수 있습니다.
Milo

1
플러그인 PHP 파일 끝에 php 태그를 닫은 후 공백이 있는지 확인하십시오.
Sisir

1
디버거를 사용하는 경우, 다음에 주위에 중단 점을 넣어 activate_plugin method에서 wordpress/wp-admin/includes/plugin.php. $ output 변수의 내용은 예외에로드 된 데이터가 항상 발생하고 워드 프레스에 의해 난독 화 된 것을 보여줍니다.
Todd Holmberg

답변:


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문제가 발생하지 않도록 보장하는 한 가지 방법 은 닫는 태그를 남기지 않는 것입니다.
John P Bloch

2
이것은 내 문제였다. 문을 닫은 후 빈 줄이 여러 개있었습니다 ?>.
Cam Jackson

1
닫는 PHP 태그를 사용하지 않는 것이 좋습니다. OP의 문제 유형으로 이어지는 나쁜 습관이며 WP Core 코딩 표준 ( make.wordpress.org/core/handbook/best-practices/… 참조)에 위배 됩니다.
butlerblog

4

활성화 기능의 시작 부분에 a를 ob_start();넣고 끝에 atrigger_error(ob_get_contents(),E_USER_ERROR);

그런 다음 플러그인을 활성화하면 ' 예기치 않은 출력293 자 생성 '이 실제로 무엇인지 확인할 수 있습니다 . 그때부터는 디버깅이 쉬워집니다 (줄 바꾸기 문자를 제거하거나 오류를 해결).


이 .. 실제로 감사 지느러미 오류에 천재 솔루션입니다 ..
Obmerk 크로 넨

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을 확인할 수 있음)에서는 업데이트되었지만 여전히 동일한 오류입니다.
Eray

1

플러그인 / 테마 디버그 메시지를 출력 할 때, 특히 wp_header가 호출되기 전에 물건을 출력 할 때이 메시지를 많이 얻는 경향이 있습니다.

문자를 출력하는 경우 암시 적 헤더 선언이 있다고 생각합니다 (여기서는 잘못 될 수 있음). 일반적인 header () 호출이 발생하면 2 개의 헤더 선언을 가질 수 없으므로 오류가 발생합니다.

ob_start ()를 사용하여 출력을 버퍼링하여 오류를 제거해야합니다. 주석은 http://php.net/manual/en/function.header.php입니다.


1

나는 이것이 오래된 질문이라는 것을 알고 있으며 받아 들일만한 대답이 있습니다. 활성화 문제가 될 수 있는 것을 다루는 많은 답변이 있습니다. 그러나 플러그인 활성화와 관련된 문제를 디버깅 하는 HOW 의 핵심 문제에 대한 답변은 실제로 없습니다 .

WP 플러그인을 개발하려는 경우 작업에 올바른 도구를 사용할 수도 있습니다. 그중 하나가 Debug Bar 입니다. WP에서 문제를 디버그하는 데 도움이되는 플러그인입니다. 플러그인 개발자 인 경우 도구 상자에 있어야합니다.

디버그 표시 줄에는 플러그인 용 플러그인이 있습니다. 그중 하나는 Debug Bar Plugin Activation 이며, 플러그인 활성화시 생성 된 PHP 오류를 보여줍니다. 헤더가 전송되는 PHP 오류가 무엇인지 알고 나면 어디에서 수정해야하는지 알 수 있습니다. 날 믿어 오류가 무엇인지 알고 있다 대신하기 위해 노력하는 당신에게 시간을 절약 할 수 있습니다 오류가 무엇인지 알아낼 수 있었다 .


감사합니다. 매우 도움이됩니다.
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>';
}

2
그것은 그것과 관련이 없어야합니다. 함수 내부의 공백과 탭은 허용되며이 오류를 생성하지 않습니다.
Matthew Muro

함수 안에서는 정확하지만 함수가 직접 무언가를 출력하면 : function blabla(){?> <input> <?php code... ?> output something <?php code.. }그렇지 않습니다.
Bainternet

2
@ MatthewMuro : 함수 안에 공간을 남겨두면 PHP 종료 태그 후 공백 / 줄 바꿈을 남기면 PHP 엔진이 구문 분석 할 때 여분의 공백이 인쇄되기 때문에 ?>얻을 수 header already send error있습니다.
Sisir

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 파일로 저장되었다는 것입니다. 코드 페이지 1252로 저장하면 오류가 해결되었습니다.


1
죄송합니다. WordPress의 모든 것은 UTF-8로 인코딩되며 Windows-1252는 ASCII가 아닌 문자를 사용하는 순간 사이트를 중단시킵니다.
fuxia
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.