=== Google Tag Manager for WordPress === Contributors: duracelltomi Donate link: https://gtm4wp.com/ Tags: google tag manager, tag manager, gtm, google, adwords, google adwords, google ads, adwords remarketing, google ads remarketing, remarketing, google analytics, analytics, facebook ads, facebook remarketing, facebook pixel, google optimize, personalisation Requires at least: 3.4.0 Requires PHP: 5.6 Tested up to: 5.2.4 Stable tag: 1.11.2 License: GPLv3 License URI: http://www.gnu.org/licenses/gpl.html Advanced measurement/advertising tag management and site personalisation for WordPress with Google Tag Manager and Google Optimize == Description == Google Tag Manager (GTM) is Google's free tool for everyone to manage and deploy analytics and marketing tags as well as other code snippets using an intuitive web UI. To learn more about this tool, visit the [official website](https://www.google.com/analytics/tag-manager/). This plugin places the GTM container code snippets onto your wordpress website so that you do not need to add this manually. Multiple containers are also supported! The plugin complements your GTM setup by pushing page meta data and user information into the so called data layer. Google's official help pages includes [more details about the data layer](https://developers.google.com/tag-manager/devguide#datalayer). You can also add your Google Optimize container with the [recommended code setup](https://support.google.com/optimize/answer/7359264?hl=en) **Some parts of the plugin require PHP 5.6 newer. PHP 7.0 or newer is recommended.** Please note that PHP 5.6 is nearing its end of life cycle thus it is recommended to upgrade. If you are not sure which version you are using, please contact your hosting provider for support. = GTM container code placement = The original GTM container code is divided into two parts: The first part is a javascript code snippet that is added to the `` section of every page of the website. This part is critical to enable all features of GTM, and this plugin helps to place this part correctly on your site. The second part is an iframe snippet that acts as a failsafe/fallback should users' JavaScript be disabled. Google recommends – for best performance – to place this code snippet directly after the opening `` tag on each page. Albeit not ideal, it will work when placed lower in the code. This plugin provides a code placement option for the second code snippet. Inherently, Wordpress does not offer a straight-forward solution to achieve this, however Yaniv Friedensohn showed me a solution that works with most themes without modification: http://www.affectivia.com/blog/placing-the-google-tag-manager-in-wordpress-after-the-body-tag/ I added this solution to the plugin, currently as an experimental option. Sites using the Genesis Framework should choose the "Custom" placement option. No theme modification is needed for this theme however, the Google Tag Manager container code will be added automatically. = Basic data included = * post/page titles * post/page dates * post/page category names * post/page tag names * post/page author ID and names * post/page ID * post types * post count on the current page + in the current category/tag/taxonomy * logged in status * logged in user role * logged in user ID (to track cross device behaviour in Google Analytics) * logged in user email address (to comply with [GTM terms of service](https://www.google.com/analytics/tag-manager/use-policy/) do not pass this on to Google tags) * site search data * site name and id (for WordPress multisite instances) = Browser / OS / Device data = (beta) * browser data (name, version, engine) * OS data (name, version) * device data (type, manufacturer, model) Data is provided using the WhichBrowser library: http://whichbrowser.net/ = Weather data = (beta) Push data about users' current weather conditions into the dataLayer. This can be used to generate weather-related audience/remarketing lists on ad platforms and allows for user segmentation in your web analytics solutions: * weather category (clouds, rain, snow, etc.) * weather description: more detailed data * temperature in Celsius or Fahrenheit * air pressure * wind speed and degrees Weather data is queried from Open Weather Map. Depending on your websites traffic, additional fees may apply: http://openweathermap.org/price An (free) API key from OpenWeatherMap is required for this feature to work. ipstack.com is used to determine the site visitor's location. A (free) API key from IPStack.com is required for this feature to work: https://ipstack.com/product = Media player events = (experimental) Track users' interaction with any embedded media: * YouTube * Vimeo * Soundcloud DataLayer events can be chosen to fire upon media player load, media is being played, paused/stopped and optionally when the user reaches 10, 20, 30, ..., 90, 100% of the media duration. Tracking is supported for embedded media using the built-in oEmbed feature of WordPress as well as most other media plugins and copy/pasted codes. Players injected into the website after page load are not currently supported. = Scroll tracking = Fire tags based on how the visitor scrolls from the top to the bottom of a page. An example would be to separate "readers" (who spend a specified amount of time on a page) from "scrollers" (who only scroll through within seconds). You can use these events to fire Analytics tags and/or remarketing/conversion tags (for micro conversions). Scroll tracking is based on the solution originally created by * Nick Mihailovski * Thomas Baekdal * Avinash Kaushik * Joost de Valk * Eivind Savio * Justin Cutroni Original script: http://cutroni.com/blog/2012/02/21/advanced-content-tracking-with-google-analytics-part-1/ = Google Ads remarketing = Google Tag Manager for WordPress can add each dataLayer variable as a Google Ads remarketing custom parameter list. This enables you to build sophisticated remarketing lists. = Blacklist & Whitelist Tag Manager tags and variables = To increase website security, you have the option to white- and blacklist tags/variables. You can prevent specific tags from firing or the use of certain variable types regardless of your GTM setup. If the Google account associated with your GTM account is being hacked, an attacker could easily execute malware on your website without accessing its code on your hosting server. By blacklisting custom HTML tags and/or custom JavaScript variables you can secure the Tag Manager container. = Integration = Google Tag Manager for WordPress integrates with several popular plugins. More integration to come! * Contact Form 7: fire an event upon successful form submission * WooCommerce: * Classic e-commerce: * fire an event when visitors add products to their cart * capture transaction data to be passed to your ad platforms and/or Analytics * capture necessary remarketing parameters for Google Ads Dynamic Remarketing * Enhanced e-commerce (beta): * implementation of [Enhanced E-commerce](https://developers.google.com/tag-manager/enhanced-ecommerce) * Does not support promotions since WooCommerce does not have such a feature (yet) * Does not support refunds == Installation == 1. Upload `duracelltomi-google-tag-manager-for-wordpress` to the `/wp-content/plugins/` directory 1. Activate the plugin through the 'Plugins' menu in WordPress 1. Go to Settings / Google Tag Manager and enter your Google Tag Manager container ID and set additional options == Frequently Asked Questions == = How can I ... = Tutorials for various Google Tag Manager settings and implementation are available on my website: https://gtm4wp.com/how-to-articles/ = PayPal / 3rd party payment gateway transactions in WooCommerce are not being tracked in Google Analytics = PayPal and some other 3rd party payment gateways do not redirect users back to your website upon successful transaction by default. It offers the route back for your customer but it can happen that users close the browser before arriving at your thankyou page (aka. order received page). This means that neither Google Analytics tags or any other tags have the chance to fire. Enable auto-return in your payment gateway settings. This will instruct them to show a quick info page after payment and redirect the user back to your site. This will improve the accuracy and frequency of tracked transactions. = Why isn't there an option to blacklist tag/variable classes = Although Google recommends to blacklist tags and variables using classes, people struggle to know which tags/variables gets affected. Therefore I opted for individual tags and variables rather than classes on the blacklist tabs. Regarding variables; ensure they are not part of any critical tags as blacklisting such variables will render said tags useless. = How can I track scroll events in Google Tag Manager? = Google Tag Manager supports basic scroll depth tracking based on percentage or pixels natively. This plugin adds additional scroll tracking events, more focused on capturing the users' intent and/or engagement. There are five dataLayer events you can use in your rule definitions: * gtm4wp.reading.articleLoaded: the content has been loaded * gtm4wp.reading.startReading: the visitor started to scroll. The `timeToScroll` dataLayer variable stores duration since the article loaded (in seconds) * gtm4wp.reading.contentBottom: the visitor reached the end of the content (not the page!). `timeToScroll` dataLayer variable updated * gtm4wp.reading.pagebottom: the visitor reached the end of the page. `timeToScroll` dataLayer variable updated * gtm4wp.reading.readerType: based on time spent since article loaded we determine whether the user is a 'scanner' or 'reader' and store this in the `readerType` dataLayer variable Example use cases: using these events as triggers, you can fire Google Universal Analytics and/or Google Ads remarketing/conversion tags to report micro conversions and/or to serve ads only to visitors who spend more time reading your content. = Can I exclude certain user roles from being tracked? = This is easily managed through GTM itself. If you want to exclude logged in users or users with certain user roles, use the corresponding dataLayer variable (visitorType) and an exclude filter in Google Tag Manager. https://gtm4wp.com/how-to-articles/how-to-exclude-admin-users-from-being-tracked/ = How do I put the Google Tag Manager container code next to the opening body tag? = By default the plugin places the iframe tag in the footer of the page. To change it, go to the plugin's admin section and select "Custom" from the placement settings. Unless you use the Genesis Framework theme, you will also need to edit your template files. Go to `wp-content/plugins/themes/` and edit `header.php`. In most cases you will find the opening `` tag here. If you can not find it, contact the author of the theme and ask for instructions. Create a new line right below the `body` tag and insert this line of code: `` Be careful not to place this line within any `
`, `

`, `

`, `
` tags. It may break your theme. There is also an option named "Codeless" which attempts to place the container code correctly without additional theme tweaks. It may or may not work, this is an experimental feature, use it accordingly. = Why can't this plugin insert the container snippet after the opening body tag automatically? = Currently WordPress has two 'commands' or 'hooks' that a programmer can use: one for the `` section and one for the bottom of ``. There is no way to inject any content after the opening `` tag without manually editing your template files. Fortunately some theme authors already resolved this so in some cases you do not need to edit your template. I suggest that try the Custom placement (easiest) and use Google Tag Assistant Chrome browser extension to check whether the container code is placed as expected. If it shows an error, go ahead and edit your theme manually. = Facebook like/share/send button events do not fire for me, why? = It is a Facebook limitation. Click event tracking is only available for html5/xfbml buttons. If you or your social plugin inserts the Facebook buttons using IFRAMEs (like Sociable), it is not possible to track likes. == Screenshots == 1. Admin panel 2. Basic settings 3. Events 4. Integration panel 5. Advanced settings 6. Scroll tracking == Changelog == = 1.11.2 = WARNING! If you are upgrading directly from v1.10.x, please read the changelog of v1.11 since it includes many important notices! No change in plugin code, WP.org deployment of v1.11.1 included wrong directories = 1.11.1 = WARNING! If you are upgrading directly from v1.10.x, please read the changelog of v1.11 since it includes many important notices! * Fixed: PHP notice about undefined order_items variable if the new 'Order data in data layer' is turned off * Fixed: PHP notice about missing brand array key if no brand taxonomy is selected in GTM4WP options = 1.11 = WARNING! Please read the changelog very carefully as there are many important changes and removed features which could need your attention before updating! * Added Oxygen Builder and Beaver Builder Theme support - you can now use the codeless placement option without issues * Added ability to fix the Google Tag Manager ID and GTM Environment parameters in wp-config.php. To use it, create PHP constants with the names ** GTM4WP_HARDCODED_GTM_ID ** GTM4WP_HARDCODED_GTM_ENV_AUTH ** GTM4WP_HARDCODED_GTM_ENV_PREVIEW * Added support for WooCommerce Grouped Products * Added new WooCommerce option to add all order data into the data layer on the order reveived page ** This includes personal data of the customer -> you need to ensure this is used in a privacy friendly and compliant way! ** This order data will be always present on the order received page, even if the page is reloaded or later revisited! * Removed several unofficial data layer variables on the WooCommerce order received page as they can be read using the new order data option ** transactionDate ** transactionType ** transactionPaymentType ** transactionShippingMethod ** transactionPromoCode * Improved: price reporting with the WooCommerce enhanced ecommerce integration now follows the option set with the 'Display prices in the shop' option of WooCommerce * Improved: from WooCommerce 3.7 WC_Abstract_Order::get_used_coupons() was replaced with WC_Abstract_Order::get_coupon_codes() which is now used if WC 3.7+ is detected * Improved: use localStorage for WooCommerce duplicate transaction tracking prevention if available. Should be work with Safari at least for now. * Fixed: WooCommerce duplicate transaction tracking prevention's cookie was set to expire on session end, now adds 1 year. * Deprecated data layer variable productIsVariable. Use the new productType data layer variable which will equal to simple, variable, grouped or external depending on the type of the product shown * Fixed: Wrong lookup for product brand name if Use SKU instead of product ID option was turned on * Fixed: Wrong lookup for product brand name for variable products * Fixed: check if $woo->customer is initialized * Fixed: no checkout step reported on WooCommerce checkout page if the user has accepted the default selection of the payment and shipping methods ! Planned deprecation of support for WooCommerce 2.x-3.1.x with next plugin version ! ! Planned deprecation of support for WordPress 4.x with next plugin version ! = 1.10.1 = * Fixed: wrong cookie name was used with the newly introduced double transaction tracking protection while setting the cookie * Fixed: double transaction tracking JavaScript code is now only included on the order received page * Fixed: product impressions not properly reported if Products per impressions were set to 0 * Fixed: replaced all references to AdWords to Google Ads = 1.10 = * Added: Automatically add the noscript part of the container code after the opening body tag for WordPress 5.2+ sites where themes support the new wp_body_open action * Added: add associated taxonomy values for post type * Added: select brand taxonomy for WooCommerce products to populate "Product brand" dimension in enhanced ecommerce * Added: add cart content into data layer so that you can personalize your site experience using Google Optimize * Added: option to remove shipping costs from revenue data on order received page of WooCommerce * Added: if you enable either enhanced ecommerce or just Google Ads remarketing variables, 3 new data layer variables will be also available about the product on a detail page * Product rating details (productRatingCounts) * Average product rating (productAverageRating) * Review count (productReviewCount) * Added: if you are using Cloudflare, you can now add the country code HTTP header value into the data layer and read from it with the geoCloudflareCountryCode variable name * Fixed: better compatibility with Google's mod_pagespeed * Fixed: missing product quantity while adding a variable product into the cart * Fixed: prevent multiple tracking of WooCommerce orders on mobile devices where the mobile browser reloads the order received page from local cache executing GTM tracking again = 1.9.2 = * Fixed: possible PHP warning if geo data or weather data feature is turned on = 1.9.1 = * Fixed: handle out of quota cases with ipstack queries properly * Fixed: proper YouTube tracking for WordPress sites and WordPress multisites installed in a subdirectory * Fixed: properly detect client IP address and also properly escape this data while using it * Fixed: WooCommerce checkout steps after page load did not include products in the cart * Fixed: checkout step events for payment mode and shipping type not always fired * Fixed: the CMD on Mac will be treated just like the Ctrl key on Windows while processing the product click event in the WooCommerce integration (thy for luzinis) * Fixed: add currencyCode to every ecommerce action in WooCommerce integration * Fixed: better WooCommere Quick View integration * Fixed: possible cross site scripting vulnerability if site search tracking was enabled due to not properly escaped referrer url tracking * Changed: code cleanup in WooCommerce integration = 1.9 = * Added: initial support for AMP plugin from Automattic (thx koconder for the contribution!) * Added: option to remove tax from revenue data on order received page of WooCommerce * Added: WooCommerce enhanced ecommerce datasets now include stock levels * Added: new productIsVariable data layer variable is set to 1 on variable WooCommerce product pages * Added: product impressions can now be split into multiple chunks to prevent data loss on large product category and site home pages (thx Tim Zook for the contribution!) * IMPORTANT! You will need to update your GTM setup, please read the new Step 9 section of the [setup tutorial page](https://gtm4wp.com/how-to-articles/how-to-setup-enhanced-ecommerce-tracking). * Added: you can now disable flagging of WooCommerce orders as being already tracked once. In same cases (with iDeal for example) you may need this to make purchase tracking to work. * Added: uninstalling the plugin will now remove configured plugin options from database * Added: new advanced plugin option: data layer variable visitorDoNotTrack will include 1 if the user has set the [do not track flag](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/DNT) in his/her browser * Added: new data layer event when a user has logged in on the frontend: gtm4wp.userLoggedIn * Added: new data layer event when a new user has registered on the frontend: gtm4wp.userRegistered * Added: new advanced plugin option: move data layer declaration and Google Tag Manager container as close as possible to the beginning of the HTML document * Added: better WP Rocket support * Updated: Full Google Optimize support. Now the plugin can load your Google Optimize container with the [recommended code placement](https://support.google.com/optimize/answer/7359264?hl=en) * Updated: moved most of the inline JavaScript codes into separate .js files which should help cache plugins to do their job much better when my plugin is active * Fixed: wrong ecomm_pagetype on product search result pages * Fixed: PHP notice in some cases when geo data was not loaded properly * Fixed / Added: freegeoip.net was rebranded to ipstack.com and an API key is needed now even for free usage. You can now add your API key so that weather data and geo data can be added into the data layer * Warning: some plugin features will be remove from v1.10, most of them can be tracked now using pure Google Tag Manager triggers: * Social actions * Outbound link click events * Download click events * Email click events * Warning: PHP 5.6 is now the minimum recommended version to use this plugin. I advise to move to PHP 7.x = 1.8.1 = * Added: new visitorIP data layer variable to support post-GDPR implementations where for example internal traffic exclusion has to be made inside the browser * Fixed: JavaScript error around the variable gtm4wp_use_sku_instead * Fixed: added _ as a valid character for gtm_auth GTM environment variable * Fixed: corrected typo - gtm4wp.checkoutStepE**E**C * Fixed: two strings were not recognized by WordPress Translate on the admin page * Fixed: some other plugins call found_variation event of WooCommerce without product variation data being included * Fixed: product name included variation name on order received page which broke GA product reports * Fixed: in some cases, no contact form 7 data was being passed to the gtm4wp.contactForm7Submitted event * Updated: added CDATA markup around container code for better DOM compatibility * Updated: removed 'SKU:' prefix text from classic ecommerce dimension as it broke some enhanced ecommerce reports = 1.8 = * Fixed: weather data tracking codes could result in fatal PHP error * Fixed: cart events did to fire while user pressed the Enter key in quantity fields * Fixed: contact form 7 changed some code which prevented successful form submission tracking * Changed: links to plugin website updated * Changed: gtm4wp.cf7formid data layer variable now includes the ID of the form in WordPress * Added: gtm4wp.cf7inputs includes data that has been filled in the form * Added: [WooCommerce compatibility headers](https://docs.woocommerce.com/document/create-a-plugin/#section-10) * Added: admin warning for WooCommerce 2.x users. This plugin will drop support for WooCommerce 2.x soon * Added: postFormat data layer variable on singular pages * Added: customer* data layer variables with stored billing and shipping data, total number of orders and total value of those orders (needs WooCommerce 3.x) * Added: geo* data layer variables to get country, city, lat-lon coordinates of the visitor * Added: visitorUsername data layer variable with the username of the logged in user * Added: more detailed checkout reporting for WooCommerce sites * Add gtm4wp.checkoutStepEEC to your Ecommerce Helper trigger * Change a typo: gtm4wp.checkoutOptionE**C**C => gtm4wp.checkoutOptionE**E**C * Added: option to include full product category path in enhanced ecommerce reporting (can cause performance issues on large sites!) * Added: initial support for [Google Tag Manager Environments](https://support.google.com/tagmanager/answer/6311518?hl=en) * Added: support for [WooCommerce Quick View plugin](https://woocommerce.com/products/woocommerce-quick-view/) * Updated: description of code placement options to clarify what this option does * Updated: cleanup of readme.txt, spelling and grammar improvements * Updated: bundled WhichBrowser lib v2.0.32 = 1.7.2 = * Fixed: in some cases, the remove item from cart link in a WooCommerce cart was not altered properly with additional tracking codes * Fixed: product categories were empty in the cart, on the checkout pages and on the order received page for product variations * Fixed: checkout option data included checkout step #1 if cart page was setup to be the first * Fixed: even more WooCommerce 3.x compatibility * Added: registration date of the logged in user can be added to the data layer * Updated: geoplugin.net has been replaced by freegeoip.net for weather tracking which has far better quota for free usage * Updated: Google Ads dynamic remarketing data layer items on a WooCommerce product page will be shown for the root product as well on variable product pages * Updated: Selecting a product variation will include the price of the product in Google Ads dynamic remarketing data layer items * Updated: minor code cleanup = 1.7.1 = * Fixed: PHP 5.3 compatible syntax in frontend.php * Fixed: PHP error using classic ecommerce with WooCommerce 2.6.x * Updated: Added data-cfasync='false' to all