composer require alexwestergaard/php-ga4
Die Europäische Union hat mitgeteilt, dass Google Analytics standardmäßig nicht der DSGVO entspricht. Dies liegt daran, dass der Frontend-Client Besucherdetails wie ihre IP-Adresse und Geräteinformationen mit Ereignissen sendet. Dies kann mit einem Zwischenserver innerhalb der Europäischen Region vermieden werden.
Für die Einrichtung sind eine Mess-ID und ein API-Geheimnis erforderlich. Gehen Sie zu Administrator (unten links) -> Konto -> Datenströme -> {Ihr Stream}. Hier sollten Sie oben die Mess-ID und etwas weiter unten auf der Seite „API-Geheimnisse für das Messprotokoll“ finden, wo Sie selbst ein API secret
erstellen können.
Gehen Sie zum Administrator
(unten links) und wählen Sie dann Ihr Account
-> Data Streams
-> Ihren Stream aus.
Hier finden Sie oben Measurement-ID
und weiter unten Api Secrets for Measurement Protocol
. Dort können Sie sich ein API Secret
erstellen.
Sobald Sie die Zugangsdaten erhalten haben, können Sie Analytics wie folgt initialisieren:
use AlexWestergaard PhpGa4 Analytics ;
$ analytics = Analytics:: new (
measurement_id: ' G-XXXXXXXX ' ,
api_secret: ' xYzzX_xYzzXzxyZxX ' ,
debug: true | false #Default: False
);
Serverseitiges Tagging soll den Frontend-Client nicht ersetzen und die Sitzungsinitiierung sollte über den gtag.js
-Client erfolgen. Der Standardablauf soll wie folgt ablaufen:
_ga
und _gid
-Cookies zurück an Client/GTAG.js_ga
(oder _gid
), um Ereignisse zu senden/aufzufüllen Hinweis: Es ist durchaus möglich, Ereignisse an das Backend zu übertragen, ohne die Sitzungscookies von Google Analytics zu erwerben; Sie verlieren jedoch die in der GTAG.js
-Anfrage gebündelten Informationen, wenn Sie nicht herausfinden, wie Sie diese auch über das Backend übertragen können. Sie können die Sitzungen _ga
und _gid
durch Ihre eigene, eindeutig generierte ID ersetzen.
Alle Anfragen sollten dieser Struktur folgen und mindestens ein Ereignis enthalten, damit Google Analytics es akzeptieren kann.
Analytics [
Events [
Event {
Parameters
? Items [
Item Parameters
]
}
]
User Properties [
Properties {
Key: Value
}
]
? Consent {
Key: Value
}
? User Data {
Key: Value
}
]
Dies ist eine Liste vorgefertigter Ereignisse, wie in der Dokumentation gezeigt. Alle Ereignisse verfügen über die folgenden Parameter, um den Auslöserort jedes Ereignisses zu lokalisieren.
// Manual setting of each event
$ event -> setLanguage (string $ var );
$ event -> setPageLocation (string $ var );
$ event -> setPageReferrer (string $ var );
$ event -> setPageTitle (string $ var );
$ event -> setScreenResolution (string $ var );
// Fillable for multiple events
$ eventPage = AlexWestergaard PhpGa4 Helper EventParamsHelper ();
$ event -> setEventPage ( $ eventPage );
Diese Bibliothek wurde für die serverseitige Nachverfolgung im Backend entwickelt, aber die meisten Ereignisse werden Sie wahrscheinlich über das Frontend mit Javascript oder Websockets auslösen. Es wird zwei Beispiele geben, eines als reines Backend für protokollierte/in die Warteschlange gestellte Ereignisse und eines für die Frontend-zu-Backend-Kommunikation.
use AlexWestergaard PhpGa4 Exception ;
use AlexWestergaard PhpGa4 Analytics ;
use AlexWestergaard PhpGa4 Event ;
use AlexWestergaard PhpGa4 Item ;
// require vendor/autoload.php
$ visitors = getVisitorsAndEvents (); // pseudo function, make your own logic here
foreach ( $ visitors as $ collection ) {
// Group of events, perhaps need logic to change from json or array to event objects
// Maybe its formatted well for the > ConvertHelper::parseEvents([...]) < helper
$ groups = $ collection [ ' events ' ];
// If gtag.js, this can be the _ga or _gid cookie
// This can be any kind of session identifier
// Usually derives from $_COOKIE['_ga'] or $_COOKIE['_gid'] set by GTAG.js
$ visitor = $ collection [ ' session_id ' ];
// load logged in user/visitor
// This can be any kind of unique identifier, readable is easier for you
// Just be wary not to use GDPR sensitive information
$ user = $ collection [ ' user_id ' ];
// Render events grouped on time (max offset is 3 days from NOW)
foreach ( $ groups as $ time => $ data ) {
try {
$ analytics = Analytics:: new ( $ measurementId , $ apiSecret )
-> setClientId ( $ visitor )
-> setTimestampMicros ( $ time );
if ( $ user !== null ) {
$ analytics -> setUserId ( $ user );
}
$ analytics -> addUserParameter (... $ data [ ' userParameters ' ]); // pseudo logic for adding user parameters
$ analytics -> addEvent (... $ data [ ' events ' ]); // pseudo logic for adding events
$ analytics -> post (); // send events to Google Analytics
} catch ( Exception Ga4Exception $ exception ) {
// Handle exception
// Exceptions might be stacked, check: $exception->getPrevious();
}
}
}
// array< array< eventName, array<eventParams> > >
axios . post ( "/your-api-endpoint/ga4-event-receiver" , [
// Note each event is its own object inside an array as
// this allows to pass the same event type multiple times
{
addToCart : {
currency : "EUR" ,
value : 13.37 ,
items : [
{
item_id : 1 ,
item_name : "Cup" ,
price : 13.37 ,
quantity : 1 ,
} ,
] ,
} ,
} ,
] ) ;
use AlexWestergaard PhpGa4 Helper ConvertHelper ;
use AlexWestergaard PhpGa4 Exception ;
use AlexWestergaard PhpGa4 Analytics ;
use AlexWestergaard PhpGa4 Event ;
// require vendor/autoload.php
try {
$ events = ConvertHelper:: parseEvents ( $ _POST );
Analytics:: new ( $ measurementId , $ apiSecret )
-> addEvent (... $ events )
-> post ();
} catch ( Exception Ga4Exception $ exception ) {
// Handle exception
// Exceptions might be stacked, check: $exception->getPrevious();
}
Sie können Ihre eigenen benutzerdefinierten Ereignisse erstellen. Sie müssen lediglich die Fassade/Schnittstelle AlexWestergaardPhpGa4FacadeTypeEventType
implementieren und ausfüllen. Wenn Sie benutzerfreundliche Funktionen wünschen, können Sie Ihr Event von AlexWestergaardPhpGa4HelperEventHelper
aus erweitern und nach Belieben überschreiben.
// EventHelper implements AlexWestergaardPhpGa4FacadeTypeEventType
class ExampleEvent extends AlexWestergaard PhpGa4 Helper EventHelper
{
// variables should be nullable as unset() will set variable as null
protected null | mixed $ my_variable ;
protected null | mixed $ my_required_variable ;
// Arrays should always be instanciated empty
protected array $ my_array = [];
public function getName (): string
{
return ' example_event ' ;
}
public function getParams (): array
{
return [
' my_variable ' ,
' my_array ' ,
];
}
public function getRequiredParams (): array
{
return [
' my_required_variable ' ,
];
}
public function setMyVariable ( string $ value )
{
$ this -> my_variable = $ value ;
return $ this ; // Allows chained events
}
public function setMyRequiredVariable ( string $ value )
{
$ this -> my_required_variable = $ value ;
return $ this ; // Allows chained events
}
}
Das Messprotokoll für GA4 verfügt über Debug-Funktionalität, die mit dem debug
Parameter im Analytics-Konstruktor aktiviert werden kann.
$ analytics = Analytics:: new (
measurement_id: ' G-XXXXXXXX ' ,
api_secret: ' xYzzX_xYzzXzxyZxX ' ,
debug: true // default: false
);
Wenn Debug
aktiviert ist, werden Ereignisse an https://www.google-analytics.com/debug/mp/collect
gesendet, wo Probleme mit GA4Exception abgefangen werden (Achten Sie auf $exception->getPrevious()
-Stacks); Eine solche Antwort sieht wie folgt aus:
{
"validationMessages" : [
{
"fieldPath" : " events " ,
"description" : " Event at index: [0] has invalid name [_badEventName]. Names must start with an alphabetic character. " ,
"validationCode" : " NAME_INVALID "
}
]
}
Hinweis: Diese Bibliothek überprüft bereits, ob Ereignisse ordnungsgemäß formatiert sind, wenn sie zu Analytics hinzugefügt werden ( $analytics->addEvent(...)
).
Zwei wichtige Punkte:
debugView
im Google Analytics-Administrator angezeigt werden. page_view
Ereignis funktioniert, ist jedoch nicht in der offiziellen Dokumentation dokumentiert, also verlassen Sie sich nicht darauf.