Проблемы PHP, которые, похоже, нарушают работу моего скрипта Google Analytics

#php

#php

Вопрос:

У меня есть global.php файл, который я вызываю из верхней части каждого скрипта. Этот скрипт предназначен для размещения всей информации моего заголовка.

Проблема, которая возникает, заключается в том, что как только я помещаю код Google Analytics в global.php он больше не регистрирует данные в моем Google Analytics.

Вот global.php код:

 <?php
/* this file needs to be included in every user-facing script that serves ads  */

/* this will prevent "PHP Warning:  Cannot modify header information - headers already sent.." */
ob_start();

/* this will make session cookie worl for both http://www.comehike.com and http://comehike.com
 * session cookie lifetime is set to 2 hours
 */
session_set_cookie_params("7200", "/", ".comehike.com");

/* it is better to have session_start here rather then in every page
 * session_start needs to be called before any headers sent to not trigger php warning */
session_start();

global $production;
$production = true;

/*============================== ad pacement utils ===============================*/
/*
 * this helper module will simplify ads placement in production and simulate ads in development.
 * It will allow to turn of the ads for the user with premium account.
 *
 * To use this module:
 * in the head, where google site verification needs to be included, add the following

    <?php
    printGoogleSiteVerification();
    ?>

* in the page, where ads needs to be inserted, add the following lines (example):

    <?php
        printGoogleAdPlacement(7425893768, 250, 250, '10/11/10');
    ?>

 */

function printGoogleSiteVerification(){
    global $production;
    $str = '';
    if($production===true){
        $str.= '<meta name="google-site-verification" content="RJcu8ObHW6huUbyea336xJ1WgLiC4478fz3_3r_zthc" />'."n";
        $str.= '<meta name="alexaVerifyID" content="-2hEyu8phk6CFHF-PTqdQvP2B8k" />'."n";
    }
    echo $str;
}

function hasPremium(){
    return false;
    /*
    //this is a sample function to check is user has a premium account.
    //in this example alex won't see any ads
    if($_SESSION["user_id"]==='alex'){
        return true;
    }else{
        return false;
    }*/
}

//ex: printGoogleAdPlacement(7425893768, 728, 90, 10/11/10)
//ex: printGoogleAdPlacement(7425893768, 250, 250, 10/11/10)
//ex: printGoogleAdPlacement(7425893768, 200, 200, 10/11/10)
function printGoogleAdPlacement($google_ad_slot, $width, $height, $created){
    global $production;

    //user with premium won't see any ads.
    //the question is what goes into the slots instead?
    if(hasPremium() === true) {return;}

    $str = '';
    if($production === true){
        $str.= '<script type="text/javascript"><!--'."n";
        $str.= 'google_ad_client = "pub-1884332214318974";'."n";
        $str.= '/* '.$width.'x'.$height.', created '.$created.' */'."n";
        $str.= 'google_ad_slot = "'.$google_ad_slot.'";'."n";
        $str.= 'google_ad_width = '.$width.';'."n";
        $str.= 'google_ad_height = '.$height.';'."n";
        $str.= '//-->'."n";
        $str.= '</script>'."n";
        $str.= '<script type="text/javascript"'."n";
        $str.= 'src="http://pagead2.googlesyndication.com/pagead/show_ads.js">'."n";
        $str.= '</script>'."n";
    }else{
        /*
        $str .= '<div style="padding:0; height:'.($height 20).'px; width:'.$width.'px;border: 1px solid #888;background:#fff;">'.
            '<div>Advertisement</div>'.
            '<img src="images/fake_ads/ad_'.$width.'_'.$height.'.png"></img>'.
            '</div>';
            */
        $str = '<img src="images/fake_ads/ad_'.$width.'_'.$height.'.png"></img>';
    }
    $str = '<div style="padding:0; height:'.($height).'px; width:'.$width.'px;background:#fff;">'.
            $str.
            '</div>';

    echo $str;
}

/* =============== end of ad placement utils =================== */

/* ===================== google anaytics ========================*/
function printGoogleAnalytics()
{
  $str = '';
    if($production === true)
    {
        $str.= '<script type="text/javascript">'."n";

        $str.= '(function() {'."n";
        $str.= ' var ga = document.createElement("script"); ga.type = "text/javascript"; ga.async = true;'."n";
        $str.= ' ga.src = ("https:" == document.location.protocol ? "https://ssl" : "http://www")   ".google-analytics.com/ga.js";'."n";
        $str.= ' var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ga, s);'."n";
        $str.= '})();'."n";

        $str.= '</script>'."n";
    }
    echo $str;
}
/* ===================== end of google anaytics ========================*/
?>
  

Вот пример страницы, где это происходит:

http://www.comehike.com/outdoors/hiking_headlamp.php

Если я удалю код goog analitics из global.php и поместите его в заголовок как обычный html, это работает, потому что я могу видеть данные о посетителях. Если я помещу его в global.php файл, он не работает.

И вот функция, которую я пытаюсь вызвать из заголовка, который находится в global.php

Есть идеи, что здесь происходит не так? Если бы это была просто проблема с синтаксисом, она была бы гораздо более нарушенной, верно?

Комментарии:

1. когда ваша страница отобразится, посмотрите на исходный код для отладки

2. @Ibu вы имеете в виду исходный код html?

3. Да, исходный код html, посмотрите, правильно ли загружен код Google

4. @Ibu Хороший момент. К сожалению, он, кажется, правильно загружен.

5. Используйте firebug, чтобы проверить, загружен ли скрипт google-analytics.com/ga.js в head. посмотрите на DOM, которого нет в исходном коде html

Ответ №1:

Я просмотрел код и не вижу ничего неправильного, код правильно создает тег script и добавляет его в заголовок вашего документа.

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

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

 $str =<<<GOOGLECODE
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'XX-XXXXXXX-XX']);
_gaq.push(['_trackPageview']);

   (function() {
   var ga = document.createElement("script"); ga.type = "text/javascript"; ga.async = true;
   ga.src = ("https:" == document.location.protocol ? "https://ssl" : "http://www")   ".google-analytics.com/ga.js";
   var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ga, s);
   })();
</script>
GOOGLECODE;
  

Затем вы можете повторить свой $ str.

 echo $str;
  

кроме того, поскольку вы используете выходной буфер, вы также можете использовать этот метод

 function printGoogleAnalytics()
{
?>
<script type="text/javascript">
    ....
</script>
<?php
}
...
  

вызов скрипта выведет промежуточный HTML-код.

Я надеюсь, что это поможет решить вашу проблему

Комментарии:

1. Спасибо!! Вы мне совсем немного помогли.