lxndrblz / anatole

Anatole is a minimalistic two-column theme for Hugo.
https://themes.gohugo.io/themes/anatole/
MIT License
658 stars 363 forks source link

Support Matomo Analytics #411

Closed mrimann closed 7 months ago

mrimann commented 1 year ago

Is your feature request related to a problem? Please describe. The docs mention several analytics solutions, but not Matomo (formerly Piwik, an open-source solution to replace Google Analytics and similar).

Describe the solution you'd like If Matomo would be supported "out of the box" (= same as the other existing ones, where one just has to config the tracking-id / URL), that would be great.

Describe alternatives you've considered As an alternative, it would be cool if adding a custom block of tracking-code would be documented instead, then one could use that way (and the template would not need to be extended for a dozen other solutions).

lxndrblz commented 1 year ago

@mrimann Thanks for your suggestion. Unfortunately, I do not have a test instance of Matomo/Piwik and therefore can't properly implement this feature. If you got it working, feel free to send an PR and I'll merge it.

mrimann commented 1 year ago

@lxndrblz hmm - if it helps, I could organize an installation of Matomo to test-drive the new feature. May be you could also use https://matomo.org/start-free-analytics-trial/ got get a test installation without hassle.

Code-wise I first thought of "the same way as with Google Analytics" -> e.g. just enter the UA-xxxxx-xx account identifier in the config and let the template render the full block of JavaScript with that account identifier injected. But thinging this through I noticed it could be a little bit trickier to implement:

As an example, the full tracking-code to be inserted in the HTML-output will look like this (anonymized):

<!-- Matomo -->
--
  | <script>
  | var _paq = window._paq = window._paq \|\| [];
  | /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
  | _paq.push(['trackPageView']);
  | _paq.push(['enableLinkTracking']);
  | (function() {
  | var u="https://analytics.DOMAIN.TLD/";
  | _paq.push(['setTrackerUrl', u+'matomo.php']);
  | _paq.push(['setSiteId', 'SITE_ID']);
  | var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
  | g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
  | })();
  | </script>
  | <!-- End Matomo Code -->

So the question is how to tackle this. I see two variants:

I personally prefer variant A as it's the smaller change - but if there's a need for a more generic solution and others are asking for something like variant B, that should absolutely do it, too.

For variant A I might prepare a PR, for variant B I don't know how to implement that properly.

mrimann commented 7 months ago

Great - thanks @lxndrblz !