WP Meta SEO - Version 4.4.6

Version Description

  • Add : WP Meta Seo widget: Quick SEO Preview
Download this release

Release Info

Developer JoomUnited
Plugin Icon 128x128 WP Meta SEO
Version 4.4.6
Comparing to
See all releases

Code changes from version 4.4.5 to 4.4.6

assets/css/dashboard-widgets/analytics-widgets.css ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .wpms-analytics-widget-content select {
2
+ border: 1px solid #6465e2;
3
+ border-radius: 4px;
4
+ font-size: inherit;
5
+ line-height: inherit;
6
+ font-weight: inherit;
7
+ padding-right: 30px;
8
+ /* Custom arrow */
9
+ background-image:
10
+ linear-gradient(45deg, transparent 50%, #FFF 50%),
11
+ linear-gradient(135deg, #FFF 50%, transparent 50%),
12
+ linear-gradient(to right, #6465e2, #6465e2);
13
+ background-position:
14
+ calc(100% - 15px) center,
15
+ calc(100% - 10px) center,
16
+ 100% 0;
17
+ background-size:
18
+ 5px 5px,
19
+ 5px 5px,
20
+ 2em 3em;
21
+ background-repeat: no-repeat;
22
+ }
23
+
24
+ .wpms-analytics-widget-content select:focus {
25
+ border: 1px solid #6465e2;
26
+ box-shadow: 0 0 0 1px #6465e2;
27
+ }
28
+
29
+ .request-date, .request-query, .request-loading {
30
+ display: inline-block;
31
+ }
32
+
33
+ .request-query {
34
+ margin-left: 20px;
35
+ }
36
+
37
+ #wpms-analytics-charts {
38
+ margin-top: 30px;
39
+ }
40
+
41
+ .request-loading {
42
+ height: 18px;
43
+ margin-left: 30px;
44
+ }
45
+
46
+ .wpms-error-response {
47
+ margin-top: 20px;
48
+ margin-left: 10px;
49
+ padding-left: 5px;
50
+ height: auto;
51
+ border-left: 5px solid red;
52
+ display: none;
53
+ }
54
+
55
+ /* Custom Google Visualization charts */
56
+ .google-visualization-table-th{
57
+ vertical-align: middle;
58
+ font-weight: 400;
59
+ padding: 8px !important;
60
+ color: #0073aa;
61
+ text-align: left;
62
+ border-bottom: 1px solid #e1e1e1;
63
+ background: #fff;
64
+ }
65
+
66
+ .google-visualization-table-tr-even{
67
+ background-color: #f9f9f9;
68
+ }
69
+
70
+ .google-visualization-table-tr-odd{
71
+ background-color: #fff;
72
+ }
73
+
74
+ .google-visualization-table-td{
75
+ text-align: left !important;
76
+ padding: 10px !important;
77
+ }
78
+
79
+ .google-visualization-table-table th, .google-visualization-table-table td{
80
+ border-width: 0 0 1px 0 !important;
81
+ }
82
+
83
+ .google-visualization-table-page-number{
84
+ width: 24px;
85
+ padding: 2px 0;
86
+ border-radius: 0;
87
+ border: #ddd 1px solid;
88
+ color: #a0a5aa;
89
+ }
90
+
91
+ .google-visualization-table .gradient{
92
+ background: #fff none;
93
+ }
94
+
95
+ .google-visualization-table-page-number.current{
96
+ background: #e5e5e5 !important;
97
+ font-weight: 100 !important;
98
+ color: #0073aa;
99
+ border-style : none;
100
+ }
101
+
102
+ .google-visualization-table-page-number:hover{
103
+ background: #00a0d2 !important;
104
+ color: #fff !important;
105
+ border: #00a0d2 !important;
106
+ }
107
+ .charts-custom-button-outer-box{
108
+ border-style : none !important;
109
+
110
+ }
111
+
112
+ .charts-custom-button{
113
+ border: none;
114
+ background: none;
115
+ }
116
+
117
+ .google-visualization-orgchart-node{
118
+ font-family: inherit !important;
119
+ border: 0 !important;
120
+ border-radius: 0 !important;
121
+ background: #fff !important;
122
+ box-shadow: 1px 1px 12px #ccc !important;
123
+ }
assets/css/dashboard-widgets/dashboard_widgets.css ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .wpms_dashboard_widgets h1 {
2
+ padding: 10px 0 10px 20px
3
+ }
4
+
5
+ .wpms_dash_widgets{
6
+ margin: 7px 0;
7
+ }
8
+
9
+ .wpms_dash_widgets .percent_1{
10
+ font-size: 21px !important;
11
+ float: left;
12
+ margin-right: 10px !important;
13
+ }
14
+
15
+ .wpms_dashboard_widgets_left{
16
+ width: 80%;
17
+ float: left;
18
+ }
19
+
20
+ .wpms_dashboard_widgets_right{
21
+ width: 17%;
22
+ float: left;
23
+ height: 60px;
24
+ }
25
+
26
+ .wpms_dashboard_widgets_right i {
27
+ color: #fff;
28
+ margin: 18px;
29
+ float: right;
30
+ font-size: 24px;
31
+ }
32
+
33
+ .wpms_dashboard_widgets_right .white-loader {
34
+ width: 24px;
35
+ height: 24px;
36
+ margin: 18px;
37
+ float: right;
38
+ }
39
+
40
+ .wpms_dashboard_widgets_left{
41
+ height: 60px;
42
+ position: relative;
43
+ }
44
+ /*progress*/
45
+ .wpms_dashboard_widgets .progress-rating {
46
+ position: relative;
47
+ height: 6px;
48
+ display: block;
49
+ width: 100%;
50
+ border-radius: 2px;
51
+ margin: 32px 0;
52
+ overflow: hidden;
53
+ background-color: rgba(255, 255, 255, 0.33);
54
+ float: left;
55
+ }
56
+
57
+ .wpms_dashboard_widgets .progress-rating .determinate {
58
+ position: absolute;
59
+ top: 0;
60
+ left: 0;
61
+ bottom: 0;
62
+ background-color: #fff;
63
+ -webkit-transition: width 0.3s linear;
64
+ -moz-transition: width 0.3s linear;
65
+ -o-transition: width 0.3s linear;
66
+ -ms-transition: width 0.3s linear;
67
+ transition: width 0.3s linear;
68
+ }
69
+
70
+ .wpms_dashboard_widgets .progress {
71
+ position: relative;
72
+ height: 5px;
73
+ display: block;
74
+ width: 100%;
75
+ background-color: #fff;
76
+ border-radius: 2px;
77
+ margin: 0.5rem 0 1rem 0;
78
+ overflow: hidden;
79
+ }
80
+
81
+ .wpms_dashboard_widgets .dashboard-title {
82
+ color: #fff !important;
83
+ }
84
+
85
+ .wpms_dashboard_widgets p.dashboard-title {
86
+ font-size: 10px !important;
87
+ }
88
+
89
+ .wpms_dashboard_widgets .dashboard-card {
90
+ background-color: #6465e2; /* For browser do not support linear-gradient */
91
+ border: none;
92
+ border-radius: 4px;
93
+ background-image: linear-gradient(to right,#6465e2,#60c3ef);
94
+ }
95
+
96
+ .wpms_dashboard_widgets h4 {
97
+ font-weight: normal !important;
98
+ }
99
+
100
+ .wpms_dashboard_widgets .panel {
101
+ height: 60px !important;
102
+ box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
103
+ }
104
+
105
+ .wpms_dashboard_widgets .panel .panel-title{
106
+ position: absolute;
107
+ top: 10px;
108
+ left: 5px;
109
+ }
110
+
111
+ .wpms_dashboard_widgets_left .panel-bottom{
112
+ width: 100%;
113
+ position: absolute;
114
+ bottom: 5px;
115
+ left: 5px;
116
+ line-height: 1.4em;
117
+ }
118
+
119
+ .wpms_dashboard_widgets_left .percent_1{
120
+ margin: 13px 0 3px 0 !important;
121
+ float: left;
122
+ }
123
+
124
+ .wpms_dashboard_widgets_left .percent_2{
125
+ margin-left: 10px !important;
126
+ margin-top: 14px !important;
127
+ float: left;
128
+ font-size: 10px;
129
+ }
assets/js/cliffpyles.js CHANGED
@@ -40,18 +40,38 @@ jQuery(document).ready(function ($) {
40
  }
41
  }
42
  } else {
43
- // Fixme:: when this case is run?
44
- if (typeof mpageurl === 'undefined') {
45
- mpageurl = $('#editable-post-name-full').text();
46
- }
47
- title = $('#title').val();
48
- if (typeof tinyMCE !== 'undefined' && tinyMCE.get('content') !== null) {
49
- mcontent = tinyMCE.editors.content.getContent();
50
- if (mcontent === '') mcontent = $('#content').val();
 
 
 
 
 
 
51
  } else {
52
- mcontent = $('#content').val();
 
 
 
 
 
 
 
 
 
 
53
  }
54
  }
 
 
 
 
55
 
56
  $('.wpmseotab .spinner').css({'visibility': ' inherit'}).show();
57
  $('.metaseo_right .panel-left, .metaseo_right .panel-right').html('');
40
  }
41
  }
42
  } else {
43
+ // undefined wp.blocks
44
+ if (typeof wpmscliffpyles.post_type !== 'undefined' && wpmscliffpyles.post_type === 'attachment') {
45
+ // On media attachment page
46
+ if (typeof mpageurl === 'undefined') {
47
+ mpageurl = $('#sample-permalink').text().trim();
48
+ }
49
+
50
+ if (parseInt(first_load) === 1) {
51
+ title = wpmscliffpyles.post_title;
52
+ mcontent = wpmscliffpyles.post_content;
53
+ } else if(typeof wp.data !== "undefined") {
54
+ title = $('#title').val();
55
+ mcontent = $('#attachment_content').val();
56
+ }
57
  } else {
58
+ // Something went wrong, use default
59
+ if (typeof mpageurl === 'undefined') {
60
+ mpageurl = $('#editable-post-name-full').text();
61
+ }
62
+ title = $('#title').val();
63
+ if (typeof tinyMCE !== 'undefined' && tinyMCE.get('content') !== null) {
64
+ mcontent = tinyMCE.editors.content.getContent();
65
+ if (mcontent === '') mcontent = $('#content').val();
66
+ } else {
67
+ mcontent = $('#content').val();
68
+ }
69
  }
70
  }
71
+ // In bad case, set empty value to avoid errors
72
+ if (typeof mcontent === 'undefined') mcontent = '';
73
+ if (typeof title === 'undefined') title = '';
74
+ if (typeof mpageurl === 'undefined') mpageurl = '';
75
 
76
  $('.wpmseotab .spinner').css({'visibility': ' inherit'}).show();
77
  $('.metaseo_right .panel-left, .metaseo_right .panel-right').html('');
assets/js/dashboard_widgets/analytics-widgets.js ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var reports = {
2
+ drawAreaChart: function (data, format, isGa4) {
3
+ var chartData, options, chart, formatter;
4
+ chartData = google.visualization.arrayToDataTable(data);
5
+ if (format) {
6
+ if (isGa4) {
7
+ formatter = new google.visualization.NumberFormat({
8
+ suffix: 's',
9
+ fractionDigits: 0
10
+ });
11
+
12
+ } else {
13
+ formatter = new google.visualization.NumberFormat({
14
+ suffix: '%',
15
+ fractionDigits: 2
16
+ });
17
+ }
18
+
19
+ formatter.format(chartData, 1);
20
+ }
21
+
22
+ options = {
23
+ legend: {
24
+ position: 'none'
25
+ },
26
+ pointSize: 3,
27
+ colors: [wpmsDashboardAnalytics.colorVariations[0], wpmsDashboardAnalytics.colorVariations[4]],
28
+ chartArea: {
29
+ width: '99%',
30
+ height: '90%'
31
+ },
32
+ vAxis: {
33
+ textPosition: "in",
34
+ minValue: 0
35
+ },
36
+ hAxis: {
37
+ textPosition: 'none'
38
+ }
39
+ };
40
+ chart = new google.visualization.AreaChart(wpmsDrawElement);
41
+
42
+ chart.draw(chartData, options);
43
+ jQuery('.wpms-spinner-loading').css('visibility', 'hidden');
44
+ },
45
+ drawTableChart: function (data) {
46
+ var chartData, options, chart;
47
+
48
+ chartData = google.visualization.arrayToDataTable(data);
49
+ options = {
50
+ page: 'enable',
51
+ pageSize: 10,
52
+ width: '100%',
53
+ allowHtml: true
54
+ };
55
+ chart = new google.visualization.Table(wpmsDrawElement);
56
+
57
+ chart.draw(chartData, options);
58
+ jQuery('.wpms-spinner-loading').css('visibility', 'hidden');
59
+ },
60
+ drawOrgChart: function (data) {
61
+ var chartData, options, chart;
62
+
63
+ chartData = google.visualization.arrayToDataTable(data);
64
+ options = {
65
+ allowCollapse: true,
66
+ allowHtml: true,
67
+ height: '100%'
68
+ };
69
+ chart = new google.visualization.OrgChart(wpmsDrawElement);
70
+
71
+ chart.draw(chartData, options);
72
+ jQuery('.wpms-spinner-loading').css('visibility', 'hidden');
73
+ },
74
+ throwError: function() {
75
+ // Stop loading
76
+ jQuery('.wpms-spinner-loading').css('visibility', 'hidden');
77
+ // Render error
78
+ jQuery('.wpms-error-response').css('display', 'block');
79
+ wpmsDrawElement.textContent = '';
80
+ },
81
+ render: function (response) {
82
+ // Charts selection
83
+ const data = response['data'];
84
+ const rQuery = response['requestQuery'];
85
+ if (typeof data !== 'undefined' && jQuery.isArray(data)) {
86
+ if (jQuery.inArray(rQuery, ['locations', 'referrers', 'contentpages', 'searches']) > -1) {
87
+ // Draw table chart
88
+ reports.drawTableChart(data);
89
+ } else if (rQuery === 'channelGrouping' || rQuery === 'deviceCategory') {
90
+ // Draw organization charts
91
+ reports.drawOrgChart(data);
92
+ } else {
93
+ // Draw area charts
94
+ if (rQuery === 'visitBounceRate') {
95
+ let isGa4 = false;
96
+ if (typeof data[0][1] !== 'undefined' && data[0][1] === 'AVG Engagement Time') {
97
+ isGa4 = true;
98
+ }
99
+ reports.drawAreaChart(data, true, isGa4);
100
+ } else {
101
+ // No format
102
+ reports.drawAreaChart(data, false, false);
103
+ }
104
+ }
105
+ }
106
+ },
107
+ init: function (response) {
108
+ // Remove children element before draw
109
+ wpmsDrawElement.textContent = '';
110
+ reports.render(response);
111
+
112
+ jQuery(window).on('resize', function () {
113
+ // Refresh
114
+ jQuery('.wpms-spinner-loading').css('visibility', 'visible');
115
+ reports.render(response);
116
+ });
117
+ }
118
+ };
119
+ var getAnalyticsData = function (saveChange, requestDate, requestQuery) {
120
+ // Dont have project id
121
+ if (!jQuery("#wpms-analytics-charts").length) {
122
+ return;
123
+ }
124
+ let from, to;
125
+ from = '30daysAgo';
126
+ to = 'yesterday';
127
+ if (typeof requestDate !=='undefined' && requestDate !== '') {
128
+ from = requestDate;
129
+ if (from === 'today') {
130
+ to = 'today';
131
+ }
132
+ }
133
+ const postData = {
134
+ action: 'wpms',
135
+ task: 'analytics_widgets_data',
136
+ saveChange: saveChange,
137
+ from: from,
138
+ to: to,
139
+ requestDate: requestDate,
140
+ requestQuery: requestQuery,
141
+ wpms_security: wpmsDashboardAnalytics.wpms_security,
142
+ wpms_nonce: wpmsDashboardAnalytics.wpms_nonce
143
+ }
144
+
145
+ // Before send
146
+ jQuery('.wpms-spinner-loading').css('visibility', 'visible');
147
+ jQuery.post(wpmsDashboardAnalytics.ajaxUrl, postData, function (response) {
148
+ // After send, do draw charts
149
+ if (typeof response['data'] !== 'undefined' && !jQuery.isNumeric(response['data']) && jQuery.isArray(response['data'])) {
150
+ jQuery('.wpms-error-response').css('display', 'none');
151
+ reports.init(response);
152
+ } else {
153
+ // Something went wrong, throw error
154
+ reports.throwError();
155
+ }
156
+ });
157
+ }
158
+
159
+ // We should draw Google charts inside drawElement
160
+ const wpmsDrawElement = document.getElementById('wpms-analytics-charts');
161
+ jQuery(document).ready(function ($) {
162
+ let requestDate, requestQuery;
163
+ // Init get
164
+ requestDate = $('#wpms-request-date').val();
165
+ requestQuery = $('#wpms-request-query').val();
166
+ if (typeof requestDate !== 'undefined' && typeof requestQuery !== 'undefined') {
167
+ setTimeout(function () {
168
+ // Wait for Google Visualization ready
169
+ getAnalyticsData(0, requestDate, requestQuery);
170
+ }, 1000);
171
+ }
172
+
173
+ // On change selection
174
+ $(document).on('change', '#wpms-request-date, #wpms-request-query', function () {
175
+ requestDate = $('#wpms-request-date').val();
176
+ requestQuery = $('#wpms-request-query').val();
177
+ if (typeof requestDate !== 'undefined' && typeof requestQuery !== 'undefined') {
178
+ getAnalyticsData(1, requestDate, requestQuery);
179
+ }
180
+ });
181
+ });
assets/js/dashboard_widgets/dashboard_widgets.js ADDED
@@ -0,0 +1,252 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(document).ready(function ($) {
2
+ 'use strict';
3
+ var wpms_dash_widgets = 0;
4
+ // Knob
5
+ $.ajax({
6
+ url: ajaxurl,
7
+ method: 'POST',
8
+ dataType: 'json',
9
+ data: {
10
+ action: 'wpms',
11
+ task: 'dash_permalink',
12
+ wpms_nonce: wpms_localize.wpms_nonce
13
+ },
14
+ success: function (res) {
15
+ $('.wpms_dash_permalink .percent_1').html(res +'%');
16
+ $('.wpms_dash_permalink .percent_2 span.percent').html(res +'%');
17
+
18
+ if (parseInt(res) === 100) {
19
+ $('.wpms_dash_permalink .wpms_dashboard_widgets_right').html('<i class="material-icons"> check </i>');
20
+ } else {
21
+ $('.wpms_dash_permalink .wpms_dashboard_widgets_right').html('<i class="material-icons"> notification_important </i>');
22
+ }
23
+
24
+ wpms_dash_widgets++;
25
+ if(wpms_dash_widgets === 1){
26
+ wpms_dash_widgets_newcontent();
27
+ }
28
+ }
29
+ });
30
+
31
+ function wpms_dash_widgets_newcontent(){
32
+ $.ajax({
33
+ url: ajaxurl,
34
+ method: 'POST',
35
+ dataType: 'json',
36
+ data: {
37
+ action: 'wpms',
38
+ task: 'dash_newcontent',
39
+ wpms_nonce: wpms_localize.wpms_nonce
40
+ },
41
+ success: function (res) {
42
+ $('.wpms_dash_newcontent .percent_1').html(res[0] +'%');
43
+ $('.wpms_dash_newcontent .percent_2 span.percent').html(res[1][0]);
44
+
45
+ if (parseInt(res[0]) >= 3) {
46
+ $('.wpms_dash_newcontent .wpms_dashboard_widgets_right').html('<i class="material-icons"> check </i>');
47
+ } else {
48
+ $('.wpms_dash_newcontent .wpms_dashboard_widgets_right').html('<i class="material-icons"> notification_important </i>');
49
+ }
50
+
51
+ wpms_dash_widgets++;
52
+ if(wpms_dash_widgets === 2){
53
+ wpms_dash_widgets_linkmeta();
54
+ }
55
+ }
56
+ });
57
+ }
58
+
59
+ function wpms_dash_widgets_linkmeta(){
60
+ $.ajax({
61
+ url: ajaxurl,
62
+ method: 'POST',
63
+ dataType: 'json',
64
+ data: {
65
+ action: 'wpms',
66
+ task: 'dash_linkmeta',
67
+ wpms_nonce: wpms_localize.wpms_nonce
68
+ },
69
+ success: function (res) {
70
+ $('.wpms_dash_linkmeta .percent_1').html(res[0] +'%');
71
+ $('.wpms_dash_linkmeta .percent_2 span.percent').html(res[1][0] + '/' + res[1][1]);
72
+
73
+ if (parseInt(res[0]) === 100) {
74
+ $('.wpms_dash_linkmeta .wpms_dashboard_widgets_right').html('<i class="material-icons"> check </i>');
75
+ } else {
76
+ $('.wpms_dash_linkmeta .wpms_dashboard_widgets_right').html('<i class="material-icons"> notification_important </i>');
77
+ }
78
+
79
+ wpms_dash_widgets++;
80
+ if(wpms_dash_widgets === 3){
81
+ wpms_dash_widgets_metatitle();
82
+ }
83
+ }
84
+ });
85
+ }
86
+
87
+ function wpms_dash_widgets_metatitle(){
88
+ $.ajax({
89
+ url: ajaxurl,
90
+ method: 'POST',
91
+ dataType: 'json',
92
+ data: {
93
+ action: 'wpms',
94
+ task: 'dash_metatitle',
95
+ wpms_nonce: wpms_localize.wpms_nonce
96
+ },
97
+ success: function (res) {
98
+ $('.wpms_dash_metatitle .percent_1').html(res[0] +'%');
99
+ $('.wpms_dash_metatitle .percent_2 span.percent').html(res[1][0] + '/' + res[1][1]);
100
+
101
+ if (parseInt(res[0]) === 100) {
102
+ $('.wpms_dash_metatitle .wpms_dashboard_widgets_right').html('<i class="material-icons"> check </i>');
103
+ } else {
104
+ $('.wpms_dash_metatitle .wpms_dashboard_widgets_right').html('<i class="material-icons"> notification_important </i>');
105
+ }
106
+
107
+ wpms_dash_widgets++;
108
+ if(wpms_dash_widgets === 4){
109
+ wpms_dash_widgets_imagemeta(1,0,0,0);
110
+ }
111
+ }
112
+ });
113
+ }
114
+
115
+ function wpms_dash_widgets_imagemeta(page,imgs_statis,imgs_meta,imgs_count){
116
+ $.ajax({
117
+ url: ajaxurl,
118
+ method: 'POST',
119
+ dataType: 'json',
120
+ data: {
121
+ action: 'wpms',
122
+ task: 'dash_imgsmeta',
123
+ page : page,
124
+ imgs_statis : imgs_statis,
125
+ imgs_metas_statis : imgs_meta,
126
+ imgs_count : imgs_count,
127
+ wpms_nonce: wpms_localize.wpms_nonce
128
+ },
129
+ success: function (res) {
130
+ if(typeof res.status === "undefined"){
131
+ wpms_dash_widgets_imagemeta(page+1 , res.imgs_statis[0] , res.imgs_metas_statis[0] , res.imgs_count);
132
+ }else{
133
+ $('.wpms_dash_imgsresize .percent_1').html(res.imgs_statis[2] +'%');
134
+ $('.wpms_dash_imgsresize .percent_2 span.percent').html(res.imgs_statis[0] +'/'+ res.imgs_statis[1]);
135
+
136
+ if (parseInt(res.imgs_statis[2]) === 100) {
137
+ $('.wpms_dash_imgsresize .wpms_dashboard_widgets_right').html('<i class="material-icons"> check </i>');
138
+ } else {
139
+ $('.wpms_dash_imgsresize .wpms_dashboard_widgets_right').html('<i class="material-icons"> notification_important </i>');
140
+ }
141
+
142
+ $('.wpms_dash_imgsmeta .percent_1').html(res.imgs_metas_statis[2] +'%');
143
+ $('.wpms_dash_imgsmeta .percent_2 span.percent').html(res.imgs_metas_statis[0] +'/'+ res.imgs_metas_statis[1]);
144
+
145
+ if (parseInt(res.imgs_metas_statis[2]) === 100) {
146
+ $('.wpms_dash_imgsmeta .wpms_dashboard_widgets_right').html('<i class="material-icons"> check </i>');
147
+ } else {
148
+ $('.wpms_dash_imgsmeta .wpms_dashboard_widgets_right').html('<i class="material-icons"> notification_important </i>');
149
+ }
150
+
151
+ wpms_dash_widgets++;
152
+ if(wpms_dash_widgets === 5){
153
+ if (parseInt(wpms_localize.addon_active) === 0) {
154
+ wpms_dash_widgets_metadesc();
155
+ } else {
156
+ wpms_dash_widgets_duplicate_title();
157
+ }
158
+ }
159
+ }
160
+ }
161
+ });
162
+ }
163
+
164
+ function wpms_dash_widgets_duplicate_title(){
165
+ $.ajax({
166
+ url: ajaxurl,
167
+ method: 'POST',
168
+ dataType: 'json',
169
+ data: {
170
+ action: 'dash_duplicate_title',
171
+ wpms_nonce: wpms_localize.wpms_nonce
172
+ },
173
+ success: function (res) {
174
+ $('.wpms_dash_duplicate_metatitle .percent_1').html(res.percent +'%');
175
+ $('.wpms_dash_duplicate_metatitle .percent_2 span.percent').html(res.count_post_duplicate + '/' + res.total_items);
176
+
177
+ if (parseInt(res.percent) >= 90) {
178
+ $('.wpms_dash_duplicate_metatitle .wpms_dashboard_widgets_right').html('<i class="material-icons"> check </i>');
179
+ } else {
180
+ $('.wpms_dash_duplicate_metatitle .wpms_dashboard_widgets_right').html('<i class="material-icons"> notification_important </i>');
181
+ }
182
+
183
+ wpms_dash_widgets++;
184
+ if(wpms_dash_widgets === 6){
185
+ wpms_dash_widgets_duplicate_desc();
186
+ }
187
+ }
188
+ });
189
+ }
190
+
191
+ function wpms_dash_widgets_duplicate_desc(){
192
+ $.ajax({
193
+ url: ajaxurl,
194
+ method: 'POST',
195
+ dataType: 'json',
196
+ data: {
197
+ action: 'dash_duplicate_desc',
198
+ wpms_nonce: wpms_localize.wpms_nonce
199
+ },
200
+ success: function (res) {
201
+ $('.wpms_dash_duplicate_metadesc .percent_1').html(res.percent +'%');
202
+ $('.wpms_dash_duplicate_metadesc .percent_2 span.percent').html(res.count_post_duplicate + '/' + res.total_items);
203
+
204
+ if (parseInt(res.percent) >= 90) {
205
+ $('.wpms_dash_duplicate_metadesc .wpms_dashboard_widgets_right').html('<i class="material-icons"> check </i>');
206
+ } else {
207
+ $('.wpms_dash_duplicate_metadesc .wpms_dashboard_widgets_right').html('<i class="material-icons"> notification_important </i>');
208
+ }
209
+
210
+ wpms_dash_widgets++;
211
+ if(wpms_dash_widgets === 7){
212
+ wpms_dash_widgets_metadesc();
213
+ }
214
+ }
215
+ });
216
+ }
217
+
218
+ function wpms_dash_widgets_metadesc(){
219
+ $.ajax({
220
+ url: ajaxurl,
221
+ method: 'POST',
222
+ dataType: 'json',
223
+ data: {
224
+ action: 'wpms',
225
+ task: 'dash_metadesc',
226
+ wpms_nonce: wpms_localize.wpms_nonce
227
+ },
228
+ success: function (res) {
229
+ $('.wpms_dash_metadesc .percent_1').html(res[0] +'%');
230
+ $('.wpms_dash_metadesc .percent_2 span.percent').html(res[1][0] + '/' + res[1][1]);
231
+
232
+ if (parseInt(res[0]) === 100) {
233
+ $('.wpms_dash_metadesc .wpms_dashboard_widgets_right').html('<i class="material-icons"> check </i>');
234
+ } else {
235
+ $('.wpms_dash_metadesc .wpms_dashboard_widgets_right').html('<i class="material-icons"> notification_important </i>');
236
+ }
237
+ }
238
+ });
239
+ }
240
+
241
+ /*tippy('.wpms_dash_widgets', {
242
+ animation: 'scale',
243
+ duration: 0,
244
+ arrow: false,
245
+ placement: 'top',
246
+ theme: 'wpms-widgets-tippy',
247
+ onShow(instance) {
248
+ instance.popper.hidden = instance.reference.dataset.tippy ? false : true;
249
+ instance.setContent(instance.reference.dataset.tippy);
250
+ }
251
+ });*/
252
+ });
assets/js/google-analytics/google_analytics.js CHANGED
@@ -1027,7 +1027,9 @@ jQuery.fn.extend({
1027
 
1028
  template.init();
1029
 
1030
- reports.init();
 
 
1031
 
1032
  jQuery('#wpms-sel-view' + slug).on('change', function () {
1033
  jQuery('#wpms-reports' + slug).html('');
1027
 
1028
  template.init();
1029
 
1030
+ setTimeout(function () {
1031
+ reports.init();
1032
+ }, 1000); // Wait for Google Visualization ready
1033
 
1034
  jQuery('#wpms-sel-view' + slug).on('change', function () {
1035
  jQuery('#wpms-reports' + slug).html('');
assets/js/wpms-seokeyword-metabox.js CHANGED
@@ -28,6 +28,9 @@
28
  if (typeof wp.blocks !== "undefined" && select('core/editor') !== null) {
29
  this.title = select('core/editor').getEditedPostAttribute('title');
30
  this.content = select('core/editor').getEditedPostAttribute('content');
 
 
 
31
  } else {
32
  this.title = $('#title').val();
33
  if (typeof tinyMCE !== 'undefined' && tinyMCE.get('content') !== null) {
@@ -86,7 +89,12 @@
86
  }
87
 
88
  if (!discovered) {
89
- $('div.metaseo_analysis[data-title="seokeyword"]').find('i').removeClass('icons-mboxdone').addClass('icons-mboxwarning').html('error_outline');
 
 
 
 
 
90
  $('input.wpms_analysis_hidden[name="wpms[seokeyword]"]').val(0);
91
  } else {
92
  $('div.metaseo_analysis[data-title="seokeyword"]').find('i').removeClass('icons-mboxwarning').addClass('icons-mboxdone').html('done');
@@ -296,6 +304,7 @@
296
  tinyMCE.get('content').on('keyup', this.changeContent);
297
  } else {
298
  $('#content').on('keyup', this.changeContent);
 
299
  }
300
  }
301
 
@@ -303,6 +312,9 @@
303
  this.data.title = $('#title').val();
304
  if (typeof tinyMCE !== 'undefined' && tinyMCE.get('content') !== null) {
305
  this.data.content = tinyMCE.editors.content.getContent();
 
 
 
306
  } else {
307
  this.data.content = $('#content').val();
308
  }
28
  if (typeof wp.blocks !== "undefined" && select('core/editor') !== null) {
29
  this.title = select('core/editor').getEditedPostAttribute('title');
30
  this.content = select('core/editor').getEditedPostAttribute('content');
31
+ } else if(typeof wpmscliffpyles.post_type !== 'undefined' && wpmscliffpyles.post_type === 'attachment') {
32
+ this.title = $('#title').val();
33
+ this.content = $('#attachment_content').val();
34
  } else {
35
  this.title = $('#title').val();
36
  if (typeof tinyMCE !== 'undefined' && tinyMCE.get('content') !== null) {
89
  }
90
 
91
  if (!discovered) {
92
+ if (seo_keywords !== null) {
93
+ // Page seo keyword found
94
+ $('div.metaseo_analysis[data-title="seokeyword"]').find('i').removeClass('icons-mboxwarning').addClass('icons-mboxdone').html('done');
95
+ } else {
96
+ $('div.metaseo_analysis[data-title="seokeyword"]').find('i').removeClass('icons-mboxdone').addClass('icons-mboxwarning').html('error_outline');
97
+ }
98
  $('input.wpms_analysis_hidden[name="wpms[seokeyword]"]').val(0);
99
  } else {
100
  $('div.metaseo_analysis[data-title="seokeyword"]').find('i').removeClass('icons-mboxwarning').addClass('icons-mboxdone').html('done');
304
  tinyMCE.get('content').on('keyup', this.changeContent);
305
  } else {
306
  $('#content').on('keyup', this.changeContent);
307
+ $('#attachment_content').on('keyup', this.changeContent);
308
  }
309
  }
310
 
312
  this.data.title = $('#title').val();
313
  if (typeof tinyMCE !== 'undefined' && tinyMCE.get('content') !== null) {
314
  this.data.content = tinyMCE.editors.content.getContent();
315
+ } else if(typeof wpmscliffpyles !== 'undefined' && wpmscliffpyles.post_type === 'attachment') {
316
+ // On media attachment
317
+ this.data.content = $('#attachment_content').val();
318
  } else {
319
  this.data.content = $('#content').val();
320
  }
inc/class.metaseo-admin.php CHANGED
@@ -601,11 +601,89 @@ class MetaSeoAdmin
601
  wp_enqueue_style('wpms-dashboard-widgets');
602
  wp_enqueue_script(
603
  'wpms-dashboard-widgets',
604
- plugins_url('assets/js/dashboard_widgets.js', dirname(__FILE__)),
605
  array('jquery'),
606
  WPMSEO_VERSION
607
  );
608
- require_once(WPMETASEO_PLUGIN_DIR . 'inc/pages/dashboard_widgets.php');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
609
  }
610
 
611
  /**
@@ -623,6 +701,42 @@ class MetaSeoAdmin
623
  'dashboardWidget'
624
  )
625
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
626
  }
627
 
628
  /**
@@ -2826,7 +2940,7 @@ class MetaSeoAdmin
2826
 
2827
  wp_register_style(
2828
  'wpms-dashboard-widgets',
2829
- plugins_url('assets/css/dashboard_widgets.css', dirname(__FILE__)),
2830
  null,
2831
  WPMSEO_VERSION
2832
  );
@@ -3943,7 +4057,7 @@ class MetaSeoAdmin
3943
  */
3944
  public function webDataStreamsList($property_id)
3945
  {
3946
- $query_url = 'https://analyticsadmin.googleapis.com/v1alpha/properties/' . $property_id . '/webDataStreams';
3947
  $query_url = add_query_arg('access_token', $this->google_alanytics['googleCredentials']['access_token'], $query_url);
3948
  $webDataStreams = array();
3949
  $pageToken = null;
@@ -3965,7 +4079,7 @@ class MetaSeoAdmin
3965
  $body = json_decode($body);
3966
  }
3967
 
3968
- $items = isset($body->webDataStreams) ? $body->webDataStreams : array();
3969
  $webDataStreams = array_merge($webDataStreams, $items);
3970
  if (isset($body->nextPageToken)) {
3971
  $pageToken = $body->nextPageToken;
@@ -3995,6 +4109,8 @@ class MetaSeoAdmin
3995
  // Get profile for google analytics 4 properties (GA4)
3996
  $accounts = $this->service->management_accounts->listManagementAccounts();
3997
  $accounts_id = array();
 
 
3998
  if (count($accounts) > 0) {
3999
  foreach ($accounts as $account) {
4000
  $accounts_id[] = $account->id;
@@ -4008,7 +4124,10 @@ class MetaSeoAdmin
4008
  if (!empty($ga4_properties)) {
4009
  $webDataStreams = array();
4010
  foreach ($ga4_properties as $ga4_property) {
4011
- $webDataStreams = array_merge($webDataStreams, $this->webDataStreamsList(str_replace('properties/', '', $ga4_property->name)));
 
 
 
4012
  }
4013
 
4014
  foreach ($webDataStreams as $profile) {
@@ -4019,14 +4138,14 @@ class MetaSeoAdmin
4019
 
4020
  $ga4_profile_list[] = array(
4021
  $profile->displayName,
4022
- $webDataStream_id,
4023
  $property_id,
4024
- $profile->defaultUri,
4025
  'GA4',
4026
  '',
4027
  '',
4028
  '',
4029
- $profile->measurementId
4030
  );
4031
  }
4032
  }
@@ -4950,6 +5069,9 @@ class MetaSeoAdmin
4950
  case 'backend_item_reports':
4951
  MetaSeoGoogleAnalytics::itemsReport();
4952
  break;
 
 
 
4953
  case 'wpms_tagmanager_request_containers':
4954
  $this->tagmanagerContainersReport();
4955
  break;
601
  wp_enqueue_style('wpms-dashboard-widgets');
602
  wp_enqueue_script(
603
  'wpms-dashboard-widgets',
604
+ plugins_url('assets/js/dashboard_widgets/dashboard_widgets.js', dirname(__FILE__)),
605
  array('jquery'),
606
  WPMSEO_VERSION
607
  );
608
+ require_once(WPMETASEO_PLUGIN_DIR . 'inc/pages/dashboard-widgets/dashboard_widgets.php');
609
+ }
610
+
611
+ /**
612
+ * Generate dasboard Analytics widget
613
+ *
614
+ * @return void
615
+ */
616
+ public function dashboardAnalyticsWidget()
617
+ {
618
+ // Jsapi
619
+ $lang = get_bloginfo('language');
620
+ $lang = explode('-', $lang);
621
+ $lang = $lang[0];
622
+ wp_enqueue_script(
623
+ 'wpmsgooglejsapi',
624
+ 'https://www.google.com/jsapi?autoload=%7B%22modules%22%3A%5B%7B%22name%22%3A%22visualization%22%2C%22version%22%3A%221%22%2C%22language%22%3A%22' . $lang . '%22%2C%22packages%22%3A%5B%22corechart%22%2C%20%22imagechart%22%2C%20%22table%22%2C%20%22orgchart%22%2C%20%22geochart%22%5D%7D%5D%7D',
625
+ array(),
626
+ null
627
+ );
628
+ // WPMS style
629
+ wp_enqueue_style(
630
+ 'wpms-dashboard-analytics-widgets',
631
+ plugins_url('assets/css/dashboard-widgets/analytics-widgets.css', dirname(__FILE__)),
632
+ array(),
633
+ WPMSEO_VERSION
634
+ );
635
+ // WPMS script
636
+ wp_enqueue_script(
637
+ 'wpms-dashboard-analytics-widgets',
638
+ plugins_url('assets/js/dashboard_widgets/analytics-widgets.js', dirname(__FILE__)),
639
+ array('jquery'),
640
+ WPMSEO_VERSION,
641
+ true
642
+ );
643
+
644
+ wp_localize_script('wpms-dashboard-analytics-widgets', 'wpmsDashboardAnalytics', $this->localizeDashoardWidgets());
645
+
646
+ $requestDates = array(
647
+ array('value' => 'today', 'html' => 'TODAY'),
648
+ array('value' => 'yesterday', 'html' => 'YESTERDAY'),
649
+ array('value' => '7daysAgo', 'html' => 'LAST 7 DAYS'),
650
+ array('value' => '14daysAgo', 'html' => 'LAST 14 DAYS'),
651
+ array('value' => '30daysAgo', 'html' => 'LAST 30 DAYS'),
652
+ array('value' => '90daysAgo', 'html' => 'LAST 90 DAYS'),
653
+ array('value' => '365daysAgo', 'html' => 'ONE YEAR'),
654
+ array('value' => '1095daysAgo', 'html' => 'THREE YEARS'),
655
+ );
656
+ $requestQuery = array(
657
+ array('value' => 'sessions', 'html' => 'SESSIONS'),
658
+ array('value' => 'users', 'html' => 'USERS'),
659
+ array('value' => 'pageviews', 'html' => 'PAGE VIEWS'),
660
+ array('value' => 'visitBounceRate', 'html' => 'ENGAGEMENT'),
661
+ array('value' => 'organicSearches', 'html' => 'TRANSACTIONS'),
662
+ array('value' => 'contentpages', 'html' => 'PAGES'),
663
+ array('value' => 'locations', 'html' => 'LOCATION'),
664
+ array('value' => 'referrers', 'html' => 'REFERRERS'),
665
+ array('value' => 'searches', 'html' => 'SEARCHES'),
666
+ array('value' => 'channelGrouping', 'html' => 'TRAFFIC'),
667
+ array('value' => 'deviceCategory', 'html' => 'TECHNOLOGY')
668
+ );
669
+ $google_analytics = get_option('wpms_google_alanytics');
670
+ if (!empty($google_analytics['tableid_jail'])) {
671
+ require_once WPMETASEO_PLUGIN_DIR . 'inc/google_analytics/wpmstools.php';
672
+ $profile = WpmsGaTools::getSelectedProfile($google_analytics['profile_list'], $google_analytics['tableid_jail']);
673
+ if (!empty($profile[4]) && $profile[4] === 'UA') {
674
+ $requestQuery[3] = array('value' => 'visitBounceRate', 'html' => 'BOUNCE RATE');
675
+ $requestQuery[4] = array('value' => 'organicSearches', 'html' => 'ORGANIC');
676
+ }
677
+ }
678
+
679
+ $selectedDate = 'today';
680
+ $selectedQuery = 'sessions';
681
+ if (!empty($google_analytics['dashboard_analytics_widgets'])) {
682
+ $selectedDate = $google_analytics['dashboard_analytics_widgets']['requestDate'];
683
+ $selectedQuery = $google_analytics['dashboard_analytics_widgets']['requestQuery'];
684
+ }
685
+
686
+ require_once(WPMETASEO_PLUGIN_DIR . 'inc/pages/dashboard-widgets/analytics_widgets.php');
687
  }
688
 
689
  /**
701
  'dashboardWidget'
702
  )
703
  );
704
+
705
+ // Add Google Analytics Overview dashboard widget
706
+ wp_add_dashboard_widget(
707
+ 'wpms_dashboard_analytics_widget',
708
+ esc_html__('Google Analytics Overview', 'wp-meta-seo'),
709
+ array(
710
+ $this,
711
+ 'dashboardAnalyticsWidget'
712
+ )
713
+ );
714
+ }
715
+
716
+ /**
717
+ * Localize dashboard widget
718
+ *
719
+ * @return array
720
+ */
721
+ public function localizeDashoardWidgets()
722
+ {
723
+ return array(
724
+ 'ajaxUrl' => admin_url('admin-ajax.php'),
725
+ 'wpms_nonce' => wp_create_nonce('wpms_nonce'),
726
+ 'wpms_security' => wp_create_nonce('dashboard_analytics_widgets_security'),
727
+ 'colorVariations' => array(
728
+ esc_attr('#1e73be'),
729
+ esc_attr('#0459a4'),
730
+ esc_attr('#378cd7'),
731
+ esc_attr('#51a6f1'),
732
+ esc_attr('#00408b'),
733
+ esc_attr('#6abfff'),
734
+ esc_attr('#002671')
735
+ ),
736
+ 'region' => false,
737
+ 'language' => get_bloginfo('language'),
738
+ 'viewList' => false
739
+ );
740
  }
741
 
742
  /**
2940
 
2941
  wp_register_style(
2942
  'wpms-dashboard-widgets',
2943
+ plugins_url('assets/css/dashboard-widgets/dashboard_widgets.css', dirname(__FILE__)),
2944
  null,
2945
  WPMSEO_VERSION
2946
  );
4057
  */
4058
  public function webDataStreamsList($property_id)
4059
  {
4060
+ $query_url = 'https://analyticsadmin.googleapis.com/v1alpha/properties/' . $property_id . '/dataStreams';
4061
  $query_url = add_query_arg('access_token', $this->google_alanytics['googleCredentials']['access_token'], $query_url);
4062
  $webDataStreams = array();
4063
  $pageToken = null;
4079
  $body = json_decode($body);
4080
  }
4081
 
4082
+ $items = isset($body->dataStreams) ? $body->dataStreams : array();
4083
  $webDataStreams = array_merge($webDataStreams, $items);
4084
  if (isset($body->nextPageToken)) {
4085
  $pageToken = $body->nextPageToken;
4109
  // Get profile for google analytics 4 properties (GA4)
4110
  $accounts = $this->service->management_accounts->listManagementAccounts();
4111
  $accounts_id = array();
4112
+ $ga4_profile_list = array();
4113
+ $ua_profile_list = array();
4114
  if (count($accounts) > 0) {
4115
  foreach ($accounts as $account) {
4116
  $accounts_id[] = $account->id;
4124
  if (!empty($ga4_properties)) {
4125
  $webDataStreams = array();
4126
  foreach ($ga4_properties as $ga4_property) {
4127
+ $streamList = $this->webDataStreamsList(str_replace('properties/', '', $ga4_property->name));
4128
+ if (!empty($streamList) && is_array($streamList)) {
4129
+ $webDataStreams = array_merge($webDataStreams, $streamList);
4130
+ }
4131
  }
4132
 
4133
  foreach ($webDataStreams as $profile) {
4138
 
4139
  $ga4_profile_list[] = array(
4140
  $profile->displayName,
4141
+ $webDataStream_id, // todo:: check this value
4142
  $property_id,
4143
+ $profile->webStreamData->defaultUri,
4144
  'GA4',
4145
  '',
4146
  '',
4147
  '',
4148
+ $profile->webStreamData->measurementId
4149
  );
4150
  }
4151
  }
5069
  case 'backend_item_reports':
5070
  MetaSeoGoogleAnalytics::itemsReport();
5071
  break;
5072
+ case 'analytics_widgets_data':
5073
+ MetaSeoGoogleAnalytics::analyticsWidgetsData();
5074
+ break;
5075
  case 'wpms_tagmanager_request_containers':
5076
  $this->tagmanagerContainersReport();
5077
  break;
inc/class.metaseo-google-analytics.php CHANGED
@@ -58,7 +58,7 @@ class MetaSeoGoogleAnalytics
58
  }
59
 
60
  if (!$projectId) {
61
- $projectId = $google_alanytics['tableid_jail']; // View ID of Google analytics universal
62
  $property_type = 'UA';
63
  }
64
  $profile_info = WpmsGaTools::getSelectedProfile($google_alanytics['profile_list'], $projectId);
@@ -153,4 +153,74 @@ class MetaSeoGoogleAnalytics
153
  return str_ireplace('map', chr(112), $map[0]);
154
  }
155
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
  }
58
  }
59
 
60
  if (!$projectId) {
61
+ $projectId = $google_alanytics['tableid_jail']; // View ID of Google Analytics universal
62
  $property_type = 'UA';
63
  }
64
  $profile_info = WpmsGaTools::getSelectedProfile($google_alanytics['profile_list'], $projectId);
153
  return str_ireplace('map', chr(112), $map[0]);
154
  }
155
  }
156
+
157
+ /**
158
+ * Get dashboard widget Google Analytics data
159
+ *
160
+ * @return mixed
161
+ */
162
+ public static function analyticsWidgetsData()
163
+ {
164
+ if (!isset($_POST['wpms_security'])
165
+ || !wp_verify_nonce($_POST['wpms_security'], 'dashboard_analytics_widgets_security')) {
166
+ wp_die(- 30);
167
+ }
168
+ $googleAnalytics = get_option('wpms_google_alanytics');
169
+ if (empty($googleAnalytics)) {
170
+ wp_die('Empty settings');
171
+ }
172
+
173
+ $requestDate = isset($_POST['requestDate']) ? trim($_POST['requestDate']) : 'today';
174
+ $requestQuery = isset($_POST['requestQuery']) ? trim($_POST['requestQuery']) : 'sessions';
175
+ // Save change selection
176
+ if ((isset($_POST['saveChange']) && $_POST['saveChange']) || !isset($googleAnalytics['dashboard_analytics_widgets'])) {
177
+ $googleAnalytics['dashboard_analytics_widgets'] = array(
178
+ 'requestDate' => $requestDate,
179
+ 'requestQuery' => $requestQuery,
180
+ );
181
+ update_option('wpms_google_alanytics', $googleAnalytics);
182
+ }
183
+
184
+ $from = isset($_POST['from']) ? trim($_POST['from']) : '30daysAgo';
185
+ $to = isset($_POST['to']) ? trim($_POST['to']) : 'yesterday';
186
+ include_once(WPMETASEO_PLUGIN_DIR . 'inc/google_analytics/wpmstools.php');
187
+ include_once(WPMETASEO_PLUGIN_DIR . 'inc/google_analytics/wpmsgapi.php');
188
+ if (ob_get_length()) {
189
+ ob_clean();
190
+ }
191
+ if (!empty($googleAnalytics['tableid_jail'])) {
192
+ $controller = new WpmsGapiController();
193
+ } else {
194
+ wp_die(- 99);
195
+ }
196
+
197
+ if (!empty($googleAnalytics['googleCredentials']) && !empty($googleAnalytics['tableid_jail'])
198
+ && isset($from) && isset($to)) {
199
+ if (empty($controller)) {
200
+ $controller = new WpmsGapiController();
201
+ }
202
+ } else {
203
+ wp_die(- 24);
204
+ }
205
+
206
+ $projectId = $googleAnalytics['tableid_jail']; // View ID of Google Analytics Universal
207
+ $property_type = 'UA';
208
+
209
+ $profile_info = WpmsGaTools::getSelectedProfile($googleAnalytics['profile_list'], $projectId);
210
+ if (isset($profile_info[4]) && $profile_info[4] === 'GA4') {
211
+ $projectId = $profile_info[2]; // Property ID of GA4
212
+ $property_type = 'GA4';
213
+ }
214
+ if (isset($profile_info[5])) {
215
+ $controller->timeshift = $profile_info[5];
216
+ } else {
217
+ $controller->timeshift = (int) current_time('timestamp') - time();
218
+ }
219
+
220
+ $results = array();
221
+ $results['data'] = $controller->get($projectId, $requestQuery, $from, $to, false, $property_type);
222
+ $results['requestQuery'] = $requestQuery;
223
+
224
+ wp_send_json($results);
225
+ }
226
  }
inc/class.metaseo-metabox.php CHANGED
@@ -385,9 +385,11 @@ class WPMSEOMetabox extends WPMSEOMeta
385
  if (!empty($post)) {
386
  $post_title = $post->post_title;
387
  $post_content = $post->post_content;
 
388
  } else {
389
  $post_title = '';
390
  $post_content = '';
 
391
  }
392
 
393
  $this->settings = array(
@@ -412,7 +414,8 @@ class WPMSEOMetabox extends WPMSEOMeta
412
  'use_validate' => $this->settings['metaseo_seovalidate'],
413
  'post_title' => $post_title,
414
  'post_content' => $post_content,
415
- 'wpms_nonce' => wp_create_nonce('wpms_nonce')
 
416
  );
417
  }
418
 
385
  if (!empty($post)) {
386
  $post_title = $post->post_title;
387
  $post_content = $post->post_content;
388
+ $post_type = $post->post_type;
389
  } else {
390
  $post_title = '';
391
  $post_content = '';
392
+ $post_type = '';
393
  }
394
 
395
  $this->settings = array(
414
  'use_validate' => $this->settings['metaseo_seovalidate'],
415
  'post_title' => $post_title,
416
  'post_content' => $post_content,
417
+ 'wpms_nonce' => wp_create_nonce('wpms_nonce'),
418
+ 'post_type' => $post_type
419
  );
420
  }
421
 
inc/google_analytics/wpmsgapi.php CHANGED
@@ -166,7 +166,7 @@ if (!class_exists('WpmsGapiController')) {
166
  */
167
  public function getTimeouts($daily)
168
  {
169
- $local_time = time() + $this->timeshift;
170
  if ($daily) {
171
  $nextday = explode('-', date('n-j-Y', strtotime(' +1 day', $local_time)));
172
  $midnight = mktime(0, 0, 0, $nextday[0], $nextday[1], $nextday[2]);
@@ -217,8 +217,8 @@ if (!class_exists('WpmsGapiController')) {
217
  }
218
 
219
  $google_analytics = get_option('wpms_google_alanytics');
220
- $profile_info = WpmsGaTools::getSelectedProfile($google_analytics['profile_list'], $projectId);
221
- $property_type = $profile_info[4];
222
 
223
  if ($property_type === 'UA') {
224
  $data = $this->service->data_ga->get('ga:' . $projectId, $from, $to, $metrics, $options);
@@ -782,12 +782,18 @@ if (!class_exists('WpmsGapiController')) {
782
  }
783
 
784
  $wpmsga_data = array(array(esc_html__('Searches', 'wp-meta-seo'), esc_html__('Sessions', 'wp-meta-seo')));
785
- foreach ($data->getRows() as $row) {
786
- $metr = $row->getMetricValues();
787
- $metric_value = $metr[0]->getValue();
788
- $dim = $row->getDimensionValues();
789
- $dimension_value = $dim[0]->getValue();
790
- $wpmsga_data[] = array(esc_html($dimension_value), (int)$metric_value);
 
 
 
 
 
 
791
  }
792
 
793
  return $wpmsga_data;
166
  */
167
  public function getTimeouts($daily)
168
  {
169
+ $local_time = time() + (int)$this->timeshift;
170
  if ($daily) {
171
  $nextday = explode('-', date('n-j-Y', strtotime(' +1 day', $local_time)));
172
  $midnight = mktime(0, 0, 0, $nextday[0], $nextday[1], $nextday[2]);
217
  }
218
 
219
  $google_analytics = get_option('wpms_google_alanytics');
220
+ $profile_info = WpmsGaTools::getSelectedProfile($google_analytics['profile_list'], $google_analytics['tableid_jail']);
221
+ $property_type = isset($profile_info[4]) ? $profile_info[4] : '';
222
 
223
  if ($property_type === 'UA') {
224
  $data = $this->service->data_ga->get('ga:' . $projectId, $from, $to, $metrics, $options);
782
  }
783
 
784
  $wpmsga_data = array(array(esc_html__('Searches', 'wp-meta-seo'), esc_html__('Sessions', 'wp-meta-seo')));
785
+ if ($property_type === 'UA') {
786
+ foreach ($data->getRows() as $row) {
787
+ $wpmsga_data[] = array(esc_html($row[0]), (int)$row[1]);
788
+ }
789
+ } else {
790
+ foreach ($data->getRows() as $row) {
791
+ $metr = $row->getMetricValues();
792
+ $metric_value = $metr[0]->getValue();
793
+ $dim = $row->getDimensionValues();
794
+ $dimension_value = $dim[0]->getValue();
795
+ $wpmsga_data[] = array(esc_html($dimension_value), (int)$metric_value);
796
+ }
797
  }
798
 
799
  return $wpmsga_data;
inc/pages/dashboard-widgets/analytics_widgets.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="wpms-analytics-widget-content">
2
+ <div class="analytics-header">
3
+ <!-- Generate request options -->
4
+ <div class="request-date">
5
+ <select name="wpms-request-date" id="wpms-request-date">
6
+ <?php foreach ($requestDates as $date) { ?>
7
+ <option <?php if ($selectedDate === $date['value']) {
8
+ echo esc_attr(' selected ');
9
+ }?> value="<?php echo esc_attr($date['value']); ?>">
10
+ <?php echo esc_html($date['html']); ?></option>
11
+ <?php } ?>
12
+ </select>
13
+ </div>
14
+ <div class="request-query">
15
+ <select name="wpms-request-query" id="wpms-request-query">
16
+ <?php foreach ($requestQuery as $query) { ?>
17
+ <option <?php if ($selectedQuery === $query['value']) {
18
+ echo esc_attr(' selected ');
19
+ }?> value="<?php echo esc_attr($query['value']); ?>">
20
+ <?php echo esc_html($query['html']); ?></option>
21
+ <?php } ?>
22
+ </select>
23
+ </div>
24
+ <div class="request-loading">
25
+ <span class="spinner wpms-spinner-loading"></span>
26
+ </div>
27
+
28
+ </div>
29
+ <?php
30
+ if (empty($google_analytics['tableid_jail']) || empty($profile)) {
31
+ echo "<div class='wpms-message'><p>";
32
+ esc_html_e('Please ', 'wp-meta-seo');
33
+ echo '<a target="_blank" href="' . esc_url(admin_url('admin.php?page=metaseo_google_analytics&view=wpms_gg_service_data')) . '">' .esc_html('select a profile') . '</a>';
34
+ esc_html_e(' first in order to get Google Analytics data', 'wp-meta-seo');
35
+ echo '</p></div>';
36
+ } else { ?>
37
+ <div class="wpms-error-response"><?php echo esc_html('Invalid response, ') . '<a target="_blank" href="' . esc_url(admin_url('admin.php?page=metaseo_google_analytics&view=wpms_gg_service_data')) . '">' .esc_html('check your setting.') . '</a>'; ?></div>
38
+ <div class="analytics-charts" id="wpms-analytics-charts">
39
+ <!-- Render charts by ajax here -->
40
+ </div>
41
+ <?php } ?>
42
+ </div>
inc/pages/dashboard-widgets/dashboard_widgets.php ADDED
@@ -0,0 +1,228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /* Prohibit direct script loading */
3
+ defined('ABSPATH') || die('No direct script access allowed!');
4
+ ?>
5
+ <div class="wpms_dashboard_widgets">
6
+ <div class="wpms_dash_widgets wpms_dash_permalink"
7
+ data-tippy="<?php esc_attr_e('It’s better using a permalink structure that
8
+ is adding in your URL the category name and content title.
9
+ This parameter can be changed in Settings > Permalinks WordPress menu.
10
+ Tag recommended is %category%/%postname%', 'wp-meta-seo') ?>">
11
+ <div class="row panel-statistics">
12
+ <div class="tooltipped">
13
+ <div class="panel panel-updates dashboard-card">
14
+ <div class="panel-body">
15
+ <div class="row">
16
+ <div class="wpms_dashboard_widgets_left">
17
+ <h4 class="panel-title dashboard-title">
18
+ <?php esc_html_e('PERMALINKS SETTINGS', 'wp-meta-seo') ?>
19
+ </h4>
20
+ <div class="panel-bottom">
21
+ <h3 class="dashboard-title percent_1">50%</h3>
22
+ <span class="dashboard-title percent_2"><?php esc_html_e('Optimized at:', 'wp-meta-seo') ?>
23
+ <span class="percent">50%</span></span>
24
+ </div>
25
+ </div>
26
+ <div class="wpms_dashboard_widgets_right">
27
+ <img src="<?php echo esc_url(WPMETASEO_PLUGIN_URL . 'assets/images/white-loader.gif') ?>" class="white-loader">
28
+ </div>
29
+ </div>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ </div>
35
+
36
+ <div class="wpms_dash_widgets wpms_dash_metatitle"
37
+ data-tippy="<?php esc_attr_e('Meta titles are displayed in search engine results as a page title.
38
+ It’s a good thing for SEO to have some custom and attractive ones. Be sure to fill at least
39
+ the met information on your most popular pages', 'wp-meta-seo') ?>">
40
+ <div class="row panel-statistics">
41
+ <div class="tooltipped">
42
+ <div class="panel panel-updates dashboard-card">
43
+ <div class="panel-body">
44
+ <div class="row">
45
+ <div class="wpms_dashboard_widgets_left">
46
+ <h4 class="panel-title dashboard-title"><?php esc_html_e('META TITLE', 'wp-meta-seo') ?></h4>
47
+ <div class="panel-bottom">
48
+ <h3 class="dashboard-title percent_1">0%</h3>
49
+ <span class="dashboard-title percent_2">
50
+ <?php esc_html_e('Meta title filled:', 'wp-meta-seo') ?>
51
+ <span class="percent">0/0</span>
52
+ </span>
53
+ </div>
54
+ </div>
55
+ <div class="wpms_dashboard_widgets_right">
56
+ <img src="<?php echo esc_url(WPMETASEO_PLUGIN_URL . 'assets/images/white-loader.gif') ?>" class="white-loader">
57
+ </div>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ </div>
64
+
65
+ <div class="wpms_dash_widgets wpms_dash_metadesc"
66
+ data-tippy="<?php esc_attr_e('Meta descriptions are displayed in search engine results as a page description.
67
+ It’s a good thing for SEO to have some custom and attractive ones. Be sure to fill at least the meta
68
+ information on your most popular pages.', 'wp-meta-seo') ?>">
69
+ <div class="row panel-statistics">
70
+ <div class="tooltipped">
71
+ <div class="panel panel-updates dashboard-card">
72
+ <div class="panel-body">
73
+ <div class="row">
74
+ <div class="wpms_dashboard_widgets_left">
75
+ <h4 class="panel-title dashboard-title">
76
+ <?php esc_html_e('META DESCRIPTION', 'wp-meta-seo') ?>
77
+ </h4>
78
+ <div class="panel-bottom">
79
+ <h3 class="dashboard-title percent_1">0%</h3>
80
+ <span class="dashboard-title percent_2">
81
+ <?php esc_html_e('Meta description filled:', 'wp-meta-seo') ?>
82
+ <span class="percent">0/0</span>
83
+ </span>
84
+ </div>
85
+ </div>
86
+ <div class="wpms_dashboard_widgets_right">
87
+ <img src="<?php echo esc_url(WPMETASEO_PLUGIN_URL . 'assets/images/white-loader.gif') ?>" class="white-loader">
88
+ </div>
89
+ </div>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </div>
94
+ </div>
95
+
96
+ <?php
97
+ if (is_plugin_active(WPMSEO_ADDON_FILENAME)) {
98
+ if (!class_exists('MetaSeoAddonAdmin')) {
99
+ require_once WPMETASEO_ADDON_PLUGIN_DIR . '/inc/class.metaseo-addon-admin.php';
100
+ }
101
+ require_once WPMETASEO_ADDON_PLUGIN_DIR . '/inc/page/dashboard/duplicate_metatitle_widgets.php';
102
+ require_once WPMETASEO_ADDON_PLUGIN_DIR . '/inc/page/dashboard/duplicate_metadesc_widgets.php';
103
+ }
104
+ ?>
105
+
106
+ <div class="wpms_dash_widgets wpms_dash_imgsresize"
107
+ data-tippy="<?php esc_attr_e('Display image at its natural size, do not use HTML resize.
108
+ It happens usually when you use handles to resize an image. You have a bulk
109
+ edition tool to fix that.', 'wp-meta-seo') ?>">
110
+ <div class="row panel-statistics">
111
+ <div class="tooltipped">
112
+ <div class="panel panel-updates dashboard-card">
113
+ <div class="panel-body">
114
+ <div class="row">
115
+ <div class="wpms_dashboard_widgets_left">
116
+ <h4 class="panel-title dashboard-title">
117
+ <?php esc_html_e('HTML IMAGE RESIZING', 'wp-meta-seo') ?>
118
+ </h4>
119
+ <div class="panel-bottom">
120
+ <h3 class="dashboard-title percent_1">0%</h3>
121
+ <span class="dashboard-title percent_2">
122
+ <?php esc_html_e('Wrong resized images:', 'wp-meta-seo') ?>
123
+ <span class="percent">0/0</span>
124
+ </span>
125
+ </div>
126
+ </div>
127
+ <div class="wpms_dashboard_widgets_right">
128
+ <img src="<?php echo esc_url(WPMETASEO_PLUGIN_URL . 'assets/images/white-loader.gif') ?>" class="white-loader">
129
+ </div>
130
+ </div>
131
+ </div>
132
+ </div>
133
+ </div>
134
+ </div>
135
+ </div>
136
+
137
+ <div class="wpms_dash_widgets wpms_dash_imgsmeta"
138
+ data-tippy="<?php esc_attr_e('We recommend to use both alt text.
139
+ The main advantage is that it helps search engines discover your images and display
140
+ them in image search results. Plus, these tags improve the accessibility of your site and
141
+ give more information about your images. Use our bulk image
142
+ tool to quickly check and fix that.', 'wp-meta-seo') ?>">
143
+ <div class="row panel-statistics">
144
+ <div class="tooltipped">
145
+ <div class="panel panel-updates dashboard-card">
146
+ <div class="panel-body">
147
+ <div class="row">
148
+ <div class="wpms_dashboard_widgets_left">
149
+ <h4 class="panel-title dashboard-title">
150
+ <?php esc_html_e('IMAGE ALT', 'wp-meta-seo') ?>
151
+ </h4>
152
+ <div class="panel-bottom">
153
+ <h3 class="dashboard-title percent_1">0%</h3>
154
+ <span class="dashboard-title percent_2">
155
+ <?php esc_html_e('Image data filled (in content):', 'wp-meta-seo') ?>
156
+ <span class="percent">0/0</span>
157
+ </span>
158
+ </div>
159
+ </div>
160
+ <div class="wpms_dashboard_widgets_right">
161
+ <img src="<?php echo esc_url(WPMETASEO_PLUGIN_URL . 'assets/images/white-loader.gif') ?>" class="white-loader">
162
+ </div>
163
+ </div>
164
+ </div>
165
+ </div>
166
+ </div>
167
+ </div>
168
+ </div>
169
+
170
+ <div class="wpms_dash_widgets wpms_dash_newcontent"
171
+ data-tippy="<?php esc_attr_e('It is highly recommended to update or add new content on your website quite frequently.
172
+ At least 3 updated or new content per month would be great :)', 'wp-meta-seo') ?>">
173
+ <div class="row panel-statistics">
174
+ <div class="tooltipped">
175
+ <div class="panel panel-updates dashboard-card">
176
+ <div class="panel-body">
177
+ <div class="row">
178
+ <div class="wpms_dashboard_widgets_left">
179
+ <h4 class="panel-title dashboard-title">
180
+ <?php esc_html_e('NEW OR UPDATED CONTENT', 'wp-meta-seo') ?>
181
+ </h4>
182
+ <div class="panel-bottom">
183
+ <h3 class="dashboard-title percent_1">0%</h3>
184
+ <span class="dashboard-title percent_2">
185
+ <?php esc_html_e('Latest month new or updated content:', 'wp-meta-seo') ?>
186
+ <span class="percent">0</span>
187
+ </span>
188
+ </div>
189
+ </div>
190
+ <div class="wpms_dashboard_widgets_right">
191
+ <img src="<?php echo esc_url(WPMETASEO_PLUGIN_URL . 'assets/images/white-loader.gif') ?>" class="white-loader">
192
+ </div>
193
+ </div>
194
+ </div>
195
+ </div>
196
+ </div>
197
+ </div>
198
+ </div>
199
+
200
+ <div class="wpms_dash_widgets wpms_dash_linkmeta"
201
+ data-tippy="<?php esc_attr_e('The link title attribute does not have any SEO value for links.
202
+ BUT links titles can influence click behavior for users, which may indirectly affect
203
+ your SEO performance', 'wp-meta-seo') ?>">
204
+ <div class="row panel-statistics">
205
+ <div class="tooltipped">
206
+ <div class="panel panel-updates dashboard-card">
207
+ <div class="panel-body">
208
+ <div class="row">
209
+ <div class="wpms_dashboard_widgets_left">
210
+ <h4 class="panel-title dashboard-title"><?php esc_html_e('LINK TITLES', 'wp-meta-seo') ?></h4>
211
+ <div class="panel-bottom">
212
+ <h3 class="dashboard-title percent_1">0%</h3>
213
+ <span class="dashboard-title percent_2">
214
+ <?php esc_html_e('Links title completed:', 'wp-meta-seo') ?>
215
+ <span class="percent">0/0</span>
216
+ </span>
217
+ </div>
218
+ </div>
219
+ <div class="wpms_dashboard_widgets_right">
220
+ <img src="<?php echo esc_url(WPMETASEO_PLUGIN_URL . 'assets/images/white-loader.gif') ?>" class="white-loader">
221
+ </div>
222
+ </div>
223
+ </div>
224
+ </div>
225
+ </div>
226
+ </div>
227
+ </div>
228
+ </div>
languages/wp-meta-seo-en_US.mo CHANGED
Binary file
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: JoomUnited
3
  Tags: google, webmaster tools, keywords, meta, meta description, meta keywords, meta title, robots meta, search engine optimization, seo, wordpress seo, yahoo, image optimization, image resize, custom post seo, redirect, redirection, 301, broken link
4
  Requires at least: 4.7
5
- Tested up to: 5.9.1
6
- Stable tag: 4.4.5
7
  Requires PHP: 5.6
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
@@ -259,6 +259,9 @@ Yes WP Meta SEO is compatible with Gutenberg editor since 3.7 version.
259
 
260
  == Changelog ==
261
 
 
 
 
262
  = 4.4.5 =
263
  * Add : Update Google API
264
  * Fix : SEO checker on WP Meta SEO meta box
2
  Contributors: JoomUnited
3
  Tags: google, webmaster tools, keywords, meta, meta description, meta keywords, meta title, robots meta, search engine optimization, seo, wordpress seo, yahoo, image optimization, image resize, custom post seo, redirect, redirection, 301, broken link
4
  Requires at least: 4.7
5
+ Tested up to: 5.9.3
6
+ Stable tag: 4.4.6
7
  Requires PHP: 5.6
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
259
 
260
  == Changelog ==
261
 
262
+ = 4.4.6 =
263
+ * Add : WP Meta Seo widget: Quick SEO Preview
264
+
265
  = 4.4.5 =
266
  * Add : Update Google API
267
  * Fix : SEO checker on WP Meta SEO meta box
wp-meta-seo.php CHANGED
@@ -4,7 +4,7 @@
4
  * Plugin Name: WP Meta SEO
5
  * Plugin URI: http://www.joomunited.com/wordpress-products/wp-meta-seo
6
  * Description: WP Meta SEO is a plugin for WordPress to fill meta for content, images and main SEO info in a single view.
7
- * Version: 4.4.5
8
  * Text Domain: wp-meta-seo
9
  * Domain Path: /languages
10
  * Author: JoomUnited
@@ -133,7 +133,7 @@ if (!defined('WPMSEO_VERSION')) {
133
  /**
134
  * Plugin version
135
  */
136
- define('WPMSEO_VERSION', '4.4.5');
137
  }
138
 
139
  if (!defined('WPMS_CLIENTID')) {
4
  * Plugin Name: WP Meta SEO
5
  * Plugin URI: http://www.joomunited.com/wordpress-products/wp-meta-seo
6
  * Description: WP Meta SEO is a plugin for WordPress to fill meta for content, images and main SEO info in a single view.
7
+ * Version: 4.4.6
8
  * Text Domain: wp-meta-seo
9
  * Domain Path: /languages
10
  * Author: JoomUnited
133
  /**
134
  * Plugin version
135
  */
136
+ define('WPMSEO_VERSION', '4.4.6');
137
  }
138
 
139
  if (!defined('WPMS_CLIENTID')) {