Plugin Manifest File

Store as plg_myplugin/myplugin.xml.

Something like this...

<?xml version="1.0" encoding="iso-8859-15"?>
<extension type="plugin" method="upgrade" group="system">
	<name>Organic Google Tag Manager Plugin</name>
	<author>Chris Horgan</author>
	<creationDate>Aug 2024</creationDate>
	<copyright></copyright>
	<license></license>
	<authorEmail>This email address is being protected from spambots. You need JavaScript enabled to view it.</authorEmail>
	<authorUrl>www.organicwebs.com.au</authorUrl>
	<version>5.1</version>
	<description><![CDATA[
   <div class="alert">
   <h2>OrganicWebs Google Tag Manager plugin</h2>
   <p>This Plugin adds the Tag Scripts for Google Tag Manager - used for Ads and Remarketing</p>
   <p>2024 Updated for use with Google Tag Manager</p>
   <br />
   <p>Written by Chris Horgan - <a href="http://www.organicwebs.com.au/" target="_blank">OrganicWebs</a></p>
   <div id="organic" class="organicstyle" >
	<p>Don't forget to Publish the Plugin <a href="/component/plugins/?filter_folder=system&filter_search=google%20tag">here</a></p>
	<p>5.1: Joomla 5 version</p>
	<p>3.1: Joomla 3 version</p>
   </div>
   </div>
	<style>
	.organicstyle { width: auto; height: auto; display: block; margin: 15px 0; } 
   </style>
	]]>
	</description>	
	<namespace path="src">Organic\Plugin\System\Organic_GTag</namespace>
	<updateservers>
        <server type="extension" priority="1" name="Organic Extension Updates">https://organicwebs.com.au/joomlaupdates/plg_organic_gtag-update.xml</server>
    </updateservers>
    <files>
        <folder plugin="organic_gtag">services</folder>
        <folder>src</folder>
    </files>	
	<config>
		<fields name="params">
			<fieldset name="basic" label="Google Tag Settings">
				<field name="google_container_id"
						type="text"
						default=""
						label="Google Tag Manager Container ID"
						description="Should be a number like GTM-PDDDXP9"
						/>
			
			</fieldset>
		</fields>
	</config>
</extension>

 

Create a provider.php file

This is pretty much Boilerplate with a couple lines that need customisation.

Store this file as plg_myplugin/services/provider.php

Something like this...

<?php

/**
 * @package     Joomla.Plugin
 * @subpackage  System.organic_gtag
 *
 * @copyright   (C) 2024 OrganicWebs
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Extension\PluginInterface;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Joomla\Event\DispatcherInterface;
use Organic\Plugin\System\Organic_GTag\Extension\Organic_GTag;

return new class() implements ServiceProviderInterface
{
	public function register(Container $container)
	{
		$container->set(
			PluginInterface::class,
			function (Container $container) {

				$config = (array) PluginHelper::getPlugin('system', 'organic_gtag');
				$subject = $container->get(DispatcherInterface::class);
				$app = Factory::getApplication();
				
				$plugin = new Organic_GTag($subject, $config);
				$plugin->setApplication($app);

				return $plugin;
			}
		);
	}
};

 

Create the Plugin Code

The meat and bones. Store as plg_myplugin/src/Extension/My_Plugin.php. 

Note - this file name is case sensitive... so save with a filename the same case as the Class (also same case as the new plugin Object in the provider.php file).

See https://docs.joomla.org/Plugin/Events for different types of Joomla 5 Plugin Groups/Types and also for events.

This example plugin below inserts a Google Script at the end of the </head> and another script at the end of the </body> of a rendered page. 

<?php
/**
 * System - Organic Google  Tag Manager
 * Google Tag code plugin for Joomla! 5
 * Chris Horgan
 * www.organicwebs.com.au
 */

// Check out this link for more info...
// https://docs.joomla.org/Plugin/Events


namespace Organic\Plugin\System\Organic_GTag\Extension;

// no direct access
defined('_JEXEC') or die;

use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Event\Event;
use Joomla\Event\SubscriberInterface;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Event\Result\ResultAwareInterface;
use Joomla\CMS\Application\WebApplication;


class Organic_GTag extends CMSPlugin implements SubscriberInterface {

    protected $app;
    public static function getSubscribedEvents(): array  {
        return [
                'onAfterRender' => 'insertTagScripts',  
                ];
    }

	public function insertTagScripts(Event $event) {			
		$google_container_id = $this->params->get('google_container_id', '');
	
		// Return and do nothing if administrator login
	    if ($this->getApplication()->isClient('administrator')) return;
	
		// Return with nothing if the GoogeTag ID is unknown...		
		if ( $google_container_id == '' )	return;
		
        //  Return with nothing if not the site (ie not on api)
        if (!$this->getApplication()->isClient('site')) return;

		
		// Proceeding...
		$gtag_head_script = "
			<!-- Google Tag Manager -->
			<script>
				(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','".$google_container_id."');
			</script>
			<!-- End Google Tag Manager -->
		";
			
		$gtag_body_script = "
			<!-- Google Tag Manager (noscript) -->
			<noscript>
				<iframe src='https://www.googletagmanager.com/ns.html?id=".$google_container_id."' height='0' width='0' style='display:none;visibility:hidden'></iframe>
			</noscript>
			<!-- End Google Tag Manager (noscript) -->
		";
	
		// Get the html body
		$buffer = $this->app->getBody();
		// Insert the Javascript at the end of the HTML <head> and <body>
		$buffer = str_replace ("</head>", $gtag_head_script."</head>", $buffer);
		$buffer = str_replace ("</body>", $gtag_body_script."</body>", $buffer);
		
		// Set the new html body
		$this->app->setBody($buffer);
		return true;
	}
}
?>

 

References

Plugin Events: https://docs.joomla.org/Plugin/Events

 

Joomla 5 Manual - Plugins: http://pr-240.manual.joomlacode.org/docs/building-extensions/plugins/