Facebook pixel modul

Hallo Zusammen!

Ich doktore schon recht lange an einem facebook-pixel Modul herum. Der Standardevent bei Pageviews war da recht einfach umzusetzen. Bei dem Event “AddToCart” ist es nun jedoch aber tricky…

Derzeit habe ich das sehr unsauber gelöst in dem ich das template newbasketitemmsg.tpl um einen block erweitert habe - diesen block spreche ich dann mit dem modul an… funktioniert zwar, ist aber eher unsauber… Einmal vergessen den blockin dem file nachzuziehen, oder aber auf eine andere darstellung umgeschalten und schon funkt das nicht mehr…

gibt es denn nicht eine einfachere möglichkeit um beim laden einer seite festzustellen ob nicht gerade ein artikel in den warenkorb gelegt wurde? Dabei sollte diese Abfrage dann sowohl auf list / details als auch startseite funktionieren.

Danke für jeden Denkanstoss… :slight_smile:
LG

$oNewItem = oxRegistry::getSession()->getVariable( '_newitem' );

Wenn es doch nur Module für irgendwelche anderen Tracking Dienste gäbe, dann könnte man es dort anschauen und kopieren.

Aber… Moment… es gibt solche Module!
Hier ist unser Piwik Modul für 4.8 - 4.10:
https://github.com/vanilla-thunder/bla-piwik/blob/master/application/views/blocks/piwik.tpl#L162-L177
oder GA Modul von D3

@vanilla: Zum Glück war da kein Smiley dabei - sonst hätte ich das wohl noch falsch verstehen können gggggg

@foxido: Danke, genau das war es was ich gesucht hatte… spart doch gleich einiges an code, files, unsauberkeiten usw. :slight_smile:

hmmm… ich und module… tja… das kommt davon wenn ein ex-graphiker meint er codet mal einfach so vor sich hin…

generell läuft es ja, aber aus irgendeinem Grund wird das Modul mehrfach aufgerufen… Somit kommt es natürlich zu einem nicht gewünschten Ergebnis…

So wird der toBasket Event 4-6 mal getracked, nur um dann vom letzten “cl=details” call überschrieben zu werden…

wo/wie kann denn am besten gesteuert werden, dass ein Modul / Klasse nur einmal aufgerufen wird??

Anbei mal der Code des Moduls:


class onefacebookpixelconversion_oxoutput extends onefacebookpixelconversion_oxoutput_parent
{

	/**
     * returns config parameter for facebook Conversion Pixel ID
     * @return int
     */
	 

	public function getFacebookPixelID()
    {
		// check if global config was set
		if(oxRegistry::getConfig()->getConfigParam( 's132onefacebookPixelID'))
		{
			return oxRegistry::getConfig()->getConfigParam( 's132onefacebookPixelID');
		} else return '0';
		
    }
	
/**
     * returns current/active page controller (aka view)
     * @return oxUBase
     */
    protected function _getViewOrder()
    {
        return oxRegistry::getConfig()->getActiveView();
    }



    /**
     * runs function _setFacebookConversionTagByViewObject by active controller (_getViewOrder())
     * @return void
     */
    protected function _setFacebookConversionTagByViewObject()
    {
    $oViewObject = $this->_getViewOrder();
		// Initialize --> will only be set if a "special" page is called
		$oneFacebookConversionPixelReturnValue ='';
		// set class name of current page
		$oneCurrentPage = $oViewObject->getClassName();
		// Details Page = ViewContent
		// switch values
		switch($oneCurrentPage)
		{
			case 'search':if(oxRegistry::getConfig()->getConfigParam( 's132onefacebookSearch')){$oneFacebookConversionPixelReturnValue='fbq(\'track\', \'Search\');';};break;
			case 'order':if(oxRegistry::getConfig()->getConfigParam( 's132onefacebookInitiateCheckout')){$oneFacebookConversionPixelReturnValue='fbq(\'track\', \'InitiateCheckout\');';};break;
			case 'thankyou':if(oxRegistry::getConfig()->getConfigParam( 's132onefacebookPurchase')){$oOrder = $oViewObject->getOrder();$oneFacebookConversionPixelReturnValue='fbq(\'track\', \'Purchase\', {value: \''.$oOrder->getTotalOrderSum().'\', currency: \'EUR\'});';};break;
			case 'payment':if(oxRegistry::getConfig()->getConfigParam( 's132onefacebookAddPaymentInfo')){$oneFacebookConversionPixelReturnValue='fbq(\'track\', \'AddPaymentInfo\');';};break;
			case 'contact':if(oxRegistry::getConfig()->getConfigParam( 's132onefacebookLead')){$oneFacebookConversionPixelReturnValue='fbq(\'track\', \'Lead\');';};break;
			
		}
		// TO BASKET FUNCTION
		$oNewItem = oxRegistry::getSession()->getVariable( '_newitem' ); 
		if($oNewItem || $oneCurrentPage == 'details')
		{
			if($oNewItem) 
				{$oneFacebookConversionPixelReturnValue='fbq(\'track\', \'AddToCart\'';} 
			else 
				{$oneFacebookConversionPixelReturnValue='fbq(\'track\', \'ViewContent\'';} 
			
			if(oxRegistry::getConfig()->getConfigParam( 's132onefacebookViewContent') && oxRegistry::getConfig()->getConfigParam( 's132onefacebookShowProductIDs'))
				{
					$oProduct =  $oViewObject->getProduct();
			    $oCategory = $oViewObject->getActCategory();
					$oneFacebookConversionPixelReturnValue.=',{content_type: \'product\',content_ids: [\''.$oProduct->oxarticles__oxartnum->value.'\'],content_name: \''.$oProduct->oxarticles__oxtitle->value.'\',content_category: \''.$oCategory->oxcategories__oxtitle->value.'\',value: \''.$oProduct->oxarticles__oxprice.'\',currency: \'EUR\'});';
				}
			else
				$oneFacebookConversionPixelReturnValue.=');';
		}
			if($oNewItem)	{echo("<script>".$oneFacebookConversionPixelReturnValue."</script>");}
		return $oneFacebookConversionPixelReturnValue;
    }

    /**
     * returns HTML string with facebook conversion pixel javascript source and params
     * @return string
     */
    public function getFacebookConversionPixelTrackingCode()
    {

        $sFacebookConversionPixelCode = '
			<script>
				!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
				n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
				n.push=n;n.loaded=!0;n.version=\'2.0\';n.queue=[];t=b.createElement(e);t.async=!0;
				t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
				document,\'script\',\'//connect.facebook.net/en_US/fbevents.js\');

				fbq(\'init\', \''.$this->getFacebookPixelID().'\');
				fbq(\'track\', "PageView");
				'.$this->_setFacebookConversionTagByViewObject().'
			</script>
			
			<noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id='.$this->getFacebookPixelID().'&ev=PageView&noscript=1" alt="facebookpixel"/></noscript>
		';
		return $sFacebookConversionPixelCode;
    }	
	
    /**
     * appends facebook conversion pixel tracking javascript source right after body
     * @param $sOutput
     * @return mixed
     */
    public function oneFacebookConversionPixelCode( $sOutput )
    {
	     $sFacebookConversionPixelTrackingCode = $this->getFacebookConversionPixelTrackingCode();
       $sOutput = str_ireplace('id="body">', "id=\"body\">
{$sFacebookConversionPixelTrackingCode}", ltrim($sOutput));
       return $sOutput;
    }

    /**
     * @param $sValue
     * @param $sClassName
     * @return mixed
     */
    public function process($sValue, $sClassName)
    {
        $sValue = parent::process($sValue, $sClassName);
        $sValue = $this->oneFacebookConversionPixelCode( $sValue);
        return $sValue;
    }
}

Update: hab das mit dem mehrfachen call bereits fixen können - (auch wenn ich den grund dafür nicht genau kenne… aber das modul wurde bis zu 6 mal aufgerufen und es wurden auch “leere” produkt-events rausgeschrieben. Jetzt werden diese nur noch gesetzt, wenn das produkt auch befüllt ist.

Eine Frage habe ich noch:
Derzeit wird der Tracking-Code gesetzt, sobald die Seite aufgerufen wird. Das Problem dabei ist, dass per Default der “Vaterartikel” beim Seitenaufruf gesetzt wird und nicht die Varianten - bei Facebook selbst (und auch bei google-shopping) werden ja aber nur die Varianten im Product-feed geladen bzw. angezeigt.

Dazu müsste ich nun aber die Funktion anpassen und bei jeder Variantenauswahl auch die Funktion neu aufrufen… Gibt es da ähnlich dem “_newitem” Event auch einen für eine Variantenauswahl?

[{foreach from=$_newitem item=myList}]
[{ $myList->oxarticles__oxid->value }]
[{/foreach}]

Schönen Sonntag :slight_smile:

Hi foxido!

Danke für den Hint -> aber ich glaube ich benötige etwas anderes… Wenn ich das nun richtig verstanden habe muss ich eine funktion implementieren und als “widget” registrieren. Immer wenn dann die Variante geändert wird muss ich per ajax auch dieses widget aufrufen. das müsste dann den richtigen Wert schreiben, oder?

Wird derzeit ein Artikel in den Warenkorb gelegt, dann hat der schon die richtige Artikelnummer - nur eben bei den Aufrufen der details.tpl wird immer die Basis-Artikelnummer gesetzt…

btw. du hast ja einige sehr interessante Module… nur find ich den link zum shop nicht wirklich!!! kann das sein?

LG

[QUOTE=onethirtytwo;184207]Wird derzeit ein Artikel in den Warenkorb gelegt, dann hat der schon die richtige Artikelnummer - nur eben bei den Aufrufen der details.tpl wird immer die Basis-Artikelnummer gesetzt… [/QUOTE]

Wenn es wichtig ist, den letzten, in den Warenkorb gelegten, Artikel in den Details erneut abzurufen, schreibe

$myList->oxarticles__oxid->value

vor dem Löschen als Wert in die Session und rufe den Wert in den Details ab.

Shop gibt es keinen. Abwicklung erfolgt per Mail. Alles kann vorher individuell getestet werden.

Hi foxido!
Verstanden - aber das mit dem Warenkorb funktioniert schon fein.
Aktuell kann das Teil:

  • normale PageViews tracken
  • Produkte im Warenkorb tracken
  • Purchase Event sauber übertragen

was jetzt fehlt ist:
Öffne ich eine Artikel-Detailseite muss ich in diesem “Moment” einen JS-Call machen, der an fb überträgt welches Produkt gerade angezeigt wird.

zb:

<script>				fbq('track', 'ViewContent',{content_type: 'product',content_ids: ['ARTNUM'], content_name: 'ARTIKELBEZEICHNUNG',content_category: 'KATEGORIE',value: '17.95',currency: 'EUR'});</script>

Das funktioniert derzeit (nur) wenn ich eine Detailseite aufrufe - übertragen wir dann aber die “Basis-Artikelnummer” des Vaterartikels. (Hier Problem 2: Derzeit exportiert mein Feed NUR die Varianten, nicht aber die Vaterartikel).

Wähle ich bei den Produkten jetzt eine Variante aus - zb. BLAU - dann muss ich einen neuen Call absetzen. Denn dann handelt es sich für google/facebook ja um ein anderes Produkt.

<script>fbq('track', 'ViewContent',{content_type: 'product',content_ids: ['ARTNUM-1'],content_name: 'ARTIKEL in BLAU',content_category: 'KATEGORIE',value: '17.95',currency: 'EUR'});</script>

damit ich das machen kann muss ich das ganze - so hab ichs verstanden - als widget umsetzen und dieses dann auch noch im ajax-call berücksichtigen, oder?

eine andere Option fällt mir dazu nicht ein?!?! (ausser das sehr unsauber an die per jquery an das varianten-dropdown zu hängen :slight_smile:

so würde dann jedes wirklich betrachtete Produkt sauber getracked werden.

Ach so war das gemeint. Such mal nach

[{if $oViewConf->getFbAppId()}]
    [{oxscript add="$(function(){oxFacebook.initDetailsPagePartial();});"}]
[{/if}]

Moin.

wie ist denn euer Status hier ?

Gibt es eine Möglichkeit die facebook Aktivitäten zu tracken?

Ich benötige es für gescheites Retargeting/Dynamic Product Ads.

Würd mich über eine Antwort freuen.

Gruß MIchael

wenn noch interesse besteht modul ist fertig