🢂Google Tag Manager Data Layer ‑ Plugin
Wtyczka umożliwia to dokładniejsze śledzenie i analizę danych użytkowników oraz zawartości strony.
Co robi ta wtyczka
Wtyczka "Google Tag Manager Data Layer" pozwala na zaawansowaną integrację z Google Tag Managerem poprzez pobieranie i wysyłanie różnorodnych danych z WordPressa. Umożliwia to dokładniejsze śledzenie i analizę danych użytkowników oraz zawartości strony, co jest przydatne w zaawansowanych konfiguracjach analitycznych i marketingowych.
Opis funkcjonalności:
- Dodanie Ustawień w Panelu Administracyjnym:
- Wtyczka dodaje stronę ustawień w panelu administracyjnym WordPressa, gdzie można skonfigurować różne opcje wtyczki.
- Użytkownik może wprowadzić identyfikator Google Tag Managera (GTM ID).
- Użytkownik może wybrać, jakie dane mają być wysyłane do Google Tag Managera.
- Użytkownik może wybrać miejsce umieszczenia kodu GTM (w nagłówku lub stopce strony).
- Rejestracja Ustawień:
- Wtyczka rejestruje ustawienia takie jak GTM ID, punkty danych do wysłania i miejsce umieszczenia kodu.
- Generowanie i Umieszczanie Kodu GTM:
- Na podstawie ustawień użytkownika, wtyczka generuje kod Google Tag Managera i umieszcza go w wybranym miejscu (nagłówek lub stopka strony).
- Załączenie Biblioteki UAParser.js:
- Wtyczka ładuje bibliotekę UAParser.js, która jest używana do pobierania danych o przeglądarce, systemie operacyjnym i urządzeniu użytkownika.
- Ustawienie Pliku Cookie Typu Odwiedzającego:
- Wtyczka ustawia plik cookie
gtm_visitor_type
w celu rozróżnienia nowych i powracających użytkowników.
- Wtyczka ustawia plik cookie
- Pobieranie i Wysyłanie Danych do GTM:
- Wtyczka pobiera różne dane z WordPressa i umieszcza je w warstwie danych Google Tag Managera (dataLayer).
- Dane obejmują: tytuł strony/postu, datę publikacji, kategorie, tagi, autora, ID postu/strony, typ postu, format postu, liczbę postów, niestandardowe terminy, status zalogowania, rolę zalogowanego użytkownika, ID użytkownika, email użytkownika (oraz jego skrót SHA256), datę utworzenia użytkownika, dane wyszukiwania na stronie, nazwę i ID witryny, adres IP (jeśli uzyskano zgodę użytkownika), dane przeglądarki, systemu operacyjnego, urządzenia, typ odwiedzającego (nowy/powracający), liczbę komentarzy, szablon strony, ID rodzica, tytuł rodzica, elementy menu, wersję WordPressa, aktywne wtyczki i dane motywu.
Jak działa ta wtyczka, krok po kroku
- Strona Ustawień:
- Dodaje stronę ustawień w menu administracyjnym WordPressa.
- Użytkownik może skonfigurować GTM ID, wybrać jakie dane mają być wysyłane i wybrać miejsce umieszczenia kodu GTM.
- Pobieranie Danych:
- Pobiera dane dotyczące użytkownika, postów, stron, kategorii, tagów, przeglądarki, systemu operacyjnego, urządzenia i wiele innych.
- Dane te są przygotowywane do wysłania do Google Tag Managera.
- Warstwa Danych (dataLayer):
- Wtyczka dodaje dane do warstwy danych Google Tag Managera, która jest następnie wykorzystywana przez skrypty GTM do analizy i śledzenia.
- Integracja z UAParser.js:
- Po załadowaniu strony, wtyczka wykorzystuje UAParser.js do pobrania danych o przeglądarce, systemie operacyjnym i urządzeniu użytkownika i dodaje te dane do warstwy danych.
Kod wtyczki
Skopiuj kod i zapisz do pliku o nazwie gtm-wh.php
w folderze plugins
.
<?php
/**
* Plugin Name: Google Tag Manager Data Layer
* Description: Integrates Google Tag Manager and sends various post/page and user data.
* Version: 1.0
* Author: WirtualnyHandlowiec.pl
*/
// Add Settings Page
function gtm_add_settings_page()
{
add_options_page(
'GTM Data Layer Settings',
'GTM Data Layer',
'manage_options',
'gtm-data-layer-settings',
'gtm_render_settings_page'
);
}
add_action('admin_menu', 'gtm_add_settings_page');
// Render Settings Page
function gtm_render_settings_page()
{
?>
<div class="wrap">
<h1>Google Tag Manager Data Layer Settings</h1>
<form method="post" action="options.php">
<?php
settings_fields('gtm_data_layer_settings_group');
do_settings_sections('gtm-data-layer-settings');
submit_button();
?>
</form>
</div>
<?php
}
// Register Settings
function gtm_register_settings()
{
register_setting('gtm_data_layer_settings_group', 'gtm_id');
register_setting('gtm_data_layer_settings_group', 'gtm_data_points', 'gtm_sanitize_data_points');
register_setting('gtm_data_layer_settings_group', 'gtm_code_placement');
add_settings_section(
'gtm_data_layer_main_section',
'Main Settings',
null,
'gtm-data-layer-settings'
);
add_settings_field(
'gtm_id',
'Google Tag Manager ID',
'gtm_render_gtm_id_field',
'gtm-data-layer-settings',
'gtm_data_layer_main_section'
);
add_settings_field(
'gtm_data_points',
'Data Points to Send',
'gtm_render_gtm_data_points_field',
'gtm-data-layer-settings',
'gtm_data_layer_main_section'
);
add_settings_field(
'gtm_code_placement',
'Code Placement',
'gtm_render_gtm_code_placement_field',
'gtm-data-layer-settings',
'gtm_data_layer_main_section'
);
}
add_action('admin_init', 'gtm_register_settings');
// Render GTM ID Field
function gtm_render_gtm_id_field()
{
$gtm_id = get_option('gtm_id', '');
echo '<input type="text" name="gtm_id" value="' . esc_attr($gtm_id) . '" />';
}
// Render Data Points Field
function gtm_render_gtm_data_points_field()
{
$data_points = get_option('gtm_data_points', []);
$available_data_points = [
'postTitle' => 'Post/Page Title',
'postUrl' => 'Post/Page URL',
'menuItems' => 'Menu Items',
'parentID' => 'Parent ID',
'parentTitle' => 'Parent Title',
'postDate' => 'Post/Page Date',
'postCategories' => 'Post/Page Categories',
'postTags' => 'Post/Page Tags',
'postAuthor' => 'Post/Page Author',
'postID' => 'Post/Page ID',
'postType' => 'Post Type',
'customTerms' => 'Custom Terms',
'loggedInStatus' => 'Logged In Status',
'loggedInUserRole' => 'Logged In User Role',
'loggedInUserID' => 'Logged In User ID',
'siteSearchData' => 'Site Search Data',
'siteDomain' => 'Site Domain',
'siteDescription' => 'Site Description',
'siteID' => 'Site ID',
'siteLanguage' => 'Site Language',
'ipAddress' => 'IP Address',
'browserData' => 'Browser Data',
'osData' => 'OS Data',
'deviceData' => 'Device Data',
'visitorType' => 'Visitor Type',
'commentsCount' => 'Comments Count',
'pageTemplate' => 'Page Template',
'wordpressVersion' => 'WordPress Version',
'themeData' => 'Theme Data'
];
foreach ($available_data_points as $key => $label) {
$checked = in_array($key, $data_points) ? 'checked' : '';
echo '<label><input type="checkbox" name="gtm_data_points[]" value="' . esc_attr($key) . '" ' . $checked . ' /> ' . esc_html($label) . '</label><br>';
}
}
// Render Code Placement Field
function gtm_render_gtm_code_placement_field()
{
$placement = get_option('gtm_code_placement', 'header');
?>
<select name="gtm_code_placement">
<option value="header" <?php selected($placement, 'header'); ?>>Header</option>
<option value="footer" <?php selected($placement, 'footer'); ?>>Footer</option>
</select>
<?php
}
// Sanitize Data Points
function gtm_sanitize_data_points($input)
{
return is_array($input) ? array_map('sanitize_text_field', $input) : [];
}
// Enqueue Google Tag Manager Script
function gtm_enqueue_script()
{
$gtm_id = get_option('gtm_id', '');
if (empty($gtm_id)) {
return;
}
$script = "<!-- Google Tag Manager -->
<script data-pagespeed-no-defer data-no-optimize>
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','" . esc_js($gtm_id) . "');
</script>
<!-- End Google Tag Manager -->";
echo $script;
}
// Determine Placement of GTM Script
function gtm_insert_script()
{
$placement = get_option('gtm_code_placement', 'header');
if ($placement === 'header') {
add_action('wp_head', 'gtm_enqueue_script',-9999);
} else {
add_action('wp_footer','gtm_enqueue_script', 9999);
}
}
add_action('init', 'gtm_insert_script');
// Enqueue UAParser.js
function gtm_enqueue_uaparser()
{
wp_enqueue_script('uaparser', 'https://cdnjs.cloudflare.com/ajax/libs/UAParser.js/0.7.31/ua-parser.min.js', [], null, true);
}
add_action('wp_enqueue_scripts', 'gtm_enqueue_uaparser');
// Set Visitor Type Cookie
function gtm_set_visitor_type_cookie()
{
if (!isset($_COOKIE['gtm_visitor_type'])) {
setcookie('gtm_visitor_type', 'new', time() + 31536000, COOKIEPATH, COOKIE_DOMAIN);
} else {
setcookie('gtm_visitor_type', 'returning', time() + 31536000, COOKIEPATH, COOKIE_DOMAIN);
}
}
add_action('init', 'gtm_set_visitor_type_cookie');
// Get Visitor Type
function gtm_get_visitor_type()
{
return isset($_COOKIE['gtm_visitor_type']) ? sanitize_text_field($_COOKIE['gtm_visitor_type']) : 'new';
}
// Send Data to Google Tag Manager
function gtm_data_layer()
{
$data_points = get_option('gtm_data_points', []);
if (empty($data_points)) {
return;
}
$data = [];
if (in_array('loggedInStatus', $data_points) && is_user_logged_in()) {
$current_user = wp_get_current_user();
$data['loggedInStatus'] = 'true';
if (in_array('loggedInUserID', $data_points)) {
$data['loggedInUserID'] = $current_user->ID;
}
if (in_array('loggedInUserRole', $data_points)) {
$data['loggedInUserRole'] = implode(', ', $current_user->roles);
}
} else {
$data['loggedInStatus'] = 'false';
}
if (is_singular()) {
global $post;
if (in_array('postID', $data_points)) {
$data['postID'] = $post->ID;
}
if (in_array('postTitle', $data_points)) {
$data['postTitle'] = get_the_title($post->ID);
}
if (in_array('postUrl', $data_points)) {
$data['postUrl'] = get_permalink($post->ID);
}
if (in_array('postDate', $data_points)) {
$data['postDate'] = get_the_date('Y-m-d', $post->ID);
}
if (in_array('postType', $data_points)) {
$data['postType'] = get_post_type($post->ID);
}
if (in_array('postAuthor', $data_points)) {
$data['postAuthorID'] = $post->post_author;
$data['postAuthorName'] = get_the_author_meta('display_name', $post->post_author);
}
if (in_array('postCategories', $data_points)) {
$data['postCategories'] = wp_get_post_categories($post->ID, ['fields' => 'names']);
}
if (in_array('postTags', $data_points)) {
$data['postTags'] = wp_get_post_tags($post->ID, ['fields' => 'names']);
}
if (in_array('customTerms', $data_points)) {
$data['customTerms'] = wp_get_post_terms($post->ID);
}
if (in_array('commentsCount', $data_points)) {
$data['commentsCount'] = get_comments_number($post->ID);
}
if (in_array('pageTemplate', $data_points)) {
$data['pageTemplate'] = get_page_template_slug($post->ID);
}
if (in_array('parentID', $data_points)) {
$data['parentID'] = wp_get_post_parent_id($post->ID);
}
if (in_array('parentID', $data_points)) {
$parent_id = wp_get_post_parent_id($post->ID);
$data['parentID'] = $parent_id;
if ($parent_id) {
$data['parentTitle'] = get_the_title($parent_id);
}
}
}
if (in_array('siteSearchData', $data_points) && is_search()) {
$data['siteSearchData'] = get_search_query();
}
if (in_array('siteDescription', $data_points)) {
$data['siteDescription'] = get_bloginfo('description' );
}
if (in_array('siteDomain', $data_points)) {
$data['siteDomain'] = get_bloginfo('wpurl');
}
if (in_array('siteID', $data_points)) {
$data['siteID'] = get_current_blog_id();
}
if (in_array('siteLanguage', $data_points) ) {
$data['siteLanguage'] = get_bloginfo('language');
}
if (in_array('ipAddress', $data_points)) {
$data['ipAddress'] = $_SERVER['REMOTE_ADDR'];
}
if (in_array('categoryPostCount', $data_points) && is_category()) {
$data['categoryPostCount'] = get_queried_object()->count;
}
if (in_array('tagPostCount', $data_points) && is_tag()) {
$data['tagPostCount'] = get_queried_object()->count;
}
if (in_array('visitorType', $data_points)) {
$data['visitorType'] = gtm_get_visitor_type();
}
if (in_array('wordpressVersion', $data_points)) {
$data['wordpressVersion'] = get_bloginfo('version');
}
if (in_array('themeData', $data_points)) {
$theme = wp_get_theme();
$data['themeName'] = $theme->get('Name');
$data['themeVersion'] = $theme->get('Version');
}
?>
<script data-pagespeed-no-defer data-no-optimize>
window.dataLayer = window.dataLayer || [];
window.dataLayer.push(<?php echo json_encode($data); ?>);
document.addEventListener("DOMContentLoaded", function() {
// UAParser.js to get browser, OS, and device data
var parser = new UAParser();
var result = parser.getResult();
var uaData = {
'browserName': result.browser.name,
'browserVersion': result.browser.version,
'browserEngine': result.engine.name,
'osName': result.os.name,
'osVersion': result.os.version,
'deviceType': result.device.type,
'deviceManufacturer': result.device.vendor,
'deviceModel': result.device.model
};
window.dataLayer.push(uaData);
});
</script>
<?php
}
add_action('wp_footer', 'gtm_data_layer');