
Recherche avancée
Autres articles (42)
-
Personnaliser en ajoutant son logo, sa bannière ou son image de fond
5 septembre 2013, par kent1Certains thèmes prennent en compte trois éléments de personnalisation : l’ajout d’un logo ; l’ajout d’une bannière l’ajout d’une image de fond ;
-
La file d’attente de SPIPmotion
28 novembre 2010, par kent1Une file d’attente stockée dans la base de donnée
Lors de son installation, SPIPmotion crée une nouvelle table dans la base de donnée intitulée spip_spipmotion_attentes.
Cette nouvelle table est constituée des champs suivants : id_spipmotion_attente, l’identifiant numérique unique de la tâche à traiter ; id_document, l’identifiant numérique du document original à encoder ; id_objet l’identifiant unique de l’objet auquel le document encodé devra être attaché automatiquement ; objet, le type d’objet auquel (...) -
Personnaliser les catégories
21 juin 2013, par etalarmaFormulaire de création d’une catégorie
Pour ceux qui connaissent bien SPIP, une catégorie peut être assimilée à une rubrique.
Dans le cas d’un document de type catégorie, les champs proposés par défaut sont : Texte
On peut modifier ce formulaire dans la partie :
Administration > Configuration des masques de formulaire.
Dans le cas d’un document de type média, les champs non affichés par défaut sont : Descriptif rapide
Par ailleurs, c’est dans cette partie configuration qu’on peut indiquer le (...)
Sur d’autres sites (6885)
-
Why Matomo is a serious alternative to Google Analytics 360
12 décembre 2018, par Jake Thornton — MarketingThere’s no doubt about it, the free version of Google Analytics offers great value when it comes to making data-driven decisions for your business. But as your business starts to grow, so does the need for a more powerful web analytics tool.
Why would I need to use a different web analytics tool ? It’s because Google Analytics (free version) is very limited when it comes to meeting the needs of a fast growing business whose website plays a pivotal role in converting its customers.
This is where the Google Analytics 360 suite comes in, which is designed to meet the needs of businesses looking to get more accurate and insightful metrics.
So what’s holding a growing business back from using Google Analytics 360 ?
While GA360 sounds like a great option when upgrading your web analytics platform, we have found there are three core reasons holding businesses back from taking the leap :
- Businesses can’t bear to swallow the US$150,000+ price tag (per year !) that comes with upgrading
- Businesses can’t rely on GA360 to give them all the insights they need
- Businesses want more control and ownership of their data
Thankfully there are (only a few) alternatives and as the leading open-source alternative to Google Analytics, we hope to share insights on why Matomo Analytics can be the perfect solution for anyone at this crossroads in their web analytics journey.
First, what does Google Analytics 360 offer that Google Analytics (free) doesn’t ?
There’s no doubt about it, the GA360 suite is designed for larger sized businesses with demanding data limits, big budgets to use across the Google Marketing Platform (Google Adwords, DoubleClick etc.) and to get more advanced reporting visualisations and options.
Data Sampling
Data sampling is the elephant in the room when it comes to comparing GA360 with the freemium version. This is an entire article in its own right but at a basic level, Google Analytics samples your data (makes assumptions based on patterns) once the number of traffic visiting your website reaches a certain limit.
Google Analytics provides the following information :
Ad-hoc queries of your data are subject to the following general thresholds for sampling :
Analytics Standard : 500k sessions at the property level for the date range you are using
Analytics 360 : 100M sessions at the view level for the date range you are using
In short, sampled data means inaccurate data. This is why as businesses grow, GA360 becomes a more attractive prospect because there’s no point making data-driven business decisions based on inaccurate data. This is a key weapon Google uses when selling to large businesses, however, this may not seem as concerning if you’re a small business within the sampled data range. For small businesses though, make sure you know the full extent of how this can affect your metrics, for example, your ecommerce data could be sampled, hence your GA reporting not matching your CRM/Ecommerce store data.
Benefit of using Matomo : There is no data sampling anywhere in Matomo Analytics, that’s why we say 100% Accurate Data reporting across all plans.
Integration with the Google Marketing Platform
Yes ok, we’ll admit it, GA does a great job at integrating seamlessly with its own products like Google Ads, Google Optimize etc. with a touch of Salesforce integration ; while GA360 takes this to another level compared to it’s freemium version (integration with Google Search 360, Google Display & Video 360 etc.)
But… what about non-Google advertising platforms ? Well with Google being a dominant leader as a search engine, web browser, email provider, social media channel ; sometimes Google needs to keep its best interests at heart.
Google is an online advertising giant and a bonus of Google Search 360 is that you can integrate your Bing Ads, Baidu and Yahoo Japan Search campaigns but that’s about it when it comes to integrations from its direct competitors.
Benefit of using Matomo : No biased treatment. You can integrate your Google, Yahoo and Bing search consoles for accurate search engine reporting, and in early 2019, Matomo will be releasing a Google Ads, Bing Ads and Facebook Ads Manager integration feature.
Roll-Up Reporting
Roll-up reporting lets you combine multiple accounts and properties into one view. This is a great benefit when upgrading from GA freemium to GA360. For example, if you’re a digital agency with multiple clients or you manage multiple websites under the one account, the roll-up reporting feature is wonderful when you need to combine data and reporting, instantly.
Benefit of using Matomo : Matomo’s got this covered ! Roll-up reporting is available in the Matomo Business package (starting at $29 per month) for cloud hosting or you can purchase as a Premium Feature for On-Premise starting at $99 per year.
Staying in full control of your data
Who would have thought that one of biggest reasons people choose Matomo isn’t because of anything that leads to a higher ROI, but for the fact that users want more control of their data.
Matomo’s philosophy around data ownership is simple, you own your data, no one else. If you choose to host Matomo Analytics On-Premise then you are in complete control because your data is stored on your own servers where no one can gain access to it in whichever country you choose.
So what about when you cloud host Matomo ? For users who don’t have the technical knowledge to host Matomo On-Premise, you can still have 100% data ownership and fully respect your user’s privacy when choosing to host Matomo Analytics through our cloud service.
The difference between cloud hosting Matomo Analytics vs Google Analytics is that when you choose Matomo, we acknowledge you own the data and we have no right to access it. This means we can’t on-sell it to third-parties, we can’t claim ownership of it, you can export your data at anytime (how awesome is that !) and you can migrate between cloud hosting and hosting on-premise for ultimate flexibility whenever you want.
Matomo also prides itself in allowing its users to be GDPR compliant with ease with a powerful GDPR Manager.
Businesses can’t rely on Google Analytics 360 to give them all the insights they need
Unlike Google Analytics 360, Matomo blends its Premium Web Analytics platform with Conversion Optimization features to allow its users to fully evaluate the user-experience on your website.
Matomo is designed to be a complete analytics platform, meaning you have everything you need all in the one place which gives you greater insights and better business outcomes.
These features include :Premium Web Analytics – You can still (accurately) measure all the basic metrics you love and are familiar with in Google Analytics like Location, Referrer traffic, Multi Attribution, Campaign Tracking and Ecommerce etc.
Conversion Optimization – Eliminate the need for multiple analytics tools to get what Google Analytics doesn’t offer. These features include Heatmaps, Session Recordings, Form Analytics and more – giving you the best chance possible to convert more traffic by evaluating the user-experience.
By having one tool for all your features you can integrate metrics, have one single view for all your data and it’s easy to use.
Enhanced SEO – Get more insights into the performance of your search campaigns with unbiased search engine reporting, keyword ranking positions, integration with multiple search consoles and crawling stats. Google Analytics offers limited features to help with your SEO campaigns and only integrates with Google products.
Visitor Profiles – Get a detailed life-time evaluation of every user who visits your website.
Tag Manager – A powerful open-source Tag Manager tool to embed your third-party marketing tags. By being open-source and with our commitment to giving you 100% data ownership, you can always ensure you are in full control.
Just putting it out there ...
Google leads the market with its freemium tool which offers great insights for businesses (fyi – Matomo has a forever free analytics tool too !), but when it comes to upgrading to get accurate reporting (kind of a big deal), owning your own data (a huge deal !) and having a complete range of features to excel ROI for your business, Matomo Analytics is often a preferred option to the Google Analytics 360 suite.
Matomo is designed to be easy to use, is fully flexible and gives users full peace of mind by respecting user privacy. Want to learn more about the benefits of Matomo ?
-
Matomo analytics for wordpress
15 octobre 2019, par Matomo Core Team — CommunitySelf-hosting web analytics got a whole lot easier ! Introducing Matomo for WordPress
Be the first to try it out ! Your feedback is much needed and appreciated
Get a fully functioning Matomo (which is comparable to Google Analytics) in seconds ! How ? With the new Matomo Analytics for WordPress plugin.
Web analytics in WordPress has never been easier to get, or more powerful. Matomo Analytics for WordPress is the one-stop problem solver. It’ll save you time, money and give you the insights to help your website or business succeed.
Best of all, we get to further the goal of decentralising the internet. Our hope is for Matomo Analytics for WordPress to spread far and wide. We’re so excited that more and more people can now get their hands on this powerful, free, open-source analytics platform, in a few clicks !
Download now and check it out !
What do you get ?
- No more signing up to third party analytics service (like Google)
- No more sending away your valuable data to a third party service (like Google)
- Easy setup – install with a few clicks, no tracking code installation or developer knowledge needed
- 100% accurate data – no data sampling and no data limits
- Full data ownership – all data is stored on your servers and no one else can see your data
- Privacy protection / GDPR compliance
- Ecommerce tracking out-of-the-box (Woocommerce, Easy Digital Downloads, and MemberPress) and we’re keen to add many more over time
- Powerful features – segmenting, comparing reports, different visualisations, real-time reports, visit logs and visitor profiles, Matomo Tag Manager, dashboards, data export, APIs, and many more
- Compared to other WordPress solutions we don’t charge you extra for basic features that should work out-of-the-box
- Just like Matomo On-Premise, Matomo Analytics for WordPress is free
We need your feedback !
We all know and love the versatility of WordPress – with over 55,000 plugins and all the different ways of hosting it. However, with this great versatility comes the potential for things to be missed, so we’re keen to hear your feedback.
- Is our plugin breaking anything on your WordPress, or, not compatible with something ? Please create an issue on our repository.
- Is something not working ? If so, what ? Please create an issue on our repository.
- How does running Matomo impact the performance of your WordPress server ? Also, if you have any other feedback for us – whether good or bad – please email us at wordpress@matomo.org. We’d love to hear what you think !
- Can you perform a security review of the plugin ? Security issues are best reported to security@matomo.org
- Do you have any questions ? Questions are best asked in our forum
Thank you ! We really appreciate your help on this ❤️
How do you get Matomo Analytics for WordPress ?
You can then upload it in your WordPress by going to “Plugins => Add New”. During the upload, if you get an error like “Are you sure you want to do this ?”, we recommend you upload the extracted zip file on to your server and into your ‘wp-content/plugins’ folder manually using ftp or ssh. Make sure the plugin name is ‘matomo’.
All you need is at least WordPress 4.8 and PHP 7.0 or later. MySQL 5.1+ is recommended.
The source code is available at : https://github.com/matomo-org/wp-matomo/.
In perfect harmony : Matomo and WordPress
The idea for this started two years ago when we realised the similarities between the Matomo and WordPress project.
Not only from a technological point of view – where both are based on PHP and MySQL and can be extended using plugins – but also from a philosophical, license and values point of view. We both believe in privacy, security, data ownership, openness, transparency, having things working out-of-the-box, simplicity etc.
WordPress is currently used on approximately 30% of all websites. Many of them use the self-hosted open-source WordPress version. Giving everyone in this market the opportunity to easily get a powerful web analytics platform for free, means a lot to us. We believe WordPress users get a real choice besides the standard solution of Google Analytics, and it furthers our effort and goal of decentralising the internet.
We’re hoping more people will be empowered to protect user privacy, have access to a great free and open-source tool, and keep control of data in their own hands.
We hope you feel the same. Help us spread the word to your friends and get them in on this awesome new project !
Share on facebookShare on twitterShare on linkedinFAQs
Isn’t there already a WP-Matomo plugin for WordPress available ?
Yes, the existing WP-Matomo (WP-Piwik) plugin is an awesome plugin to connect your existing Matomo On-Premise or Matomo Cloud account with WordPress. The difference is that this new plugin installs Matomo Analytics fully in your WordPress. So you get the convenience of having a powerful analytics platform within your WordPress.
We highly recommend you install this new plugin if you use WordPress and are not running Matomo yet.
If you are already using Matomo on our Cloud or On-Premise, we’d still highly recommend you use WP-Matomo (WP-Piwik). So that you get an easier way of inserting the tracking code into your WordPress site and get insights faster.
I have a high traffic website, will it be an issue ?
If you have a lot of traffic, we’d advise you to install Matomo On-Premise separately. There’s no specific traffic threshold we can give you on when it’s better to use Matomo On-Premise. It really depends on your server.
We reckon if you have more than 500,000 page views a month, you may want to think about using Matomo On-Premise with WP-Matomo instead, but this is just an estimate. In general, if the load on your server is already quite high, then it might be better to install Matomo on a separate server. See also recommended server sizing for running Matomo.
How do I report a bug or request a new feature in Matomo for WordPress ?
Please create an issue, on our repository whenever you find a bug or if you have any suggestion or ideas of improvement. We want to build an outstanding analytics experience for WordPress !
Have another question you’re dying to ask ? The Matomo for WordPress FAQ page might have the answer you need.
Matomo Analytics for WordPress newsletter
Get ahead of the crowd – signup to our exclusive Matomo for WordPress newsletter to get the latest updates on this exciting new project.
<script type="text/javascript"><br />
(function(global) {<br />
function serialize(form){if(!form||form.nodeName!=="FORM"){return }var i,j,q=[];for(i=form.elements.length-1;i>=0;i=i-1){if(form.elements[i].name===""){continue}switch(form.elements[i].nodeName){case"INPUT":switch(form.elements[i].type){case"text":case"hidden":case"password":case"button":case"reset":case"submit":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"checkbox":case"radio":if(form.elements[i].checked){q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value))}break;case"file":break}break;case"TEXTAREA":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"SELECT":switch(form.elements[i].type){case"select-one":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"select-multiple":for(j=form.elements[i].options.length-1;j>=0;j=j-1){if(form.elements[i].options[j].selected){q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].options[j].value))}}break}break;case"BUTTON":switch(form.elements[i].type){case"reset":case"submit":case"button":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break}break}}return q.join("&")};<br />
<br />
<br />
function extend(destination, source) {<br />
for (var prop in source) {<br />
destination[prop] = source[prop];<br />
}<br />
}<br />
<br />
if (!Mimi) var Mimi = {};<br />
if (!Mimi.Signups) Mimi.Signups = {};<br />
<br />
Mimi.Signups.EmbedValidation = function() {<br />
this.initialize();<br />
<br />
var _this = this;<br />
if (document.addEventListener) {<br />
this.form.addEventListener('submit', function(e){<br />
_this.onFormSubmit(e);<br />
});<br />
} else {<br />
this.form.attachEvent('onsubmit', function(e){<br />
_this.onFormSubmit(e);<br />
});<br />
}<br />
};<br />
<br />
extend(Mimi.Signups.EmbedValidation.prototype, {<br />
initialize: function() {<br />
this.form = document.getElementById('ema_signup_form');<br />
this.submit = document.getElementById('webform_submit_button');<br />
this.callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random());<br />
this.validEmail = /.+@.+\..+/<br />
},<br />
<br />
onFormSubmit: function(e) {<br />
e.preventDefault();<br />
<br />
this.validate();<br />
if (this.isValid) {<br />
this.submitForm();<br />
} else {<br />
this.revalidateOnChange();<br />
}<br />
},<br />
<br />
validate: function() {<br />
this.isValid = true;<br />
this.emailValidation();<br />
this.fieldAndListValidation();<br />
this.updateFormAfterValidation();<br />
},<br />
<br />
emailValidation: function() {<br />
var email = document.getElementById('signup_email');<br />
<br />
if (this.validEmail.test(email.value)) {<br />
this.removeTextFieldError(email);<br />
} else {<br />
this.textFieldError(email);<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
fieldAndListValidation: function() {<br />
var fields = this.form.querySelectorAll('.mimi_field.required');<br />
<br />
for (var i = 0; i < fields.length; ++i) {<br />
var field = fields[i],<br />
type = this.fieldType(field);<br />
if (type === 'checkboxes' || type === 'radio_buttons' || type === 'age_check') {<br />
this.checkboxAndRadioValidation(field);<br />
} else {<br />
this.textAndDropdownValidation(field, type);<br />
}<br />
}<br />
},<br />
<br />
fieldType: function(field) {<br />
var type = field.querySelectorAll('.field_type');<br />
<br />
if (type.length) {<br />
return type[0].getAttribute('data-field-type');<br />
} else if (field.className.indexOf('checkgroup') >= 0) {<br />
return 'checkboxes';<br />
} else {<br />
return 'text_field';<br />
}<br />
},<br />
<br />
checkboxAndRadioValidation: function(field) {<br />
var inputs = field.getElementsByTagName('input'),<br />
selected = false;<br />
<br />
for (var i = 0; i < inputs.length; ++i) {<br />
var input = inputs[i];<br />
if((input.type === 'checkbox' || input.type === 'radio') && input.checked) {<br />
selected = true;<br />
}<br />
}<br />
<br />
if (selected) {<br />
field.className = field.className.replace(/ invalid/g, '');<br />
} else {<br />
if (field.className.indexOf('invalid') === -1) {<br />
field.className += ' invalid';<br />
}<br />
<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
textAndDropdownValidation: function(field, type) {<br />
var inputs = field.getElementsByTagName('input');<br />
<br />
for (var i = 0; i < inputs.length; ++i) {<br />
var input = inputs[i];<br />
if (input.name.indexOf('signup') >= 0) {<br />
if (type === 'text_field') {<br />
this.textValidation(input);<br />
} else {<br />
this.dropdownValidation(field, input);<br />
}<br />
}<br />
}<br />
this.htmlEmbedDropdownValidation(field);<br />
},<br />
<br />
textValidation: function(input) {<br />
if (input.id === 'signup_email') return;<br />
<br />
if (input.value) {<br />
this.removeTextFieldError(input);<br />
} else {<br />
this.textFieldError(input);<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
dropdownValidation: function(field, input) {<br />
if (input.value) {<br />
field.className = field.className.replace(/ invalid/g, '');<br />
} else {<br />
if (field.className.indexOf('invalid') === -1) field.className += ' invalid';<br />
this.onSelectCallback(input);<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
htmlEmbedDropdownValidation: function(field) {<br />
var dropdowns = field.querySelectorAll('.mimi_html_dropdown');<br />
var _this = this;<br />
<br />
for (var i = 0; i < dropdowns.length; ++i) {<br />
var dropdown = dropdowns[i];<br />
<br />
if (dropdown.value) {<br />
field.className = field.className.replace(/ invalid/g, '');<br />
} else {<br />
if (field.className.indexOf('invalid') === -1) field.className += ' invalid';<br />
this.isValid = false;<br />
dropdown.onchange = (function(){ _this.validate(); });<br />
}<br />
}<br />
},<br />
<br />
textFieldError: function(input) {<br />
input.className = 'required invalid';<br />
input.placeholder = input.getAttribute('data-required-field');<br />
},<br />
<br />
removeTextFieldError: function(input) {<br />
input.className = 'required';<br />
input.placeholder = '';<br />
},<br />
<br />
onSelectCallback: function(input) {<br />
if (typeof Widget === 'undefined' || !Widget.BasicDropdown) return;<br />
<br />
var dropdownEl = input.parentNode,<br />
instances = Widget.BasicDropdown.instances,<br />
_this = this;<br />
<br />
for (var i = 0; i < instances.length; ++i) {<br />
var instance = instances[i];<br />
if (instance.wrapperEl === dropdownEl) {<br />
instance.onSelect = function(){ _this.validate() };<br />
}<br />
}<br />
},<br />
<br />
updateFormAfterValidation: function() {<br />
this.form.className = this.setFormClassName();<br />
this.submit.value = this.submitButtonText();<br />
this.submit.disabled = !this.isValid;<br />
this.submit.className = this.isValid ? 'submit' : 'disabled';<br />
},<br />
<br />
setFormClassName: function() {<br />
var name = this.form.className;<br />
<br />
if (this.isValid) {<br />
return name.replace(/\s?mimi_invalid/, '');<br />
} else {<br />
if (name.indexOf('mimi_invalid') === -1) {<br />
return name += ' mimi_invalid';<br />
} else {<br />
return name;<br />
}<br />
}<br />
},<br />
<br />
submitButtonText: function() {<br />
var invalidFields = document.querySelectorAll('.invalid'),<br />
text;<br />
<br />
if (this.isValid || !invalidFields) {<br />
text = this.submit.getAttribute('data-default-text');<br />
} else {<br />
if (invalidFields.length || invalidFields[0].className.indexOf('checkgroup') === -1) {<br />
text = this.submit.getAttribute('data-invalid-text');<br />
} else {<br />
text = this.submit.getAttribute('data-choose-list');<br />
}<br />
}<br />
return text;<br />
},<br />
<br />
submitForm: function() {<br />
this.formSubmitting();<br />
<br />
var _this = this;<br />
window[this.callbackName] = function(response) {<br />
delete window[this.callbackName];<br />
document.body.removeChild(script);<br />
_this.onSubmitCallback(response);<br />
};<br />
<br />
var script = document.createElement('script');<br />
script.src = this.formUrl('json');<br />
document.body.appendChild(script);<br />
},<br />
<br />
formUrl: function(format) {<br />
var action = this.form.action;<br />
if (format === 'json') action += '.json';<br />
return action + '?callback=' + this.callbackName + '&' + serialize(this.form);<br />
},<br />
<br />
formSubmitting: function() {<br />
this.form.className += ' mimi_submitting';<br />
this.submit.value = this.submit.getAttribute('data-submitting-text');<br />
this.submit.disabled = true;<br />
this.submit.className = 'disabled';<br />
},<br />
<br />
onSubmitCallback: function(response) {<br />
if (response.success) {<br />
this.onSubmitSuccess(response.result);<br />
} else {<br />
top.location.href = this.formUrl('html');<br />
}<br />
},<br />
<br />
onSubmitSuccess: function(result) {<br />
if (result.has_redirect) {<br />
top.location.href = result.redirect;<br />
} else if(result.single_opt_in || !result.confirmation_html) {<br />
this.disableForm();<br />
this.updateSubmitButtonText(this.submit.getAttribute('data-thanks'));<br />
} else {<br />
this.showConfirmationText(result.confirmation_html);<br />
}<br />
},<br />
<br />
showConfirmationText: function(html) {<br />
var fields = this.form.querySelectorAll('.mimi_field');<br />
<br />
for (var i = 0; i < fields.length; ++i) {<br />
fields[i].style['display'] = 'none';<br />
}<br />
<br />
(this.form.querySelectorAll('fieldset')[0] || this.form).innerHTML = html;<br />
},<br />
<br />
disableForm: function() {<br />
var elements = this.form.elements;<br />
for (var i = 0; i < elements.length; ++i) {<br />
elements[i].disabled = true;<br />
}<br />
},<br />
<br />
updateSubmitButtonText: function(text) {<br />
this.submit.value = text;<br />
},<br />
<br />
revalidateOnChange: function() {<br />
var fields = this.form.querySelectorAll(".mimi_field.required"),<br />
_this = this;<br />
<br />
var onTextFieldChange = function() {<br />
if (this.getAttribute('name') === 'signup[email]') {<br />
if (_this.validEmail.test(this.value)) _this.validate();<br />
} else {<br />
if (this.value.length === 1) _this.validate();<br />
}<br />
}<br />
<br />
for (var i = 0; i < fields.length; ++i) {<br />
var inputs = fields[i].getElementsByTagName('input');<br />
for (var j = 0; j < inputs.length; ++j) {<br />
if (this.fieldType(fields[i]) === 'text_field') {<br />
inputs[j].onkeyup = onTextFieldChange;<br />
inputs[j].onchange = onTextFieldChange; <br />
} else {<br />
inputs[j].onchange = function(){ _this.validate() };<br />
}<br />
}<br />
}<br />
}<br />
});<br />
<br />
if (document.addEventListener) {<br />
document.addEventListener("DOMContentLoaded", function() {<br />
new Mimi.Signups.EmbedValidation();<br />
});<br />
}<br />
else {<br />
window.attachEvent('onload', function() {<br />
new Mimi.Signups.EmbedValidation();<br />
});<br />
}<br />
})(this);<br />
</script> -
Matomo analytics for wordpress
15 octobre 2019, par Matomo Core Team — CommunitySelf-hosting web analytics got a whole lot easier ! Introducing Matomo for WordPress
Be the first to try it out ! Your feedback is much needed and appreciated
Get a fully functioning Matomo (which is comparable to Google Analytics) in seconds ! How ? With the new Matomo Analytics for WordPress plugin.
Web analytics in WordPress has never been easier to get, or more powerful. Matomo Analytics for WordPress is the one-stop problem solver. It’ll save you time, money and give you the insights to help your website or business succeed.
Best of all, we get to further the goal of decentralising the internet. Our hope is for Matomo Analytics for WordPress to spread far and wide. We’re so excited that more and more people can now get their hands on this powerful, free, open-source analytics platform, in a few clicks !
Download now and check it out !
What do you get ?
- No more signing up to third party analytics service (like Google)
- No more sending away your valuable data to a third party service (like Google)
- Easy setup – install with a few clicks, no tracking code installation or developer knowledge needed
- 100% accurate data – no data sampling and no data limits
- Full data ownership – all data is stored on your servers and no one else can see your data
- Privacy protection / GDPR compliance
- Ecommerce tracking out-of-the-box (Woocommerce, Easy Digital Downloads, and MemberPress) and we’re keen to add many more over time
- Powerful features – segmenting, comparing reports, different visualisations, real-time reports, visit logs and visitor profiles, Matomo Tag Manager, dashboards, data export, APIs, and many more
- Compared to other WordPress solutions we don’t charge you extra for basic features that should work out-of-the-box
- Just like Matomo On-Premise, Matomo Analytics for WordPress is free
We need your feedback !
We all know and love the versatility of WordPress – with over 55,000 plugins and all the different ways of hosting it. However, with this great versatility comes the potential for things to be missed, so we’re keen to hear your feedback.
- Is our plugin breaking anything on your WordPress, or, not compatible with something ? Please create an issue on our repository.
- Is something not working ? If so, what ? Please create an issue on our repository.
- How does running Matomo impact the performance of your WordPress server ? Also, if you have any other feedback for us – whether good or bad – please email us at wordpress@matomo.org. We’d love to hear what you think !
- Can you perform a security review of the plugin ? Security issues are best reported to security@matomo.org
- Do you have any questions ? Questions are best asked in our forum
Thank you ! We really appreciate your help on this ❤️
How do you get Matomo Analytics for WordPress ?
Log in to your WordPress and go to “Plugins => Add New”, search for “Matomo Analytics – Ethical Stats. Powerful Insights”, click on “Install” and then “Activate”.
All you need is at least WordPress 4.8 and PHP 7.0 or later. MySQL 5.1+ is recommended.
The source code is available at : https://github.com/matomo-org/wp-matomo/.
In perfect harmony : Matomo and WordPress
The idea for this started two years ago when we realised the similarities between the Matomo and WordPress project.
Not only from a technological point of view – where both are based on PHP and MySQL and can be extended using plugins – but also from a philosophical, license and values point of view. We both believe in privacy, security, data ownership, openness, transparency, having things working out-of-the-box, simplicity etc.
WordPress is currently used on approximately 30% of all websites. Many of them use the self-hosted open-source WordPress version. Giving everyone in this market the opportunity to easily get a powerful web analytics platform for free, means a lot to us. We believe WordPress users get a real choice besides the standard solution of Google Analytics, and it furthers our effort and goal of decentralising the internet.
We’re hoping more people will be empowered to protect user privacy, have access to a great free and open-source tool, and keep control of data in their own hands.
We hope you feel the same. Help us spread the word to your friends and get them in on this awesome new project !
Share on facebookShare on twitterShare on linkedinFAQs
Isn’t there already a WP-Matomo plugin for WordPress available ?
Yes, the existing WP-Matomo (WP-Piwik) plugin is an awesome plugin to connect your existing Matomo On-Premise or Matomo Cloud account with WordPress. The difference is that this new plugin installs Matomo Analytics fully in your WordPress. So you get the convenience of having a powerful analytics platform within your WordPress.
We highly recommend you install this new plugin if you use WordPress and are not running Matomo yet.
If you are already using Matomo on our Cloud or On-Premise, we’d still highly recommend you use WP-Matomo (WP-Piwik). So that you get an easier way of inserting the tracking code into your WordPress site and get insights faster.
I have a high traffic website, will it be an issue ?
If you have a lot of traffic, we’d advise you to install Matomo On-Premise separately. There’s no specific traffic threshold we can give you on when it’s better to use Matomo On-Premise. It really depends on your server.
We reckon if you have more than 500,000 page views a month, you may want to think about using Matomo On-Premise with WP-Matomo instead, but this is just an estimate. In general, if the load on your server is already quite high, then it might be better to install Matomo on a separate server. See also recommended server sizing for running Matomo.
How do I report a bug or request a new feature in Matomo for WordPress ?
Please create an issue, on our repository whenever you find a bug or if you have any suggestion or ideas of improvement. We want to build an outstanding analytics experience for WordPress !
Have another question you’re dying to ask ? The Matomo for WordPress FAQ page might have the answer you need.
Matomo Analytics for WordPress newsletter
Get ahead of the crowd – signup to our exclusive Matomo for WordPress newsletter to get the latest updates on this exciting new project.
<script type="text/javascript"><br />
(function(global) {<br />
function serialize(form){if(!form||form.nodeName!=="FORM"){return }var i,j,q=[];for(i=form.elements.length-1;i>=0;i=i-1){if(form.elements[i].name===""){continue}switch(form.elements[i].nodeName){case"INPUT":switch(form.elements[i].type){case"text":case"hidden":case"password":case"button":case"reset":case"submit":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"checkbox":case"radio":if(form.elements[i].checked){q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value))}break;case"file":break}break;case"TEXTAREA":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"SELECT":switch(form.elements[i].type){case"select-one":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"select-multiple":for(j=form.elements[i].options.length-1;j>=0;j=j-1){if(form.elements[i].options[j].selected){q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].options[j].value))}}break}break;case"BUTTON":switch(form.elements[i].type){case"reset":case"submit":case"button":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break}break}}return q.join("&")};<br />
<br />
<br />
function extend(destination, source) {<br />
for (var prop in source) {<br />
destination[prop] = source[prop];<br />
}<br />
}<br />
<br />
if (!Mimi) var Mimi = {};<br />
if (!Mimi.Signups) Mimi.Signups = {};<br />
<br />
Mimi.Signups.EmbedValidation = function() {<br />
this.initialize();<br />
<br />
var _this = this;<br />
if (document.addEventListener) {<br />
this.form.addEventListener('submit', function(e){<br />
_this.onFormSubmit(e);<br />
});<br />
} else {<br />
this.form.attachEvent('onsubmit', function(e){<br />
_this.onFormSubmit(e);<br />
});<br />
}<br />
};<br />
<br />
extend(Mimi.Signups.EmbedValidation.prototype, {<br />
initialize: function() {<br />
this.form = document.getElementById('ema_signup_form');<br />
this.submit = document.getElementById('webform_submit_button');<br />
this.callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random());<br />
this.validEmail = /.+@.+\..+/<br />
},<br />
<br />
onFormSubmit: function(e) {<br />
e.preventDefault();<br />
<br />
this.validate();<br />
if (this.isValid) {<br />
this.submitForm();<br />
} else {<br />
this.revalidateOnChange();<br />
}<br />
},<br />
<br />
validate: function() {<br />
this.isValid = true;<br />
this.emailValidation();<br />
this.fieldAndListValidation();<br />
this.updateFormAfterValidation();<br />
},<br />
<br />
emailValidation: function() {<br />
var email = document.getElementById('signup_email');<br />
<br />
if (this.validEmail.test(email.value)) {<br />
this.removeTextFieldError(email);<br />
} else {<br />
this.textFieldError(email);<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
fieldAndListValidation: function() {<br />
var fields = this.form.querySelectorAll('.mimi_field.required');<br />
<br />
for (var i = 0; i < fields.length; ++i) {<br />
var field = fields[i],<br />
type = this.fieldType(field);<br />
if (type === 'checkboxes' || type === 'radio_buttons' || type === 'age_check') {<br />
this.checkboxAndRadioValidation(field);<br />
} else {<br />
this.textAndDropdownValidation(field, type);<br />
}<br />
}<br />
},<br />
<br />
fieldType: function(field) {<br />
var type = field.querySelectorAll('.field_type');<br />
<br />
if (type.length) {<br />
return type[0].getAttribute('data-field-type');<br />
} else if (field.className.indexOf('checkgroup') >= 0) {<br />
return 'checkboxes';<br />
} else {<br />
return 'text_field';<br />
}<br />
},<br />
<br />
checkboxAndRadioValidation: function(field) {<br />
var inputs = field.getElementsByTagName('input'),<br />
selected = false;<br />
<br />
for (var i = 0; i < inputs.length; ++i) {<br />
var input = inputs[i];<br />
if((input.type === 'checkbox' || input.type === 'radio') && input.checked) {<br />
selected = true;<br />
}<br />
}<br />
<br />
if (selected) {<br />
field.className = field.className.replace(/ invalid/g, '');<br />
} else {<br />
if (field.className.indexOf('invalid') === -1) {<br />
field.className += ' invalid';<br />
}<br />
<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
textAndDropdownValidation: function(field, type) {<br />
var inputs = field.getElementsByTagName('input');<br />
<br />
for (var i = 0; i < inputs.length; ++i) {<br />
var input = inputs[i];<br />
if (input.name.indexOf('signup') >= 0) {<br />
if (type === 'text_field') {<br />
this.textValidation(input);<br />
} else {<br />
this.dropdownValidation(field, input);<br />
}<br />
}<br />
}<br />
this.htmlEmbedDropdownValidation(field);<br />
},<br />
<br />
textValidation: function(input) {<br />
if (input.id === 'signup_email') return;<br />
<br />
if (input.value) {<br />
this.removeTextFieldError(input);<br />
} else {<br />
this.textFieldError(input);<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
dropdownValidation: function(field, input) {<br />
if (input.value) {<br />
field.className = field.className.replace(/ invalid/g, '');<br />
} else {<br />
if (field.className.indexOf('invalid') === -1) field.className += ' invalid';<br />
this.onSelectCallback(input);<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
htmlEmbedDropdownValidation: function(field) {<br />
var dropdowns = field.querySelectorAll('.mimi_html_dropdown');<br />
var _this = this;<br />
<br />
for (var i = 0; i < dropdowns.length; ++i) {<br />
var dropdown = dropdowns[i];<br />
<br />
if (dropdown.value) {<br />
field.className = field.className.replace(/ invalid/g, '');<br />
} else {<br />
if (field.className.indexOf('invalid') === -1) field.className += ' invalid';<br />
this.isValid = false;<br />
dropdown.onchange = (function(){ _this.validate(); });<br />
}<br />
}<br />
},<br />
<br />
textFieldError: function(input) {<br />
input.className = 'required invalid';<br />
input.placeholder = input.getAttribute('data-required-field');<br />
},<br />
<br />
removeTextFieldError: function(input) {<br />
input.className = 'required';<br />
input.placeholder = '';<br />
},<br />
<br />
onSelectCallback: function(input) {<br />
if (typeof Widget === 'undefined' || !Widget.BasicDropdown) return;<br />
<br />
var dropdownEl = input.parentNode,<br />
instances = Widget.BasicDropdown.instances,<br />
_this = this;<br />
<br />
for (var i = 0; i < instances.length; ++i) {<br />
var instance = instances[i];<br />
if (instance.wrapperEl === dropdownEl) {<br />
instance.onSelect = function(){ _this.validate() };<br />
}<br />
}<br />
},<br />
<br />
updateFormAfterValidation: function() {<br />
this.form.className = this.setFormClassName();<br />
this.submit.value = this.submitButtonText();<br />
this.submit.disabled = !this.isValid;<br />
this.submit.className = this.isValid ? 'submit' : 'disabled';<br />
},<br />
<br />
setFormClassName: function() {<br />
var name = this.form.className;<br />
<br />
if (this.isValid) {<br />
return name.replace(/\s?mimi_invalid/, '');<br />
} else {<br />
if (name.indexOf('mimi_invalid') === -1) {<br />
return name += ' mimi_invalid';<br />
} else {<br />
return name;<br />
}<br />
}<br />
},<br />
<br />
submitButtonText: function() {<br />
var invalidFields = document.querySelectorAll('.invalid'),<br />
text;<br />
<br />
if (this.isValid || !invalidFields) {<br />
text = this.submit.getAttribute('data-default-text');<br />
} else {<br />
if (invalidFields.length || invalidFields[0].className.indexOf('checkgroup') === -1) {<br />
text = this.submit.getAttribute('data-invalid-text');<br />
} else {<br />
text = this.submit.getAttribute('data-choose-list');<br />
}<br />
}<br />
return text;<br />
},<br />
<br />
submitForm: function() {<br />
this.formSubmitting();<br />
<br />
var _this = this;<br />
window[this.callbackName] = function(response) {<br />
delete window[this.callbackName];<br />
document.body.removeChild(script);<br />
_this.onSubmitCallback(response);<br />
};<br />
<br />
var script = document.createElement('script');<br />
script.src = this.formUrl('json');<br />
document.body.appendChild(script);<br />
},<br />
<br />
formUrl: function(format) {<br />
var action = this.form.action;<br />
if (format === 'json') action += '.json';<br />
return action + '?callback=' + this.callbackName + '&' + serialize(this.form);<br />
},<br />
<br />
formSubmitting: function() {<br />
this.form.className += ' mimi_submitting';<br />
this.submit.value = this.submit.getAttribute('data-submitting-text');<br />
this.submit.disabled = true;<br />
this.submit.className = 'disabled';<br />
},<br />
<br />
onSubmitCallback: function(response) {<br />
if (response.success) {<br />
this.onSubmitSuccess(response.result);<br />
} else {<br />
top.location.href = this.formUrl('html');<br />
}<br />
},<br />
<br />
onSubmitSuccess: function(result) {<br />
if (result.has_redirect) {<br />
top.location.href = result.redirect;<br />
} else if(result.single_opt_in || !result.confirmation_html) {<br />
this.disableForm();<br />
this.updateSubmitButtonText(this.submit.getAttribute('data-thanks'));<br />
} else {<br />
this.showConfirmationText(result.confirmation_html);<br />
}<br />
},<br />
<br />
showConfirmationText: function(html) {<br />
var fields = this.form.querySelectorAll('.mimi_field');<br />
<br />
for (var i = 0; i < fields.length; ++i) {<br />
fields[i].style['display'] = 'none';<br />
}<br />
<br />
(this.form.querySelectorAll('fieldset')[0] || this.form).innerHTML = html;<br />
},<br />
<br />
disableForm: function() {<br />
var elements = this.form.elements;<br />
for (var i = 0; i < elements.length; ++i) {<br />
elements[i].disabled = true;<br />
}<br />
},<br />
<br />
updateSubmitButtonText: function(text) {<br />
this.submit.value = text;<br />
},<br />
<br />
revalidateOnChange: function() {<br />
var fields = this.form.querySelectorAll(".mimi_field.required"),<br />
_this = this;<br />
<br />
var onTextFieldChange = function() {<br />
if (this.getAttribute('name') === 'signup[email]') {<br />
if (_this.validEmail.test(this.value)) _this.validate();<br />
} else {<br />
if (this.value.length === 1) _this.validate();<br />
}<br />
}<br />
<br />
for (var i = 0; i < fields.length; ++i) {<br />
var inputs = fields[i].getElementsByTagName('input');<br />
for (var j = 0; j < inputs.length; ++j) {<br />
if (this.fieldType(fields[i]) === 'text_field') {<br />
inputs[j].onkeyup = onTextFieldChange;<br />
inputs[j].onchange = onTextFieldChange; <br />
} else {<br />
inputs[j].onchange = function(){ _this.validate() };<br />
}<br />
}<br />
}<br />
}<br />
});<br />
<br />
if (document.addEventListener) {<br />
document.addEventListener("DOMContentLoaded", function() {<br />
new Mimi.Signups.EmbedValidation();<br />
});<br />
}<br />
else {<br />
window.attachEvent('onload', function() {<br />
new Mimi.Signups.EmbedValidation();<br />
});<br />
}<br />
})(this);<br />
</script>