Clearfy – WordPress optimization plugin and disable ultimate tweaker - Version 1.5.3

Version Description

  • Fixed: Bug with Elementor plugin. If you enable options "remove query strings for static resources", elementor plugin stopped its work
  • Fixed: [Update manager component]: When you disable WordPress core updates, you still see an update notification for version 5.x.x
  • Fixed: [Update manager component]: Clearfy compatibility error. Namely, when the component was activated, the cron tasks for checking for updates were not runned.
  • Fixed: [Update manager component]: PHP Notice "Undefined property: stdClass::$plugin"
  • Fixed: [Assets manager component]: Php error "Cannot use string offset as an array"
  • Fixed: [Assets manager component]: Broken interface and some javascript errors
  • Fixed: [Assets manager component]: PHP Notice "Trying to get property 'taxonomy' of non-object"
  • Fixed: When you enable the remove meta generator option, meta tag viewport can also be removed.
  • Fixed: After enabling the Google Fonts asynchronous option, you could see php notice "Notice: Trying to get property of non-object"
  • Fixed: Disabling revisions in Wordpress 5.0 does not work (Gutenberg).
  • Fixed: Compatible with Robin Image Optimizer 1.3.6
Download this release

Release Info

Developer alexkovalevv
Plugin Icon 128x128 Clearfy – WordPress optimization plugin and disable ultimate tweaker
Version 1.5.3
Comparing to
See all releases

Code changes from version 1.5.0 to 1.5.3

Files changed (83) hide show
  1. admin/assets/css/base-statistic.css +405 -405
  2. admin/assets/css/components.css +107 -107
  3. admin/assets/css/general.css +16 -0
  4. admin/assets/css/general.css.map +1 -0
  5. admin/assets/css/gutenberg-autosave-control.css +19 -0
  6. admin/assets/css/gutenberg-autosave-control.css.map +1 -0
  7. admin/assets/css/gutenberg-autosave-control.less +20 -0
  8. admin/assets/css/install-addons.css +31 -31
  9. admin/assets/gutenberg/build/index.build.js +100 -0
  10. admin/assets/gutenberg/build/index.php +2 -0
  11. admin/assets/gutenberg/index.php +2 -0
  12. admin/boot.php +10 -4
  13. admin/includes/classes/class.upgrader.php +43 -110
  14. admin/pages/advanced.php +0 -198
  15. admin/pages/clearfy-settings.php +75 -71
  16. admin/pages/components.php +386 -400
  17. admin/pages/defence.php +1 -52
  18. admin/pages/performance.php +470 -264
  19. assets/css/admin-bar.css +47 -47
  20. clearfy.php +14 -7
  21. components/assets-manager/assets/css/assets-manager.css +19 -3
  22. components/assets-manager/assets/css/assets-manager.css.map +1 -0
  23. components/assets-manager/assets/css/assets-manager.less +56 -3
  24. components/assets-manager/assets/css/reset.css +251 -251
  25. components/assets-manager/assets/js/assets-manager.js +3 -4
  26. components/assets-manager/gonzales.php +93 -85
  27. components/assets-manager/includes/class.configurate-assets.php +334 -327
  28. components/assets-manager/languages/gonzales-es_ES.mo +0 -0
  29. components/assets-manager/languages/gonzales-es_ES.po +466 -0
  30. components/assets-manager/languages/gonzales-ru_RU.po +574 -574
  31. components/comments-plus/comments-plus.php +68 -61
  32. components/comments-plus/languages/comments-plus-es_ES.mo +0 -0
  33. components/comments-plus/languages/comments-plus-es_ES.po +369 -0
  34. components/comments-plus/languages/comments-plus-ru_RU.po +427 -427
  35. components/cyrlitera/cyrlitera.php +83 -61
  36. components/cyrlitera/includes/class.helpers.php +598 -571
  37. components/cyrlitera/includes/classes/class.configurate-cyrlitera.php +11 -10
  38. components/cyrlitera/languages/cyrlitera-es_ES.mo +0 -0
  39. components/cyrlitera/languages/cyrlitera-es_ES.po +206 -0
  40. components/cyrlitera/languages/cyrlitera-ru_RU.mo +0 -0
  41. components/cyrlitera/languages/cyrlitera-ru_RU.po +618 -618
  42. components/disable-admin-notices/disable-admin-notices.php +81 -60
  43. components/disable-admin-notices/includes/classes/class.configurate-notices.php +8 -2
  44. components/disable-admin-notices/languages/disable-admin-notices-es_ES.mo +0 -0
  45. components/disable-admin-notices/languages/disable-admin-notices-es_ES.po +182 -0
  46. components/ga-cache/admin/activation.php +37 -49
  47. components/ga-cache/admin/boot.php +235 -189
  48. components/ga-cache/admin/options.php +127 -137
  49. components/ga-cache/cache/local-ga.js +74 -58
  50. components/ga-cache/includes/classes/class.configurate-ga.php +150 -119
  51. components/ga-cache/languages/simple-google-analytics-es_ES.mo +0 -0
  52. components/ga-cache/languages/simple-google-analytics-es_ES.po +234 -0
  53. components/ga-cache/languages/simple-google-analytics-ru_RU.po +1 -1
  54. components/ga-cache/simple_google_analytics.php +87 -66
  55. components/ga-cache/updates/030002.php +30 -0
  56. components/ga-cache/updates/index.php +2 -0
  57. components/html-minify/html-minify.php +116 -95
  58. components/html-minify/languages/html-minify-es_ES.mo +0 -0
  59. components/html-minify/languages/html-minify-es_ES.po +83 -0
  60. components/minify-and-combine/admin/pages/settings.php +1 -1
  61. components/minify-and-combine/includes/classes/class.mac-base.php +2 -2
  62. components/minify-and-combine/includes/classes/class.mac-helper.php +2 -87
  63. components/minify-and-combine/includes/classes/class.mac-main.php +9 -0
  64. components/minify-and-combine/includes/classes/class.mac-styles.php +3 -26
  65. components/minify-and-combine/includes/classes/ext/php/yui-php-cssmin-bundled/Minifier.php +933 -862
  66. components/minify-and-combine/languages/minify-and-combine-es_ES.mo +0 -0
  67. components/minify-and-combine/languages/minify-and-combine-es_ES.po +273 -0
  68. components/minify-and-combine/minify-and-combine.php +113 -93
  69. components/updates-manager/admin/assets/css/general.css +155 -155
  70. components/updates-manager/admin/assets/css/themes.css +20 -20
  71. components/updates-manager/includes/classes/class.configurate-updates.php +324 -281
  72. components/updates-manager/languages/webcraftic-updates-manager-es_ES.mo +0 -0
  73. components/updates-manager/languages/webcraftic-updates-manager-es_ES.po +478 -0
  74. components/updates-manager/webcraftic-updates-manager.php +76 -56
  75. includes/class.plugin.php +1 -0
  76. includes/classes/class.configurate-advanced.php +127 -227
  77. includes/classes/class.configurate-google-performance.php +262 -276
  78. includes/classes/class.configurate-performance.php +282 -138
  79. includes/classes/class.configurate-privacy.php +72 -33
  80. includes/classes/class.configurate-seo.php +357 -373
  81. languages/clearfy-es_ES.mo +0 -0
  82. languages/clearfy-es_ES.po +2367 -0
  83. languages/clearfy-nl_BE.po +0 -72
admin/assets/css/base-statistic.css CHANGED
@@ -1,405 +1,405 @@
1
- /**
2
- * Styles for the Widget to be displayed in the Clearfy plugin
3
-
4
- * @author Alex Kovalev <alex.kovalevv@gmail.com>
5
- * @copyright Webcraftic 13.06.2018
6
- */
7
- #WBCR {
8
- /* Number display */
9
- /* Number and bars */
10
- /* Doughnut */
11
- /* Widget */
12
- }
13
- #WBCR .wio-clear {
14
- clear: both;
15
- }
16
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers {
17
- margin-top: 30px;
18
- background: none;
19
- padding: 0;
20
- }
21
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers h4 {
22
- font-size: 15px;
23
- font-weight: 700;
24
- }
25
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers button {
26
- padding: 5px 10px;
27
- border: 0;
28
- font-size: 11px;
29
- text-transform: uppercase !important;
30
- font-weight: bold;
31
- border-radius: 4px;
32
- outline: none;
33
- background: #f3f3f3;
34
- color: #656565;
35
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
36
- }
37
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers button:active {
38
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.5);
39
- }
40
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers button.wbcr-rio-loading {
41
- width: 56px;
42
- font-size: 0;
43
- background: #f3f3f3 url("../img/quick-start-loader.gif") center no-repeat;
44
- }
45
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers button.wbcr-rio-selected {
46
- background: #f3efe2;
47
- color: #d8d8d8;
48
- }
49
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers button.wbcr-rio-selected:active {
50
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
51
- }
52
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table {
53
- width: 100%;
54
- box-sizing: border-box;
55
- border-spacing: 3px;
56
- background: #fff;
57
- }
58
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table th,
59
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table td {
60
- padding: 16px 10px;
61
- text-align: center;
62
- }
63
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table th {
64
- background: #efefef;
65
- color: #777777;
66
- box-shadow: 0 1px 0 #d8d8d8;
67
- }
68
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table .wbcr-rio-server-check-proccess {
69
- display: inline-block;
70
- height: 10px;
71
- width: 30px;
72
- background: url("../img/quick-start-loader.gif") center no-repeat;
73
- }
74
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table .wbcr-rio-servers-list-item-selected {
75
- background: #fffbed;
76
- color: #cec5a8;
77
- font-weight: 600;
78
- }
79
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table .wbcr-rio-server-success {
80
- color: #8CC152;
81
- }
82
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table .wbcr-rio-server-error {
83
- color: #fb5d49;
84
- }
85
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table .wbcr-rio-server-warning {
86
- color: #ffb635;
87
- }
88
- #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers .wbcr-rio-warning-message {
89
- margin-top: 30px;
90
- padding: 20px;
91
- border: 1px dashed #bfbfbf;
92
- background: #ffffff;
93
- margin-bottom: 40px;
94
- font-size: 15px;
95
- color: #828282;
96
- }
97
- #WBCR .wio-columns {
98
- overflow: hidden;
99
- padding: 15px 0;
100
- counter-reset: cols;
101
- }
102
- #WBCR .wio-columns [class^="col-"] {
103
- float: left;
104
- -webkit-box-sizing: border-box;
105
- -moz-box-sizing: border-box;
106
- box-sizing: border-box;
107
- }
108
- #WBCR .wio-columns .col-1-3 {
109
- width: 33.333%;
110
- padding-left: 28px;
111
- }
112
- #WBCR .wio-columns .col-2-3 {
113
- width: 66.666%;
114
- padding-left: 28px;
115
- }
116
- #WBCR .wio-columns .col-1-2 {
117
- width: 50%;
118
- padding: 0 20px;
119
- }
120
- #WBCR .wio-columns .col-statistics.col-statistics {
121
- width: 60%;
122
- }
123
- #WBCR .wio-columns .col-chart.col-chart {
124
- width: 40%;
125
- position: relative;
126
- padding: 20px;
127
- font-size: 12px;
128
- text-transform: uppercase;
129
- background: #f1f1f1b3;
130
- color: #abacaf;
131
- font-weight: bold;
132
- border-radius: 5px;
133
- margin-top: 10px;
134
- text-align: left;
135
- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
136
- }
137
- #WBCR .wio-col {
138
- float: left;
139
- width: 50%;
140
- box-sizing: border-box;
141
- -webkit-flex-basis: 50%;
142
- -ms-flex-preferred-size: 50%;
143
- flex-basis: 50%;
144
- }
145
- #WBCR .wio-col {
146
- padding-right: 20px;
147
- }
148
- #WBCR .wio-col + .wio-col {
149
- padding-right: 0;
150
- padding-left: 50px;
151
- }
152
- #WBCR .wio-col:target {
153
- animation: wiohello 1s 3 linear backwards;
154
- }
155
- #WBCR .wio-number-you-optimized {
156
- margin-bottom: 1.35em;
157
- overflow: hidden;
158
- }
159
- #WBCR .wio-number-you-optimized #wio-total-optimized-attachments-pct {
160
- color: #828282;
161
- }
162
- #WBCR .wio-number-you-optimized .wio-number {
163
- display: table-cell;
164
- padding-right: 15px;
165
- font-size: 48px;
166
- font-weight: bold;
167
- line-height: 1;
168
- vertical-align: middle;
169
- white-space: nowrap;
170
- color: #828282;
171
- }
172
- #WBCR .wio-number-you-optimized .wio-text {
173
- display: table-cell;
174
- vertical-align: middle;
175
- overflow: hidden;
176
- font-size: 12px;
177
- color: #828282;
178
- }
179
- #WBCR .wio-number-you-optimized > p {
180
- display: table;
181
- }
182
- #WBCR .wio-bars {
183
- padding-right: 15px;
184
- }
185
- #WBCR .wio-bars p {
186
- font-size: 12px;
187
- margin-bottom: 5px;
188
- }
189
- #WBCR .wio-bars + .wio-number-you-optimized {
190
- border-bottom: 0;
191
- padding-top: 0.85em;
192
- }
193
- #WBCR .wio-bars + .wio-number-you-optimized p {
194
- color: #72a53b;
195
- }
196
- #WBCR .wio-bar-negative .wio-progress {
197
- background: #D2D3D6;
198
- }
199
- #WBCR .wio-bar-negative .wio-barnb {
200
- color: #9d9fa5;
201
- }
202
- #WBCR .wio-progress {
203
- height: 8px;
204
- transition: width .3s;
205
- /*.wio-bar-negative {
206
- width: 92% !important;
207
- }*/
208
- }
209
- #WBCR .wio-bar-positive .wio-progress {
210
- background: #8CC152;
211
- }
212
- #WBCR .wio-bar-positive .wio-barnb {
213
- color: #72a53b;
214
- }
215
- #WBCR .wio-bar-primary .wio-progress {
216
- background: #8CC152;
217
- }
218
- #WBCR .wio-bar-primary .wio-barnb {
219
- color: #72a53b;
220
- }
221
- #WBCR .wio-right-outside-number .wio-barnb {
222
- display: block;
223
- margin-right: -5.25em;
224
- text-align: right;
225
- font-weight: bold;
226
- line-height: .8;
227
- }
228
- #WBCR .wio-chart {
229
- position: relative;
230
- top: 1px;
231
- display: inline-block;
232
- vertical-align: middle;
233
- }
234
- #WBCR .wio-chart-container {
235
- position: relative;
236
- display: inline-block;
237
- margin-right: 5px;
238
- border: 10px solid #d2d3d6;
239
- border-radius: 100%;
240
- }
241
- #WBCR .wio-chart-container canvas {
242
- display: block;
243
- }
244
- #WBCR .wio-overview-chart-container {
245
- float: left;
246
- margin-right: 20px;
247
- }
248
- #WBCR .wio-chart-percent {
249
- position: absolute;
250
- left: 0;
251
- right: 0;
252
- top: 50%;
253
- margin-top: -0.5em;
254
- line-height: 0.8;
255
- text-align: center;
256
- font-size: 54px;
257
- font-weight: bold;
258
- color: #afafaf;
259
- }
260
- #WBCR .wio-chart-percent span {
261
- font-size: 20px;
262
- vertical-align: super;
263
- }
264
- #WBCR #wio-overview-chart-legend {
265
- overflow: hidden;
266
- }
267
- #WBCR .wio-doughnut-legend li {
268
- display: inline-block;
269
- position: relative;
270
- margin-bottom: 15px;
271
- border-radius: 5px;
272
- padding: 3px 8px 2px 31px;
273
- font-size: 12px;
274
- cursor: default;
275
- -webkit-transition: background-color 200ms ease-in-out;
276
- -moz-transition: background-color 200ms ease-in-out;
277
- -o-transition: background-color 200ms ease-in-out;
278
- transition: background-color 200ms ease-in-out;
279
- }
280
- #WBCR .wio-doughnut-legend li span {
281
- display: block;
282
- position: absolute;
283
- left: 0;
284
- top: 0;
285
- width: 25px;
286
- height: 25px;
287
- border-radius: 50%;
288
- }
289
- #WBCR .wio-optimize-button {
290
- width: 180px;
291
- padding: 12px 30px;
292
- background: #c9deb2;
293
- color: #586549;
294
- border: 0;
295
- box-shadow: none;
296
- font-size: 14px;
297
- text-transform: uppercase !important;
298
- font-weight: bold;
299
- border-radius: 4px;
300
- outline: none;
301
- text-decoration: none;
302
- }
303
- #WBCR .wio-optimize-button:active {
304
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.5);
305
- }
306
- #WBCR .wio-global-optim-phrase {
307
- width: 180px;
308
- padding-top: 20px;
309
- font-size: 14px;
310
- text-align: center;
311
- }
312
- #WBCR .wio-total-percent {
313
- color: #587f2e;
314
- }
315
- #WBCR .wio-text-left {
316
- text-align: left;
317
- }
318
- #WBCR span.wio-num {
319
- display: inline !important;
320
- position: inherit !important;
321
- }
322
- #WBCR .wio-image-optimize-board {
323
- padding: 20px;
324
- }
325
- #WBCR .wio-page-statistic {
326
- padding-left: 40px;
327
- }
328
- #WBCR .wio-page-statistic .wio-chart-percent {
329
- margin-top: -1.1em;
330
- }
331
- #WBCR .wio-widget {
332
- padding: 0 !important;
333
- }
334
- #WBCR .wio-widget .wio-chart-percent {
335
- font-size: 44px;
336
- line-height: 1;
337
- }
338
- #WBCR .wio-widget .wio-bars {
339
- width: 80%;
340
- margin-left: 155px;
341
- box-sizing: border-box;
342
- }
343
- #WBCR .wio-widget .col-chart.col-chart {
344
- width: 100%;
345
- }
346
- #WBCR .wio-widget .col-controls {
347
- width: 45%;
348
- padding-left: 5px;
349
- padding-top: 110px;
350
- }
351
- #WBCR .wio-widget .wio-doughnut-legend {
352
- margin-left: 20px;
353
- text-align: left;
354
- }
355
- #WBCR .wio-widget .wio-widget-bottom {
356
- display: table;
357
- padding-top: 20px !important;
358
- width: 100%;
359
- text-align: right;
360
- }
361
- #WBCR .wio-widget .wio-widget-bottom li {
362
- display: table-cell;
363
- }
364
- #WBCR .wio-widget .wio-widget-bottom li:first-child {
365
- text-align: left;
366
- }
367
- @media (max-width: 830px) {
368
- #WBCR .wio [class^="col-"] {
369
- float: none;
370
- margin-bottom: 1.5em;
371
- }
372
- #WBCR .wio .col-1-3,
373
- #WBCR .wio .col-1-2 {
374
- width: auto;
375
- padding: 0 28px;
376
- clear: both;
377
- padding-top: 1em;
378
- }
379
- }
380
- @keyframes wiohello {
381
- 0%,
382
- 100% {
383
- background: #FFF;
384
- }
385
- 50% {
386
- background: #F4F7F9;
387
- }
388
- }
389
- @media (max-width: 1520px) and (min-width: 1381px), (max-width: 1086px) {
390
- #WBCR .wio-columns .col-statistics.col-statistics,
391
- #WBCR .wio-columns .col-chart.col-chart {
392
- width: 50%;
393
- }
394
- }
395
- @media (max-width: 808px) {
396
- #WBCR .wio-columns .col-statistics.col-statistics,
397
- #WBCR .wio-columns .col-chart.col-chart {
398
- width: auto;
399
- float: none;
400
- padding: 0;
401
- }
402
- #WBCR .wio-columns .col-chart.col-chart {
403
- margin-top: 3em;
404
- }
405
- }
1
+ /**
2
+ * Styles for the Widget to be displayed in the Clearfy plugin
3
+
4
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>
5
+ * @copyright Webcraftic 13.06.2018
6
+ */
7
+ #WBCR {
8
+ /* Number display */
9
+ /* Number and bars */
10
+ /* Doughnut */
11
+ /* Widget */
12
+ }
13
+ #WBCR .wio-clear {
14
+ clear: both;
15
+ }
16
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers {
17
+ margin-top: 30px;
18
+ background: none;
19
+ padding: 0;
20
+ }
21
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers h4 {
22
+ font-size: 15px;
23
+ font-weight: 700;
24
+ }
25
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers button {
26
+ padding: 5px 10px;
27
+ border: 0;
28
+ font-size: 11px;
29
+ text-transform: uppercase !important;
30
+ font-weight: bold;
31
+ border-radius: 4px;
32
+ outline: none;
33
+ background: #f3f3f3;
34
+ color: #656565;
35
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
36
+ }
37
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers button:active {
38
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.5);
39
+ }
40
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers button.wbcr-rio-loading {
41
+ width: 56px;
42
+ font-size: 0;
43
+ background: #f3f3f3 url("../img/quick-start-loader.gif") center no-repeat;
44
+ }
45
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers button.wbcr-rio-selected {
46
+ background: #f3efe2;
47
+ color: #d8d8d8;
48
+ }
49
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers button.wbcr-rio-selected:active {
50
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
51
+ }
52
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table {
53
+ width: 100%;
54
+ box-sizing: border-box;
55
+ border-spacing: 3px;
56
+ background: #fff;
57
+ }
58
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table th,
59
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table td {
60
+ padding: 16px 10px;
61
+ text-align: center;
62
+ }
63
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table th {
64
+ background: #efefef;
65
+ color: #777777;
66
+ box-shadow: 0 1px 0 #d8d8d8;
67
+ }
68
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table .wbcr-rio-server-check-proccess {
69
+ display: inline-block;
70
+ height: 10px;
71
+ width: 30px;
72
+ background: url("../img/quick-start-loader.gif") center no-repeat;
73
+ }
74
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table .wbcr-rio-servers-list-item-selected {
75
+ background: #fffbed;
76
+ color: #cec5a8;
77
+ font-weight: 600;
78
+ }
79
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table .wbcr-rio-server-success {
80
+ color: #8CC152;
81
+ }
82
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table .wbcr-rio-server-error {
83
+ color: #fb5d49;
84
+ }
85
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers table .wbcr-rio-server-warning {
86
+ color: #ffb635;
87
+ }
88
+ #WBCR .wbcr-factory-sidebar-widget.wbcr-rio-servers .wbcr-rio-warning-message {
89
+ margin-top: 30px;
90
+ padding: 20px;
91
+ border: 1px dashed #bfbfbf;
92
+ background: #ffffff;
93
+ margin-bottom: 40px;
94
+ font-size: 15px;
95
+ color: #828282;
96
+ }
97
+ #WBCR .wio-columns {
98
+ overflow: hidden;
99
+ padding: 15px 0;
100
+ counter-reset: cols;
101
+ }
102
+ #WBCR .wio-columns [class^="col-"] {
103
+ float: left;
104
+ -webkit-box-sizing: border-box;
105
+ -moz-box-sizing: border-box;
106
+ box-sizing: border-box;
107
+ }
108
+ #WBCR .wio-columns .col-1-3 {
109
+ width: 33.333%;
110
+ padding-left: 28px;
111
+ }
112
+ #WBCR .wio-columns .col-2-3 {
113
+ width: 66.666%;
114
+ padding-left: 28px;
115
+ }
116
+ #WBCR .wio-columns .col-1-2 {
117
+ width: 50%;
118
+ padding: 0 20px;
119
+ }
120
+ #WBCR .wio-columns .col-statistics.col-statistics {
121
+ width: 60%;
122
+ }
123
+ #WBCR .wio-columns .col-chart.col-chart {
124
+ width: 40%;
125
+ position: relative;
126
+ padding: 20px;
127
+ font-size: 12px;
128
+ text-transform: uppercase;
129
+ background: #f1f1f1b3;
130
+ color: #abacaf;
131
+ font-weight: bold;
132
+ border-radius: 5px;
133
+ margin-top: 10px;
134
+ text-align: left;
135
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
136
+ }
137
+ #WBCR .wio-col {
138
+ float: left;
139
+ width: 50%;
140
+ box-sizing: border-box;
141
+ -webkit-flex-basis: 50%;
142
+ -ms-flex-preferred-size: 50%;
143
+ flex-basis: 50%;
144
+ }
145
+ #WBCR .wio-col {
146
+ padding-right: 20px;
147
+ }
148
+ #WBCR .wio-col + .wio-col {
149
+ padding-right: 0;
150
+ padding-left: 50px;
151
+ }
152
+ #WBCR .wio-col:target {
153
+ animation: wiohello 1s 3 linear backwards;
154
+ }
155
+ #WBCR .wio-number-you-optimized {
156
+ margin-bottom: 1.35em;
157
+ overflow: hidden;
158
+ }
159
+ #WBCR .wio-number-you-optimized #wio-total-optimized-attachments-pct {
160
+ color: #828282;
161
+ }
162
+ #WBCR .wio-number-you-optimized .wio-number {
163
+ display: table-cell;
164
+ padding-right: 15px;
165
+ font-size: 48px;
166
+ font-weight: bold;
167
+ line-height: 1;
168
+ vertical-align: middle;
169
+ white-space: nowrap;
170
+ color: #828282;
171
+ }
172
+ #WBCR .wio-number-you-optimized .wio-text {
173
+ display: table-cell;
174
+ vertical-align: middle;
175
+ overflow: hidden;
176
+ font-size: 12px;
177
+ color: #828282;
178
+ }
179
+ #WBCR .wio-number-you-optimized > p {
180
+ display: table;
181
+ }
182
+ #WBCR .wio-bars {
183
+ padding-right: 15px;
184
+ }
185
+ #WBCR .wio-bars p {
186
+ font-size: 12px;
187
+ margin-bottom: 5px;
188
+ }
189
+ #WBCR .wio-bars + .wio-number-you-optimized {
190
+ border-bottom: 0;
191
+ padding-top: 0.85em;
192
+ }
193
+ #WBCR .wio-bars + .wio-number-you-optimized p {
194
+ color: #72a53b;
195
+ }
196
+ #WBCR .wio-bar-negative .wio-progress {
197
+ background: #D2D3D6;
198
+ }
199
+ #WBCR .wio-bar-negative .wio-barnb {
200
+ color: #9d9fa5;
201
+ }
202
+ #WBCR .wio-progress {
203
+ height: 8px;
204
+ transition: width .3s;
205
+ /*.wio-bar-negative {
206
+ width: 92% !important;
207
+ }*/
208
+ }
209
+ #WBCR .wio-bar-positive .wio-progress {
210
+ background: #8CC152;
211
+ }
212
+ #WBCR .wio-bar-positive .wio-barnb {
213
+ color: #72a53b;
214
+ }
215
+ #WBCR .wio-bar-primary .wio-progress {
216
+ background: #8CC152;
217
+ }
218
+ #WBCR .wio-bar-primary .wio-barnb {
219
+ color: #72a53b;
220
+ }
221
+ #WBCR .wio-right-outside-number .wio-barnb {
222
+ display: block;
223
+ margin-right: -5.25em;
224
+ text-align: right;
225
+ font-weight: bold;
226
+ line-height: .8;
227
+ }
228
+ #WBCR .wio-chart {
229
+ position: relative;
230
+ top: 1px;
231
+ display: inline-block;
232
+ vertical-align: middle;
233
+ }
234
+ #WBCR .wio-chart-container {
235
+ position: relative;
236
+ display: inline-block;
237
+ margin-right: 5px;
238
+ border: 10px solid #d2d3d6;
239
+ border-radius: 100%;
240
+ }
241
+ #WBCR .wio-chart-container canvas {
242
+ display: block;
243
+ }
244
+ #WBCR .wio-overview-chart-container {
245
+ float: left;
246
+ margin-right: 20px;
247
+ }
248
+ #WBCR .wio-chart-percent {
249
+ position: absolute;
250
+ left: 0;
251
+ right: 0;
252
+ top: 50%;
253
+ margin-top: -0.5em;
254
+ line-height: 0.8;
255
+ text-align: center;
256
+ font-size: 54px;
257
+ font-weight: bold;
258
+ color: #afafaf;
259
+ }
260
+ #WBCR .wio-chart-percent span {
261
+ font-size: 20px;
262
+ vertical-align: super;
263
+ }
264
+ #WBCR #wio-overview-chart-legend {
265
+ overflow: hidden;
266
+ }
267
+ #WBCR .wio-doughnut-legend li {
268
+ display: inline-block;
269
+ position: relative;
270
+ margin-bottom: 15px;
271
+ border-radius: 5px;
272
+ padding: 3px 8px 2px 31px;
273
+ font-size: 12px;
274
+ cursor: default;
275
+ -webkit-transition: background-color 200ms ease-in-out;
276
+ -moz-transition: background-color 200ms ease-in-out;
277
+ -o-transition: background-color 200ms ease-in-out;
278
+ transition: background-color 200ms ease-in-out;
279
+ }
280
+ #WBCR .wio-doughnut-legend li span {
281
+ display: block;
282
+ position: absolute;
283
+ left: 0;
284
+ top: 0;
285
+ width: 25px;
286
+ height: 25px;
287
+ border-radius: 50%;
288
+ }
289
+ #WBCR .wio-optimize-button {
290
+ width: 180px;
291
+ padding: 12px 30px;
292
+ background: #c9deb2;
293
+ color: #586549;
294
+ border: 0;
295
+ box-shadow: none;
296
+ font-size: 14px;
297
+ text-transform: uppercase !important;
298
+ font-weight: bold;
299
+ border-radius: 4px;
300
+ outline: none;
301
+ text-decoration: none;
302
+ }
303
+ #WBCR .wio-optimize-button:active {
304
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.5);
305
+ }
306
+ #WBCR .wio-global-optim-phrase {
307
+ width: 180px;
308
+ padding-top: 20px;
309
+ font-size: 14px;
310
+ text-align: center;
311
+ }
312
+ #WBCR .wio-total-percent {
313
+ color: #587f2e;
314
+ }
315
+ #WBCR .wio-text-left {
316
+ text-align: left;
317
+ }
318
+ #WBCR span.wio-num {
319
+ display: inline !important;
320
+ position: inherit !important;
321
+ }
322
+ #WBCR .wio-image-optimize-board {
323
+ padding: 20px;
324
+ }
325
+ #WBCR .wio-page-statistic {
326
+ padding-left: 40px;
327
+ }
328
+ #WBCR .wio-page-statistic .wio-chart-percent {
329
+ margin-top: -1.1em;
330
+ }
331
+ #WBCR .wio-widget {
332
+ padding: 0 !important;
333
+ }
334
+ #WBCR .wio-widget .wio-chart-percent {
335
+ font-size: 44px;
336
+ line-height: 1;
337
+ }
338
+ #WBCR .wio-widget .wio-bars {
339
+ width: 80%;
340
+ margin-left: 155px;
341
+ box-sizing: border-box;
342
+ }
343
+ #WBCR .wio-widget .col-chart.col-chart {
344
+ width: 100%;
345
+ }
346
+ #WBCR .wio-widget .col-controls {
347
+ width: 45%;
348
+ padding-left: 5px;
349
+ padding-top: 110px;
350
+ }
351
+ #WBCR .wio-widget .wio-doughnut-legend {
352
+ margin-left: 20px;
353
+ text-align: left;
354
+ }
355
+ #WBCR .wio-widget .wio-widget-bottom {
356
+ display: table;
357
+ padding-top: 20px !important;
358
+ width: 100%;
359
+ text-align: right;
360
+ }
361
+ #WBCR .wio-widget .wio-widget-bottom li {
362
+ display: table-cell;
363
+ }
364
+ #WBCR .wio-widget .wio-widget-bottom li:first-child {
365
+ text-align: left;
366
+ }
367
+ @media (max-width: 830px) {
368
+ #WBCR .wio [class^="col-"] {
369
+ float: none;
370
+ margin-bottom: 1.5em;
371
+ }
372
+ #WBCR .wio .col-1-3,
373
+ #WBCR .wio .col-1-2 {
374
+ width: auto;
375
+ padding: 0 28px;
376
+ clear: both;
377
+ padding-top: 1em;
378
+ }
379
+ }
380
+ @keyframes wiohello {
381
+ 0%,
382
+ 100% {
383
+ background: #FFF;
384
+ }
385
+ 50% {
386
+ background: #F4F7F9;
387
+ }
388
+ }
389
+ @media (max-width: 1520px) and (min-width: 1381px), (max-width: 1086px) {
390
+ #WBCR .wio-columns .col-statistics.col-statistics,
391
+ #WBCR .wio-columns .col-chart.col-chart {
392
+ width: 50%;
393
+ }
394
+ }
395
+ @media (max-width: 808px) {
396
+ #WBCR .wio-columns .col-statistics.col-statistics,
397
+ #WBCR .wio-columns .col-chart.col-chart {
398
+ width: auto;
399
+ float: none;
400
+ padding: 0;
401
+ }
402
+ #WBCR .wio-columns .col-chart.col-chart {
403
+ margin-top: 3em;
404
+ }
405
+ }
admin/assets/css/components.css CHANGED
@@ -1,107 +1,107 @@
1
- /**
2
- * Page components
3
- * @author Alex Kovalev <alex.kovalevv@gmail.com>
4
- * @copyright Alex Kovalev 30.09.2017
5
- */
6
- #WBCR .wbcr-clearfy-components {
7
- padding: 0 20px 20px;
8
- text-align: center;
9
- }
10
- #WBCR .wbcr-clearfy-components .plugin-card {
11
- position: relative;
12
- display: inline-block;
13
- width: 32.7%;
14
- height: 250px;
15
- margin-left: 0;
16
- margin-right: 0;
17
- text-align: left;
18
- float: none;
19
- vertical-align: top;
20
- }
21
- #WBCR .wbcr-clearfy-components .plugin-card:first-child {
22
- margin-left: 0;
23
- }
24
- #WBCR .wbcr-clearfy-components .plugin-card .plugin-card-bottom {
25
- position: absolute;
26
- bottom: 0;
27
- right: 0;
28
- left: 0;
29
- }
30
- #WBCR .wbcr-clearfy-components .plugin-card .plugin-card-top {
31
- min-height: 163px;
32
- }
33
- #WBCR .wbcr-clearfy-components .plugin-card .desc,
34
- #WBCR .wbcr-clearfy-components .plugin-card .name {
35
- margin-right: 0 !important;
36
- }
37
- #WBCR .wbcr-clearfy-components .plugin-card .name h3 {
38
- font-size: 17px;
39
- margin-top: 0 !important;
40
- }
41
- #WBCR .wbcr-clearfy-components .plugin-card .install-now {
42
- float: right;
43
- }
44
- #WBCR .wbcr-clearfy-components .plugin-card .delete-now {
45
- float: right;
46
- margin-left: 5px;
47
- }
48
- #WBCR .wbcr-clearfy-components .plugin-card .delete-now .dashicons,
49
- #WBCR .wbcr-clearfy-components .plugin-card .delete-now .dashicons-before:before {
50
- font-size: 16px !important;
51
- line-height: 1.5 !important;
52
- color: #62696f;
53
- }
54
- #WBCR .wbcr-clearfy-components .plugin-card a.open-plugin-details-modal {
55
- color: #5c5d5f;
56
- text-decoration: none;
57
- font-weight: 600;
58
- font-size: 15px;
59
- }
60
- #WBCR .wbcr-clearfy-components .plugin-card .premium-ribbon {
61
- position: absolute;
62
- bottom: 60px;
63
- right: 0;
64
- height: 30px;
65
- width: 120px;
66
- border-radius: 3px 0 0 3px;
67
- background-color: #f7dea9;
68
- color: #67532f;
69
- text-align: center;
70
- font-size: 12px;
71
- font-weight: 600;
72
- line-height: 2.4;
73
- text-transform: uppercase;
74
- z-index: 1;
75
- }
76
- #WBCR .wbcr-clearfy-components .plugin-card.premium {
77
- border-color: #e8d7b2;
78
- background-color: #fff9eb;
79
- }
80
- #WBCR .wbcr-clearfy-components .plugin-card.plugin-status-deactive {
81
- background-color: #f1f1f1;
82
- }
83
- #WBCR .wbcr-clearfy-components .plugin-card.plugin-status-deactive a.open-plugin-details-modal {
84
- color: #ababab;
85
- text-decoration: none;
86
- font-weight: 600;
87
- font-size: 15px;
88
- }
89
- #WBCR .wbcr-clearfy-components .plugin-card.plugin-status-deactive .plugin-icon {
90
- opacity: 0.3;
91
- }
92
- #WBCR .wbcr-clearfy-components .plugin-card.plugin-status-deactive .desc {
93
- color: #afafaf;
94
- }
95
- #WBCR .wbcr-clearfy-components .plugin-card.plugin-status-deactive.premium {
96
- background-color: #f9f2f1;
97
- }
98
- @media screen and (max-width: 1750px) {
99
- #WBCR .wbcr-clearfy-components .plugin-card {
100
- width: 49%;
101
- }
102
- }
103
- @media screen and (max-width: 1350px) {
104
- #WBCR .wbcr-clearfy-components .plugin-card {
105
- width: 100%;
106
- }
107
- }
1
+ /**
2
+ * Page components
3
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>
4
+ * @copyright Alex Kovalev 30.09.2017
5
+ */
6
+ #WBCR .wbcr-clearfy-components {
7
+ padding: 0 20px 20px;
8
+ text-align: center;
9
+ }
10
+ #WBCR .wbcr-clearfy-components .plugin-card {
11
+ position: relative;
12
+ display: inline-block;
13
+ width: 32.7%;
14
+ height: 250px;
15
+ margin-left: 0;
16
+ margin-right: 0;
17
+ text-align: left;
18
+ float: none;
19
+ vertical-align: top;
20
+ }
21
+ #WBCR .wbcr-clearfy-components .plugin-card:first-child {
22
+ margin-left: 0;
23
+ }
24
+ #WBCR .wbcr-clearfy-components .plugin-card .plugin-card-bottom {
25
+ position: absolute;
26
+ bottom: 0;
27
+ right: 0;
28
+ left: 0;
29
+ }
30
+ #WBCR .wbcr-clearfy-components .plugin-card .plugin-card-top {
31
+ min-height: 163px;
32
+ }
33
+ #WBCR .wbcr-clearfy-components .plugin-card .desc,
34
+ #WBCR .wbcr-clearfy-components .plugin-card .name {
35
+ margin-right: 0 !important;
36
+ }
37
+ #WBCR .wbcr-clearfy-components .plugin-card .name h3 {
38
+ font-size: 17px;
39
+ margin-top: 0 !important;
40
+ }
41
+ #WBCR .wbcr-clearfy-components .plugin-card .install-now {
42
+ float: right;
43
+ }
44
+ #WBCR .wbcr-clearfy-components .plugin-card .delete-now {
45
+ float: right;
46
+ margin-left: 5px;
47
+ }
48
+ #WBCR .wbcr-clearfy-components .plugin-card .delete-now .dashicons,
49
+ #WBCR .wbcr-clearfy-components .plugin-card .delete-now .dashicons-before:before {
50
+ font-size: 16px !important;
51
+ line-height: 1.5 !important;
52
+ color: #62696f;
53
+ }
54
+ #WBCR .wbcr-clearfy-components .plugin-card a.open-plugin-details-modal {
55
+ color: #5c5d5f;
56
+ text-decoration: none;
57
+ font-weight: 600;
58
+ font-size: 15px;
59
+ }
60
+ #WBCR .wbcr-clearfy-components .plugin-card .premium-ribbon {
61
+ position: absolute;
62
+ bottom: 60px;
63
+ right: 0;
64
+ height: 30px;
65
+ width: 120px;
66
+ border-radius: 3px 0 0 3px;
67
+ background-color: #f7dea9;
68
+ color: #67532f;
69
+ text-align: center;
70
+ font-size: 12px;
71
+ font-weight: 600;
72
+ line-height: 2.4;
73
+ text-transform: uppercase;
74
+ z-index: 1;
75
+ }
76
+ #WBCR .wbcr-clearfy-components .plugin-card.premium {
77
+ border-color: #e8d7b2;
78
+ background-color: #fff9eb;
79
+ }
80
+ #WBCR .wbcr-clearfy-components .plugin-card.plugin-status-deactive {
81
+ background-color: #f1f1f1;
82
+ }
83
+ #WBCR .wbcr-clearfy-components .plugin-card.plugin-status-deactive a.open-plugin-details-modal {
84
+ color: #ababab;
85
+ text-decoration: none;
86
+ font-weight: 600;
87
+ font-size: 15px;
88
+ }
89
+ #WBCR .wbcr-clearfy-components .plugin-card.plugin-status-deactive .plugin-icon {
90
+ opacity: 0.3;
91
+ }
92
+ #WBCR .wbcr-clearfy-components .plugin-card.plugin-status-deactive .desc {
93
+ color: #afafaf;
94
+ }
95
+ #WBCR .wbcr-clearfy-components .plugin-card.plugin-status-deactive.premium {
96
+ background-color: #f9f2f1;
97
+ }
98
+ @media screen and (max-width: 1750px) {
99
+ #WBCR .wbcr-clearfy-components .plugin-card {
100
+ width: 49%;
101
+ }
102
+ }
103
+ @media screen and (max-width: 1350px) {
104
+ #WBCR .wbcr-clearfy-components .plugin-card {
105
+ width: 100%;
106
+ }
107
+ }
admin/assets/css/general.css CHANGED
@@ -33,6 +33,21 @@
33
  //float: right;
34
  }*/
35
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  #WBCR .wbcr-clr-logo-label {
37
  position: relative;
38
  padding: 0 10px 3px;
@@ -476,3 +491,4 @@
476
  font-size: 0 !important;
477
  }
478
  }
 
33
  //float: right;
34
  }*/
35
  }
36
+ #WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-page-header {
37
+ height: 80px !important;
38
+ }
39
+ #WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-page-header .wbcr-factory-header-logo span {
40
+ display: inline-block !important;
41
+ }
42
+ #WBCR .row {
43
+ display: block !important;
44
+ width: auto !important;
45
+ table-layout: auto !important;
46
+ }
47
+ #WBCR .row > div {
48
+ display: block !important;
49
+ padding: 0 !important;
50
+ }
51
  #WBCR .wbcr-clr-logo-label {
52
  position: relative;
53
  padding: 0 10px 3px;
491
  font-size: 0 !important;
492
  }
493
  }
494
+ /*# sourceMappingURL=general.css.map */
admin/assets/css/general.css.map ADDED
@@ -0,0 +1 @@
 
1
+ {"version":3,"sources":["general.less"],"names":[],"mappings":";;;;;AAMA;EACE,aAAA;EACA,kBAAA;EACA,MAAA;EACA,WAAA;EACA,QAAA;EACA,SAAA;EACA,oCAAA;EACA,UAAA;;AAGF;;;;;;;;;;;;;;;;;;;;AAAA,KAIE,iDACE;EACE,uBAAA;;AANN,KAIE,iDACE,0BAGE,0BACE;EACE,qBAAA;;AAVV,KAmBE;EACE,yBAAA;EACA,sBAAA;EACA,6BAAA;;AAEA,KALF,KAKI;EACA,yBAAA;EACA,qBAAA;;AA1BN,KA8BE;EACE,kBAAA;EACA,mBAAA;EACA,kBAAA;EACA,2CAAA;EACA,8CAAA;;AAEA,KAPF,qBAOG;EACC,SAAS,EAAT;EACA,cAAA;EACA,kBAAA;EACA,WAAA;EACA,YAAA;EACA,UAAA;EACA,YAAA;EACA,6EAAA;;AAGF,KAlBF,qBAkBG;EACC,cAAA;EACA,yBAAA;;AAGF,KAvBF,qBAuBG;EACC,cAAA;EACA,yBAAA;;AAvDN,KA2DE;AA3DF,KA2DyB;EACrB,qBAAA;EACA,mBAAA;;AA7DJ,KAgEE;EACE,WAAA;;AAjEJ,KA6EE,+BACE;EACE,kBAAA;EACA,qBAAA;EACA,iBAAA;EACA,mBAAA;EACA,UAAA;EACA,kBAAA;EACA,aAAA;EACA,gBAAA;EACA,2BAAA;;AAEA,KAZJ,+BACE,2BAWI;EACA,kBAAA;EACA,iBAAA;EACA,gBAAA;;AA5FR,KAqGE,kCACE;EACE,8BAAA;;AAvGN,KAqGE,kCAKE;EACE,8BAAA;;AA3GN,KAqGE,kCASE,yBACE;EACE,oBAAA;EACA,WAAA;;AAEA,KAdN,kCASE,yBACE,0BAII;EACA,WAAA;;AApHV,KA0HE;EACE,kBAAA;EACA,aAAA;EACA,mBAAA;EACA,cAAA;EACA,kBAAA;;AAEA,KAPF,6BAOG;AAAQ,KAPX,6BAOY;EACR,YAAA;EACA,UAAA;EACA,yBAAA;EACA,SAAS,GAAT;EACA,SAAA;EACA,QAAA;EACA,kBAAA;EACA,oBAAA;;AAGF,KAlBF,6BAkBG;EACC,oCAAA;EACA,4BAAA;EACA,kBAAA;;AAGF,KAxBF,6BAwBG;EACC,oCAAA;EACA,4BAAA;EACA,kBAAA;;AArJN,KAyJE;EACE,mBAAA;EACA,yBAAA;EACA,cAAA;EACA,sCAAA;;AAEA,KANF,2BAMG;EACC,aAAA;;AAhKN,KAyJE,2BAUE;EACE,eAAA;;AApKN,KAyJE,2BAcE;EACE,cAAA;EACA,eAAA;;AAzKN,KAsLE,+BAEE;EACE,gBAAA;;AAzLN,KA6LE,yCACE;EACE,kBAAA;EACA,YAAA;EACA,aAAA;;AAjMN,KA6LE,yCACE,0BAKE;EACE,UAAA;EACA,kBAAA;EACA,QAAA;EACA,SAAA;EACA,wBAAA;EACA,YAAA;EACA,YAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;EACA,cAAA;EACA,8BAAA;EACA,yBAAA;EACA,gCAAA;EACA,4BAAA;EACA,2BAAA;EACA,oCAAA;EACA,kBAAA;EACA,aAAA;EAEA,kCAAA;EACA,+BAAA;EACA,6BAAA;EACA,0BAAA;;AAGF,KAjCJ,yCACE,0BAgCG,MAAO;EACN,cAAA;EACA,UAAA;;AAGF,KAtCJ,yCACE,0BAqCG,MAAO,6BAA6B;EACnC,YAAA;;AApOR,KA6LE,yCACE,0BAyCE,6BACE;EACE,WAAA;EAEA,iCAAA;EACA,8BAAA;EACA,4BAAA;EACA,yBAAA;;AA9OV,KAoPE;AApPF,KAoPwC;EACpC,aAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;;AA1PJ,KA6PE;EACE,mBAAA;EACA,gCAAA;EACA,cAAA;;AAhQJ,KAmQE;EACE,mBAAA;EACA,gCAAA;EACA,cAAA;;AAtQJ,KAyQE;EACE,oBAAA;;AA1QJ,KA6QE;EACE,eAAA;EACA,iBAAA;;AA/QJ,KA6QE,4BAIE;EACE,cAAA;EACA,WAAA;EACA,gBAAA;EACA,cAAA;;AArRN,KA6QE,4BAWE;EACE,WAAA;EACA,sBAAA;EACA,aAAA;EACA,oBAAA;EACA,SAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,sBAAA;EACA,yBAAA;EACA,yBAAA;EACA,WAAA;EACA,6BAAA;EACA,wBAAA;;AAtSN,KA6QE,4BA4BE;EACE,qBAAA;EACA,gBAAA;;AA3SN,KAgTE;EAEE,aAAA;;AAlTJ,KAgTE,+BAIE;EACE,kBAAA;EACA,kBAAA;EACA,eAAA;EACA,yBAAA;EACA,mBAAA;EACA,cAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,wCAAA;EAEA,qCAAA;EACA,kCAAA;EACA,gCAAA;EACA,6BAAA;;;;;;;;;;;AAEA,KAtBJ,+BAIE,qBAkBG;EACC,cAAA;EACA,WAAA;;AAxUR,KAgTE,+BAIE,qBAuBE;AA3UN,KAgTE,+BAIE,qBAuBO;EAEH,eAAA;;AA7UR,KAgTE,+BAIE,qBA4BE;AAhVN,KAgTE,+BAIE,qBA4BO;AAhVX,KAgTE,+BAIE,qBA4BmB;EACf,qBAAA;;AAjVR,KAgTE,+BAIE,qBAgCE;EACE,iBAAA;EACA,eAAA;;AAGF,KAzCJ,+BAIE,qBAqCG;;;;;;;;;;;;AAAD,KAzCJ,+BAIE,qBAqCG,oBAYC;EACE,oCAAA;EACA,yBAAA;EACA,eAAA;;AAIJ,KA5DJ,+BAIE,qBAwDG,+BACC;EACE,YAAA;;AAFJ,KA5DJ,+BAIE,qBAwDG,+BACC,kCAGE;EACE,YAAA;EACA,yBAAA;EACA,cAAA;;AAEA,KArEV,+BAIE,qBAwDG,+BACC,kCAGE,mCAKG;EACC,yBAAA;;AAMR,KA5EJ,+BAIE,qBAwEG,qCACC;AADF,KA5EJ,+BAIE,qBAwEG,qCACM,WAAU;EACb,cAAA;;AAFJ,KA5EJ,+BAIE,qBAwEG,qCAKC;EACE,yBAAA;EACA,cAAA;;AAEA,KArFR,+BAIE,qBAwEG,qCAKC,mCAIG;EACC,yBAAA;;AAeN,KArGJ,+BAIE,qBAiGG,qBACC,kCACE;EACE,gBAAgB,wDAAhB;EACA,oCAAA;EACA,YAAA;EACA,0BAAA;;AA3ZZ,KAgTE,+BAIE,qBA4GE;EACE,kBAAA;EAGA,MAAA;EACA,WAAA;EACA,SAAA;EACA,YAAA;EAEA,iBAAA;EACA,qCAAA;EACA,kCAAA;EACA,gCAAA;EACA,6BAAA;;AA7aR,KAgTE,+BAIE,qBA4GE,kCAeE;EACE,qBAAA;EACA,YAAA;EACA,gBAAA;EACA,SAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;EACA,kBAAA;EACA,aAAA;EACA,yBAAA;EACA,cAAA;;;;;;;;;;;;;;;;;;AAEA,KA7IR,+BAIE,qBA4GE,kCAeE,OAcG;EACC,yBAAA;;AAoBF,KAlKR,+BAIE,qBA4GE,kCAeE,OAmCG;EACC,8CAAA;;AAndZ,KA0dE;EACE,aAAA;EACA,eAAA;EACA,QAAA;EACA,SAAA;EACA,YAAA;EACA,aAAA;EACA,yBAAA;EACA,aAAA;EACA,qCAAA;EACA,sCAAA;EACA,2CAAA;EACA,WAAA;;AAteJ,KA0dE,4BAcE;EACE,eAAA;EACA,kBAAA;EACA,iBAAA;EACA,eAAA;;AA5eN,KA0dE,4BAqBE;EACE,aAAA;EACA,kBAAA;;AAjfN,KA0dE,4BA0BE;EACE,aAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,kBAAA;EACA,mBAAA;EACA,cAAA;;AAOF,KAxCF,4BAwCG,qCACC;EACE,cAAA;;AAIJ,KA9CF,4BA8CG;EACC,aAAA;EACA,yBAAA;;AAFF,KA9CF,4BA8CG,mCAIC;EACE,cAAA;EACA,cAAA;;AA9gBR,KA0dE,4BAwDE;EACE,kBAAA;EACA,aAAA;;AAphBN,KA0dE,4BAwDE,4BAIE;EACE,qBAAA;EACA,iBAAA;EACA,gBAAA;EACA,SAAA;EACA,iBAAA;;AAEA,KAnEN,4BAwDE,4BAIE;AAOK,KAnET,4BAwDE,4BAIE,OAOM;EACF,qBAAA;EACA,2BAAA;;AAGF,KAxEN,4BAwDE,4BAIE,OAYG;EACC,mBAAA;EACA,cAAA;;AAGF,KA7EN,4BAwDE,4BAIE,OAiBG;EACC,mBAAA;EACA,cAAA;;AAQV,mBAAsC;EACpC,KACE;IACE,gBAAA;IACA,gBAAA;;EAHJ,KAME;EANF,KAMyB;IACrB,WAAA;;EAPJ,KAUE;IACE,gBAAA;;;AAKN,mBAAqC;EACnC,KACE;IACE,eAAA;;EAFJ,KAKE;EALF,KAKyB;IACrB,WAAA;;EANJ,KASE;IACE,WAAA;IACA,eAAA;;;AAKN,mBAAqC;EACnC,KACE,+BACE,qBAAqB;IACnB,uBAAA","file":"general.css"}
admin/assets/css/gutenberg-autosave-control.css ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Gutenber autosave control styles
3
+
4
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
5
+ * @copyright (c) 10.12.2018, Webcraftic
6
+ * @version 1.0
7
+ *
8
+ * Credits:
9
+ * This code was used from the plugin: https://wordpress.org/plugins/disable-gutenberg-autosave/
10
+ * Author websevendev
11
+ */
12
+ h2.disable-gutenberg-autosave-header {
13
+ margin: 0;
14
+ }
15
+ p.disable-gutenberg-autosave-error {
16
+ color: red;
17
+ font-family: "Monaco", "Menlo", "Ubuntu Mono", "Consolas", "source-code-pro", monospace;
18
+ }
19
+ /*# sourceMappingURL=gutenberg-autosave-control.css.map */
admin/assets/css/gutenberg-autosave-control.css.map ADDED
@@ -0,0 +1 @@
 
1
+ {"version":3,"sources":["gutenberg-autosave-control.less"],"names":[],"mappings":";;;;;;;;;;;AAYA,EAAE;EACA,SAAA;;AAGF,CAAC;EACC,UAAA;EACA,aAAa,UAAU,SAAS,eAAe,YAAY,4BAA3D","file":"gutenberg-autosave-control.css"}
admin/assets/css/gutenberg-autosave-control.less ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Gutenber autosave control styles
3
+
4
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
5
+ * @copyright (c) 10.12.2018, Webcraftic
6
+ * @version 1.0
7
+ *
8
+ * Credits:
9
+ * This code was used from the plugin: https://wordpress.org/plugins/disable-gutenberg-autosave/
10
+ * Author websevendev
11
+ */
12
+
13
+ h2.disable-gutenberg-autosave-header {
14
+ margin: 0;
15
+ }
16
+
17
+ p.disable-gutenberg-autosave-error {
18
+ color: red;
19
+ font-family: "Monaco", "Menlo", "Ubuntu Mono", "Consolas", "source-code-pro", monospace;
20
+ }
admin/assets/css/install-addons.css CHANGED
@@ -1,31 +1,31 @@
1
- /**
2
- * Install addons global styles
3
- * @author Webcraftic <wordpress.webraftic@gmail.com>
4
- * @copyright Webcraftic 11.07.2018
5
- */
6
- .wbcr-clr-new-component {
7
- background: #f7f7f7;
8
- border: 1px solid #eaeaea;
9
- padding: 5px 20px;
10
- margin-bottom: 10px;
11
- }
12
- .wbcr-clr-new-component h4 {
13
- margin: 5px 0;
14
- display: inline-block;
15
- }
16
- .wbcr-clr-new-component .wbcr-clr-proccess-button {
17
- display: inline-block;
18
- margin: 5px 0;
19
- }
20
- .wbcr-clr-new-component.wbcr-clr-premium {
21
- background: #fff6db;
22
- border: 1px solid #e4dea9;
23
- }
24
- .wbcr-clr-new-component.wbcr-clr-premium h4 {
25
- color: #88690c;
26
- }
27
- .wbcr-clr-proccess-button.button-link,
28
- .wbcr-clr-proccess-button.button-link:focus {
29
- outline: none !important;
30
- box-shadow: none !important;
31
- }
1
+ /**
2
+ * Install addons global styles
3
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
4
+ * @copyright Webcraftic 11.07.2018
5
+ */
6
+ .wbcr-clr-new-component {
7
+ background: #f7f7f7;
8
+ border: 1px solid #eaeaea;
9
+ padding: 5px 20px;
10
+ margin-bottom: 10px;
11
+ }
12
+ .wbcr-clr-new-component h4 {
13
+ margin: 5px 0;
14
+ display: inline-block;
15
+ }
16
+ .wbcr-clr-new-component .wbcr-clr-proccess-button {
17
+ display: inline-block;
18
+ margin: 5px 0;
19
+ }
20
+ .wbcr-clr-new-component.wbcr-clr-premium {
21
+ background: #fff6db;
22
+ border: 1px solid #e4dea9;
23
+ }
24
+ .wbcr-clr-new-component.wbcr-clr-premium h4 {
25
+ color: #88690c;
26
+ }
27
+ .wbcr-clr-proccess-button.button-link,
28
+ .wbcr-clr-proccess-button.button-link:focus {
29
+ outline: none !important;
30
+ box-shadow: none !important;
31
+ }
admin/assets/gutenberg/build/index.build.js ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+ /******/
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+ /******/
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId]) {
10
+ /******/ return installedModules[moduleId].exports;
11
+ /******/ }
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ i: moduleId,
15
+ /******/ l: false,
16
+ /******/ exports: {}
17
+ /******/ };
18
+ /******/
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+ /******/
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.l = true;
24
+ /******/
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+ /******/
29
+ /******/
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+ /******/
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+ /******/
36
+ /******/ // define getter function for harmony exports
37
+ /******/ __webpack_require__.d = function(exports, name, getter) {
38
+ /******/ if(!__webpack_require__.o(exports, name)) {
39
+ /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
40
+ /******/ }
41
+ /******/ };
42
+ /******/
43
+ /******/ // define __esModule on exports
44
+ /******/ __webpack_require__.r = function(exports) {
45
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
46
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
47
+ /******/ }
48
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
49
+ /******/ };
50
+ /******/
51
+ /******/ // create a fake namespace object
52
+ /******/ // mode & 1: value is a module id, require it
53
+ /******/ // mode & 2: merge all properties of value into the ns
54
+ /******/ // mode & 4: return value when already ns object
55
+ /******/ // mode & 8|1: behave like require
56
+ /******/ __webpack_require__.t = function(value, mode) {
57
+ /******/ if(mode & 1) value = __webpack_require__(value);
58
+ /******/ if(mode & 8) return value;
59
+ /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
60
+ /******/ var ns = Object.create(null);
61
+ /******/ __webpack_require__.r(ns);
62
+ /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
63
+ /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
64
+ /******/ return ns;
65
+ /******/ };
66
+ /******/
67
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
68
+ /******/ __webpack_require__.n = function(module) {
69
+ /******/ var getter = module && module.__esModule ?
70
+ /******/ function getDefault() { return module['default']; } :
71
+ /******/ function getModuleExports() { return module; };
72
+ /******/ __webpack_require__.d(getter, 'a', getter);
73
+ /******/ return getter;
74
+ /******/ };
75
+ /******/
76
+ /******/ // Object.prototype.hasOwnProperty.call
77
+ /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
78
+ /******/
79
+ /******/ // __webpack_public_path__
80
+ /******/ __webpack_require__.p = "";
81
+ /******/
82
+ /******/
83
+ /******/ // Load entry module and return exports
84
+ /******/ return __webpack_require__(__webpack_require__.s = "./src/index.js");
85
+ /******/ })
86
+ /************************************************************************/
87
+ /******/ ({
88
+
89
+ /***/ "./src/index.js":
90
+ /*!**********************!*\
91
+ !*** ./src/index.js ***!
92
+ \**********************/
93
+ /*! no static exports found */
94
+ /***/ (function(module, exports) {
95
+
96
+ eval("function _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n/**\r\n * Gutenber autosave control. A simple solution for managing autosaves in gutenberg editor.\r\n * Previously, we simply turned off autosave using hooks, but in the editor,\r\n * you can’t do this in the gutenber.\r\n *\r\n * This widget for Gutenberg editor adds an icon, when clicked, you can select the autosave interval or full disable it.\r\n *\r\n * @author Webcraftic <wordpress.webraftic@gmail.com>\r\n * @copyright (c) 10.12.2018, Webcraftic\r\n * @version 1.0\r\n *\r\n * Credits:\r\n * This is not our development, we found excellent plugin and used these functions in our plugin. It is foolish to reinvent the wheel.\r\n * I hope in the future we will refine it better and add our ideas.\r\n * In the development of the code used by the author plugin: https://wordpress.org/plugins/disable-gutenberg-autosave/\r\n */\nvar NOT_TODAY = 99999;\nvar INTERVAL_OPTIONS = [{\n label: '10 seconds (default)',\n value: 10\n}, {\n label: '30 seconds',\n value: 30\n}, {\n label: '1 minute',\n value: 60\n}, {\n label: '5 minutes',\n value: 60 * 5\n}, {\n label: '10 minutes',\n value: 60 * 10\n}, {\n label: '30 minutes',\n value: 60 * 30\n}, {\n label: 'Disabled',\n value: NOT_TODAY\n}];\n\nvar ClearfyGutenbergAutosave =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inherits(ClearfyGutenbergAutosave, _React$Component);\n\n function ClearfyGutenbergAutosave(props) {\n var _this;\n\n _classCallCheck(this, ClearfyGutenbergAutosave);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ClearfyGutenbergAutosave).call(this, props));\n _this.state = {\n interval: 0,\n error: false\n };\n _this.apiGetInterval = _this.apiGetInterval.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.apiSetInterval = _this.apiSetInterval.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.editorUpdateInterval = _this.editorUpdateInterval.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(ClearfyGutenbergAutosave, [{\n key: \"apiGetInterval\",\n value: function apiGetInterval() {\n var _this2 = this;\n\n wp.apiFetch({\n path: '/clearfy-gutenberg-autosave/v1/interval'\n }).then(function (interval) {\n _this2.setState({\n interval: interval,\n error: false\n });\n }, function (error) {\n _this2.setState({\n interval: NOT_TODAY,\n error: error.message\n });\n });\n }\n }, {\n key: \"apiSetInterval\",\n value: function apiSetInterval() {\n if (this.state.error) {\n return;\n }\n\n wp.apiFetch({\n path: '/clearfy-gutenberg-autosave/v1/interval?interval=' + parseInt(this.state.interval),\n method: 'POST'\n });\n }\n }, {\n key: \"editorUpdateInterval\",\n value: function editorUpdateInterval() {\n this.props.updateEditorSettings(Object.assign({}, this.props.editorSettings, {\n autosaveInterval: parseInt(this.state.interval)\n }));\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.apiGetInterval();\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate(prevProps, prevState) {\n if (!this.state.interval) {\n return;\n }\n\n if (prevState.interval && prevState.inverval !== 0 && prevState.interval !== this.state.interval) {\n this.apiSetInterval();\n }\n\n if (this.props.editorSettings.autosaveInterval && this.props.editorSettings.autosaveInterval !== this.state.interval) {\n this.editorUpdateInterval();\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this3 = this;\n\n return React.createElement(React.Fragment, null, React.createElement(wp.editPost.PluginSidebarMoreMenuItem, {\n target: \"disable-gutenberg-autosave-sidebar\"\n }, 'Clearfy Gutenberg Autosave'), React.createElement(wp.editPost.PluginSidebar, {\n name: \"disable-gutenberg-autosave-sidebar\",\n title: 'Autosave settings'\n }, React.createElement(wp.components.PanelBody, {\n className: \"disable-gutenberg-autosave-settings\"\n }, !this.state.interval && React.createElement(\"p\", null, 'Loading...'), !!this.state.interval && this.state.error && React.createElement(React.Fragment, null, React.createElement(\"h2\", {\n className: \"disable-gutenberg-autosave-header\"\n }, 'API error:'), React.createElement(\"p\", {\n className: \"disable-gutenberg-autosave-error\"\n }, this.state.error), React.createElement(\"p\", null, 'Autosave is disabled anyway, but you cannot set custom intervals.'), React.createElement(wp.components.Button, {\n className: \"button button-primary\",\n onClick: function onClick() {\n _this3.setState({\n interval: 0,\n error: false\n });\n\n _this3.apiGetInterval();\n }\n }, 'Try again')), !!this.state.interval && !this.state.error && React.createElement(wp.components.RadioControl, {\n label: 'Autosave interval',\n options: INTERVAL_OPTIONS,\n selected: parseInt(this.state.interval),\n onChange: function onChange(value) {\n return _this3.setState({\n interval: parseInt(value)\n });\n }\n }))));\n }\n }]);\n\n return ClearfyGutenbergAutosave;\n}(React.Component);\n\nwp.plugins.registerPlugin('clearfy-gutenberg-autosave', {\n icon: 'backup',\n render: wp.compose.compose([wp.data.withSelect(function (select) {\n return {\n editorSettings: select('core/editor').getEditorSettings()\n };\n }), wp.data.withDispatch(function (dispatch) {\n return {\n updateEditorSettings: dispatch('core/editor').updateEditorSettings\n };\n })])(ClearfyGutenbergAutosave)\n});\n\n//# sourceURL=webpack:///./src/index.js?");
97
+
98
+ /***/ })
99
+
100
+ /******/ });
admin/assets/gutenberg/build/index.php ADDED
@@ -0,0 +1,2 @@
 
 
1
+ <?php
2
+ // Silence is golden.
admin/assets/gutenberg/index.php ADDED
@@ -0,0 +1,2 @@
 
 
1
+ <?php
2
+ // Silence is golden.
admin/boot.php CHANGED
@@ -1,9 +1,15 @@
1
  <?php
2
  /**
3
- * Admin boot
4
- * @author Webcraftic <alex.kovalevv@gmail.com>
5
- * @copyright Webcraftic 25.05.2017
6
- * @version 1.0
 
 
 
 
 
 
7
  */
8
 
9
  // Exit if accessed directly
1
  <?php
2
  /**
3
+ * The boot file is needed to connect backend files, as well as register hooks.
4
+ * Some hooks are so small that it does not make sense to put them into a file
5
+ * or put them into a specific group of code.
6
+ *
7
+ * I usually register administrator notifications, create handlers before saving
8
+ * plugin settings or after, register options in the Clearfy plugin.
9
+ *
10
+ * @author Webcraftic <wordpress.webraftic@gmail.com>, Alex Kovalev <alex.kovalevv@gmail.com>
11
+ * @copyright Webcraftic
12
+ * @version 1.1
13
  */
14
 
15
  // Exit if accessed directly
admin/includes/classes/class.upgrader.php CHANGED
@@ -1,126 +1,59 @@
1
  <?php
2
 
3
- class WCL_Plugin_Upgrader extends Plugin_Upgrader {
 
 
 
 
 
 
 
 
 
 
 
 
4
 
5
  /**
6
- * Download a package.
7
  *
8
- * @since 2.8.0
9
  *
10
- * @param string $package The URI of the package. If this is the full path to an
11
- * existing local file, it will be returned untouched.
12
- * @return string|WP_Error The full path to the downloaded package file, or a WP_Error object.
 
13
  */
14
- public function download_package($package)
15
- {
16
-
17
- /**
18
- * Filters whether to return the package.
19
- *
20
- * @since 3.7.0
21
- *
22
- * @param bool $reply Whether to bail without returning the package.
23
- * Default false.
24
- * @param string $package The package file name.
25
- * @param WP_Upgrader $this The WP_Upgrader instance.
26
- */
27
- $reply = apply_filters('upgrader_pre_download', false, $package, $this);
28
- if( false !== $reply ) {
29
- return $reply;
30
- }
31
-
32
- if( !preg_match('!^(http|https|ftp)://!i', $package) && file_exists($package) ) //Local file or remote?
33
- {
34
- return $package;
35
- } //must be a local file..
36
-
37
- if( empty($package) ) {
38
- return new WP_Error('no_package', $this->strings['no_package']);
39
- }
40
-
41
- $download_file = download_url($package, 1000);
42
-
43
- if( function_exists('mime_content_type') ) {
44
- $mime_type = mime_content_type($download_file);
45
- } else {
46
- $mime_type = $this->mimeContentType($download_file);
47
- }
48
 
49
- if( WbcrFactoryClearfy206_Helpers::strContains($mime_type, 'text/plain') ) {
50
- $this->result = new WP_Error('builder_error', __(file_get_contents($download_file), 'clearfy'));
 
 
51
 
52
- return $this->result;
53
- }
 
54
 
55
- if( is_wp_error($download_file) ) {
56
- return new WP_Error('download_failed', $this->strings['download_failed'], $download_file->get_error_message());
57
- }
58
 
59
- return $download_file;
 
60
  }
61
 
62
- public function mimeContentType($filename)
63
- {
64
- $mime_types = array(
65
- 'txt' => 'text/plain',
66
- 'htm' => 'text/html',
67
- 'html' => 'text/html',
68
- 'php' => 'text/html',
69
- 'css' => 'text/css',
70
- 'js' => 'application/javascript',
71
- 'json' => 'application/json',
72
- 'xml' => 'application/xml',
73
- 'swf' => 'application/x-shockwave-flash',
74
- 'flv' => 'video/x-flv',
75
- // images
76
- 'png' => 'image/png',
77
- 'jpe' => 'image/jpeg',
78
- 'jpeg' => 'image/jpeg',
79
- 'jpg' => 'image/jpeg',
80
- 'gif' => 'image/gif',
81
- 'bmp' => 'image/bmp',
82
- 'ico' => 'image/vnd.microsoft.icon',
83
- 'tiff' => 'image/tiff',
84
- 'tif' => 'image/tiff',
85
- 'svg' => 'image/svg+xml',
86
- 'svgz' => 'image/svg+xml',
87
- // archives
88
- 'zip' => 'application/zip',
89
- 'rar' => 'application/x-rar-compressed',
90
- 'exe' => 'application/x-msdownload',
91
- 'msi' => 'application/x-msdownload',
92
- 'cab' => 'application/vnd.ms-cab-compressed',
93
- // audio/video
94
- 'mp3' => 'audio/mpeg',
95
- 'qt' => 'video/quicktime',
96
- 'mov' => 'video/quicktime',
97
- // adobe
98
- 'pdf' => 'application/pdf',
99
- 'psd' => 'image/vnd.adobe.photoshop',
100
- 'ai' => 'application/postscript',
101
- 'eps' => 'application/postscript',
102
- 'ps' => 'application/postscript',
103
- // ms office
104
- 'doc' => 'application/msword',
105
- 'rtf' => 'application/rtf',
106
- 'xls' => 'application/vnd.ms-excel',
107
- 'ppt' => 'application/vnd.ms-powerpoint',
108
- // open office
109
- 'odt' => 'application/vnd.oasis.opendocument.text',
110
- 'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
111
- );
112
-
113
- $ext = strtolower(array_pop(explode('.', $filename)));
114
- if( array_key_exists($ext, $mime_types) ) {
115
- return $mime_types[$ext];
116
- } elseif( function_exists('finfo_open') ) {
117
- $finfo = finfo_open(FILEINFO_MIME);
118
- $mimetype = finfo_file($finfo, $filename);
119
- finfo_close($finfo);
120
 
121
- return $mimetype;
122
- } else {
123
- return 'application/octet-stream';
124
- }
125
  }
 
 
126
  }
 
1
  <?php
2
 
3
+ class WCL_Plugin_Upgrader extends Plugin_Upgrader {
4
+
5
+ /**
6
+ * Download a package.
7
+ *
8
+ * @since 2.8.0
9
+ *
10
+ * @param string $package The URI of the package. If this is the full path to an
11
+ * existing local file, it will be returned untouched.
12
+ *
13
+ * @return string|WP_Error The full path to the downloaded package file, or a WP_Error object.
14
+ */
15
+ public function download_package( $package ) {
16
 
17
  /**
18
+ * Filters whether to return the package.
19
  *
20
+ * @since 3.7.0
21
  *
22
+ * @param bool $reply Whether to bail without returning the package.
23
+ * Default false.
24
+ * @param string $package The package file name.
25
+ * @param WP_Upgrader $this The WP_Upgrader instance.
26
  */
27
+ $reply = apply_filters( 'upgrader_pre_download', false, $package, $this );
28
+ if ( false !== $reply ) {
29
+ return $reply;
30
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
 
32
+ if ( ! preg_match( '!^(http|https|ftp)://!i', $package ) && file_exists( $package ) ) //Local file or remote?
33
+ {
34
+ return $package;
35
+ } //must be a local file..
36
 
37
+ if ( empty( $package ) ) {
38
+ return new WP_Error( 'no_package', $this->strings['no_package'] );
39
+ }
40
 
41
+ $download_file = download_url( $package, 10000 );
 
 
42
 
43
+ if ( is_wp_error( $download_file ) ) {
44
+ return new WP_Error( 'download_failed', $this->strings['download_failed'], $download_file->get_error_message() );
45
  }
46
 
47
+ // Temporary fix. Components package is definitely more than 2kb,
48
+ // if the file weight is less than 2kb, the server returned an error and
49
+ // empty file saved
50
+ $filesize = filesize( $download_file );
51
+ if ( $filesize < ( 2 * 1000 ) ) {
52
+ @unlink( $download_file );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
 
54
+ return new WP_Error( 'download_failed', 'Component package cannot be loaded. The server returned an error.' );
 
 
 
55
  }
56
+
57
+ return $download_file;
58
  }
59
+ }
admin/pages/advanced.php CHANGED
@@ -43,32 +43,6 @@
43
  $this->plugin = $plugin;
44
  }
45
 
46
- protected function isPostRevisionConstant()
47
- {
48
- $config_path = ABSPATH . '/wp-config.php';
49
-
50
- if( file_exists($config_path) ) {
51
- $file = fopen($config_path, 'r');
52
- $content = fread($file, filesize($config_path));
53
- fclose($file);
54
-
55
- if( !empty($content) && preg_match('/define(.+?)WP_POST_REVISIONS/', $content) ) {
56
- return true;
57
- }
58
- }
59
-
60
- return false;
61
- }
62
-
63
- public function warningNotice()
64
- {
65
- parent::warningNotice();
66
-
67
- if( !$this->plugin->getPopulateOption('revisions_disable') && $this->isPostRevisionConstant() ) {
68
- $this->printWarningNotice(__('Warning! In the wp-config.php file, a constant WP_POST_REVISIONS is found, it determines the number of revisions. Delete it so you can change this value through the admin panel.', 'clearfy'));
69
- }
70
- }
71
-
72
  /**
73
  * Permalinks options.
74
  *
@@ -80,70 +54,6 @@
80
 
81
  $options = array();
82
 
83
- $options[] = array(
84
- 'type' => 'html',
85
- 'html' => '<div class="wbcr-clearfy-group-header">' . '<strong>' . __('Heartbeat', 'clearfy') . '</strong>' . '<p>' . __('The WordPress Heartbeat API uses /wp-admin/admin-ajax.php to run AJAX calls from the web-browser. While this is great and all it can also cause high CPU usage and crazy amounts of PHP calls. For example, if you leave your dashboard open it will keep sending POST requests to this file on a regular interval, every 15 seconds. Here is an example below of it happening.', 'clearfy') . '</p>' . '</div>'
86
- );
87
-
88
- $options[] = array(
89
- 'type' => 'dropdown',
90
- 'name' => 'disable_heartbeat',
91
- 'way' => 'buttons',
92
- 'title' => __('Disable Heartbeat', 'clearfy'),
93
- 'data' => array(
94
- array('default', __('Default', 'clearfy')),
95
- array('everywhere', __('Everywhere', 'clearfy')),
96
- array('on_dashboard_page', __('On dashboard page', 'clearfy')),
97
- array('allow_only_on_post_edit_pages', __('Only allow when editing Posts/Pages', 'clearfy'))
98
- ),
99
- //'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
100
- //'hint' => __('You can disable all plugin updates or choose manual or automatic update mode.', 'clearfy'),
101
- 'events' => array(
102
- 'default' => array(
103
- 'show' => '.factory-control-heartbeat_frequency'
104
- ),
105
- 'on_dashboard_page' => array(
106
- 'show' => '.factory-control-heartbeat_frequency'
107
- ),
108
- 'allow_only_on_post_edit_pages' => array(
109
- 'show' => '.factory-control-heartbeat_frequency'
110
- ),
111
- 'everywhere' => array(
112
- 'hide' => '.factory-control-heartbeat_frequency'
113
- )
114
- ),
115
- 'default' => 'default',
116
- );
117
-
118
- $options[] = array(
119
- 'type' => 'dropdown',
120
- 'name' => 'heartbeat_frequency',
121
- 'title' => __('Heartbeat frequency', 'clearfy'),
122
- 'data' => array(
123
- array('default', __('Wordpress default', 'clearfy')),
124
- array('20', '20 ' . __('seconds', 'clearfy')),
125
- array('25', '25 ' . __('seconds', 'clearfy')),
126
- array('30', '30 ' . __('seconds', 'clearfy')),
127
- array('35', '35 ' . __('seconds', 'clearfy')),
128
- array('40', '40 ' . __('seconds', 'clearfy')),
129
- array('45', '45 ' . __('seconds', 'clearfy')),
130
- array('50', '50 ' . __('seconds', 'clearfy')),
131
- array('55', '55 ' . __('seconds', 'clearfy')),
132
- array('60', '60 ' . __('seconds', 'clearfy')),
133
- array('80', '80 ' . __('seconds', 'clearfy')),
134
- array('120', '120 ' . __('seconds', 'clearfy')),
135
- array('150', '150 ' . __('seconds', 'clearfy')),
136
- array('200', '200 ' . __('seconds', 'clearfy')),
137
- array('250', '250 ' . __('seconds', 'clearfy')),
138
- array('300', '300 ' . __('seconds', 'clearfy')),
139
- array('400', '400 ' . __('seconds', 'clearfy')),
140
- array('500', '500 ' . __('seconds', 'clearfy'))
141
- ),
142
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
143
- 'hint' => __('Select the heartbeat frequency wordpress. We recommend you 60 seconds, default is 20 seconds.', 'clearfy'),
144
- 'default' => 'default'
145
- );
146
-
147
  //============================================================
148
  // ADMINBAR MANAGER COMPONENT
149
  //============================================================
@@ -171,114 +81,6 @@
171
  'hint' => __('In some cases, you need to disable the floating top admin panel. You can disable this panel.', 'clearfy') . '<br><b>Clearfy</b>: ' . __('Disable admin top bar.', 'clearfy'),
172
  'default' => 'enable',
173
  );
174
-
175
- $options[] = array(
176
- 'type' => 'checkbox',
177
- 'way' => 'buttons',
178
- 'name' => 'disable_admin_bar_logo',
179
- 'title' => __('Remove admin bar WP logo', 'clearfy'),
180
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'green'),
181
- 'hint' => __('Enable this if you want to remove wp logo from admin bar.', 'clearfy'),
182
- 'default' => false
183
- );
184
-
185
- $options[] = array(
186
- 'type' => 'checkbox',
187
- 'way' => 'buttons',
188
- 'name' => 'replace_howdy_welcome',
189
- 'title' => __('Replace "Howdy" text with "Welcome"', 'clearfy'),
190
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'green'),
191
- 'hint' => __('Replaces the welcome text in admin bar.', 'clearfy'),
192
- 'default' => false
193
- );
194
- }
195
-
196
- //============================================================
197
- // POST TOOLS COMPONENT
198
- //============================================================
199
-
200
- if( $this->plugin->isActivateComponent('post_tools') ) {
201
- $options[] = array(
202
- 'type' => 'html',
203
- 'html' => '<div class="wbcr-clearfy-group-header">' . '<strong>' . __('Posts', 'clearfy') . '</strong>' . '<p>' . __('In this group of options, you can manage revisions and post autosave.', 'clearfy') . '</p>' . '</div>'
204
- );
205
-
206
- $options[] = array(
207
- 'type' => 'checkbox',
208
- 'way' => 'buttons',
209
- 'name' => 'revisions_disable',
210
- 'title' => __('Disable revision', 'clearfy'),
211
- 'default' => false,
212
- 'eventsOn' => array(
213
- 'hide' => '.factory-control-revision_limit'
214
- ),
215
- 'eventsOff' => array(
216
- 'show' => '.factory-control-revision_limit'
217
- ),
218
- );
219
-
220
- $options[] = array(
221
- 'type' => 'dropdown',
222
- 'name' => 'revision_limit',
223
- 'title' => __('Limit Post Revisions', 'clearfy'),
224
- 'data' => array(
225
- array('default', __('Wordpress default', 'clearfy')),
226
- array('15', '15 ' . __('revisions', 'clearfy')),
227
- array('20', '20 ' . __('revisions', 'clearfy')),
228
- array('25', '25 ' . __('revisions', 'clearfy')),
229
- array('30', '30 ' . __('revisions', 'clearfy')),
230
- array('35', '35 ' . __('revisions', 'clearfy')),
231
- array('40', '40 ' . __('revisions', 'clearfy')),
232
- array('45', '45 ' . __('revisions', 'clearfy')),
233
- array('50', '50 ' . __('revisions', 'clearfy')),
234
- array('55', '55 ' . __('revisions', 'clearfy')),
235
- array('60', '60 ' . __('revisions', 'clearfy'))
236
- ),
237
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
238
- 'hint' => __('WordPress automatically saves revisions when you are working on posts and pages. These can begin to add up pretty quick. By default, there is no limit in place. We have seen posts with over 1,000 revisions. Multiply this by 50 pages and suddenly you have over 50,000 revisions sitting in your database. The problem with this is that you will most likely never use them and they can start slowing down your database as well as using disk space.
239
- So we recommend either disabling or limiting your revisions. ', 'clearfy'),
240
- 'default' => 'default'
241
- );
242
-
243
- $options[] = array(
244
- 'type' => 'checkbox',
245
- 'way' => 'buttons',
246
- 'name' => 'disable_post_autosave',
247
- 'title' => __('Disable autosave', 'clearfy'),
248
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
249
- 'hint' => __('WordPress by default automatically saves a draft every 60 seconds (1 minute). There are reasons why you might want to change this.', 'clearfy') . '<br><b>Clearfy</b>: ' . __('Disables automatic saving of drafts.', 'clearfy'),
250
- 'default' => false
251
- );
252
-
253
- $options[] = array(
254
- 'type' => 'checkbox',
255
- 'way' => 'buttons',
256
- 'name' => 'disable_texturization',
257
- 'title' => __('Disable Texturization - Smart Quotes', 'clearfy'),
258
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
259
- 'hint' => __('Function of text formatting. This function makes the text more correct, readable and visually appealing. But sometimes this function may prevent you from using certain codes and symbols.', 'clearfy') . '<br><b>Clearfy</b>: ' . __('Disable Texturization - Smart Quotes.', 'clearfy'),
260
- 'default' => false
261
- );
262
-
263
- $options[] = array(
264
- 'type' => 'checkbox',
265
- 'way' => 'buttons',
266
- 'name' => 'disable_auto_correct_dangit',
267
- 'title' => __('Disable capitalization in Wordpress branding', 'clearfy'),
268
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
269
- 'hint' => __('Replaces the incorrectly written letter "p" in the middle of WordPress (you need to write with the capital P in the middle).', 'clearfy') . '<br><b>Clearfy</b>: ' . __('Disable capitalization in Wordpress branding.', 'clearfy'),
270
- 'default' => false
271
- );
272
-
273
- $options[] = array(
274
- 'type' => 'checkbox',
275
- 'way' => 'buttons',
276
- 'name' => 'disable_auto_paragraph',
277
- 'title' => __('Disable auto inserted paragraphs (i.e. p tags)', 'clearfy'),
278
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
279
- 'hint' => __('Replaces the double shifting of a string to an HTML p ... /p construct, and a single one on br.', 'clearfy') . '<br><b>Clearfy</b>: ' . __('Disable auto inserted paragraphs.', 'clearfy'),
280
- 'default' => false
281
- );
282
  }
283
 
284
  $formOptions = array();
43
  $this->plugin = $plugin;
44
  }
45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  /**
47
  * Permalinks options.
48
  *
54
 
55
  $options = array();
56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  //============================================================
58
  // ADMINBAR MANAGER COMPONENT
59
  //============================================================
81
  'hint' => __('In some cases, you need to disable the floating top admin panel. You can disable this panel.', 'clearfy') . '<br><b>Clearfy</b>: ' . __('Disable admin top bar.', 'clearfy'),
82
  'default' => 'enable',
83
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  }
85
 
86
  $formOptions = array();
admin/pages/clearfy-settings.php CHANGED
@@ -12,70 +12,71 @@ if ( ! defined( 'ABSPATH' ) ) {
12
  }
13
 
14
  class WCL_ClearfySettingsPage extends Wbcr_FactoryClearfy206_PageBase {
15
-
16
  /**
17
  * The id of the page in the admin menu.
18
  *
19
  * Mainly used to navigate between pages.
20
- * @see FactoryPages410_AdminPage
21
  *
22
  * @since 1.0.0
 
 
23
  * @var string
24
  */
25
  public $id = "clearfy_settings";
26
-
27
  /**
28
  * @var string
29
  */
30
  public $page_parent_page = 'none';
31
-
32
  /**
33
  * @var string
34
  */
35
  public $page_menu_dashicon = 'dashicons-list-view';
36
-
37
  /**
38
  * @var bool
39
  */
40
  public $available_for_multisite = true;
41
-
42
  /**
43
  * @param WCL_Plugin $plugin
44
  */
45
  public function __construct( WCL_Plugin $plugin ) {
46
  $this->menu_title = __( 'Clearfy Settings', 'clearfy' );
47
  $this->page_menu_short_description = __( 'Useful tweaks', 'clearfy' );
48
-
49
  parent::__construct( $plugin );
50
-
51
  $this->plugin = $plugin;
52
  }
53
-
54
-
55
  /**
56
  * Requests assets (js and css) for the page.
57
  *
58
- * @see FactoryPages410_AdminPage
59
- *
60
  * @since 1.0.0
61
  * @return void
 
 
62
  */
63
  public function assets( $scripts, $styles ) {
64
  parent::assets( $scripts, $styles );
65
-
66
  $this->scripts->add( WCL_PLUGIN_URL . '/admin/assets/js/general.js' );
67
-
68
- $params = array(
69
  'import_options_nonce' => wp_create_nonce( 'wbcr_clearfy_import_options' ),
70
- 'i18n' => array(
71
  'success_update_settings' => __( 'Settings successfully updated!', 'clearfy' ),
72
  'unknown_error' => __( 'During the setup, an unknown error occurred, please try again or contact the plugin support.', 'clearfy' ),
73
- )
74
- );
75
-
76
  wp_localize_script( 'jquery', 'wbcr_clearfy_ajax', $params );
77
  }
78
-
79
  /**
80
  * Permalinks options.
81
  *
@@ -83,65 +84,65 @@ class WCL_ClearfySettingsPage extends Wbcr_FactoryClearfy206_PageBase {
83
  * @return mixed[]
84
  */
85
  public function getPageOptions() {
86
-
87
- $options = array();
88
-
89
- $options[] = array(
90
  'type' => 'html',
91
  'html' => '<div class="wbcr-clearfy-group-header">' . '<strong>' . __( 'Advanced settings', 'clearfy' ) . '</strong>' . '<p>' . __( 'This group of settings allows you to configure the work of the Clearfy plugin.', 'clearfy' ) . '</p>' . '</div>'
92
- );
93
-
94
- $options[] = array(
95
  'type' => 'checkbox',
96
  'way' => 'buttons',
97
  'name' => 'disable_clearfy_extra_menu',
98
  'title' => __( 'Disable menu in adminbar', 'clearfy' ),
99
- 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'red' ),
100
  'hint' => __( 'This setting allows you to disable the additional menu of the Clearfy plugin, in the admin bar. This menu is required to work with the Minify and Combine and Assets Manager components.', 'clearfy' ),
101
  'default' => false
102
- );
103
-
104
- $options[] = array(
105
  'type' => 'checkbox',
106
  'way' => 'buttons',
107
  'name' => 'complete_uninstall',
108
  'title' => __( 'Complete Uninstall', 'clearfy' ),
109
- 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
110
  'hint' => __( "When the plugin is deleted from the Plugins menu, also delete all plugin settings.", 'clearfy' ),
111
  'default' => false
112
- );
113
-
114
- $options[] = array(
115
  'type' => 'html',
116
  'html' => '<div class="wbcr-clearfy-group-header">' . '<strong>' . __( 'Import/Export', 'clearfy' ) . '</strong>' . '<p>' . __( 'This group of settings allows you to configure the work of the Clearfy plugin.', 'clearfy' ) . '</p>' . '</div>'
117
- );
118
-
119
- $options[] = array(
120
  'type' => 'html',
121
- 'html' => array( $this, 'export' )
122
- );
123
-
124
- $options[] = array(
125
  'type' => 'html',
126
  'html' => '<div class="wbcr-clearfy-group-header">' . '<strong>' . __( 'Support', 'clearfy' ) . '</strong>' . '<p>' . __( 'This group of settings allows you to configure the work of the Clearfy plugin.', 'clearfy' ) . '</p>' . '</div>'
127
- );
128
-
129
- $options[] = array(
130
  'type' => 'html',
131
- 'html' => array( $this, 'supports' )
132
- );
133
-
134
- $formOptions = array();
135
-
136
- $formOptions[] = array(
137
  'type' => 'form-group',
138
  'items' => $options,
139
  //'cssClass' => 'postbox'
140
- );
141
-
142
  return apply_filters( 'wbcr/clearfy/settings_form_options', $formOptions, $this );
143
  }
144
-
145
  public function export() {
146
  ?>
147
  <div class="wbcr-clearfy-export-import">
@@ -155,7 +156,7 @@ class WCL_ClearfySettingsPage extends Wbcr_FactoryClearfy206_PageBase {
155
  </div>
156
  <?php
157
  }
158
-
159
  public function supports() {
160
  ?>
161
  <div class="wbcr-clearfy-troubleshooting">
@@ -175,18 +176,19 @@ class WCL_ClearfySettingsPage extends Wbcr_FactoryClearfy206_PageBase {
175
  </div>
176
  <?php
177
  }
178
-
179
  /**
180
  * Collects error and system error data
 
181
  * @return string
182
  */
183
  public function getDebugReport() {
184
  $run_time = number_format( microtime( true ), 3 );
185
- $pps = number_format( 1 / $run_time, 0 );
186
  $memory_avail = ini_get( 'memory_limit' );
187
  $memory_used = number_format( memory_get_usage( true ) / ( 1024 * 1024 ), 2 );
188
  $memory_peak = number_format( memory_get_peak_usage( true ) / ( 1024 * 1024 ), 2 );
189
-
190
  $debug = '';
191
  if ( PHP_SAPI == 'cli' ) {
192
  // if run for command line, display some info
@@ -196,51 +198,53 @@ class WCL_ClearfySettingsPage extends Wbcr_FactoryClearfy206_PageBase {
196
  $debug = "" //<hr />"
197
  . "<div style=\"text-align: left;\">" . "<hr />" . " Config: " . "<br />" . " &nbsp;&nbsp; | php " . phpversion() . " " . php_sapi_name() . " / zend engine " . zend_version() . "<br />" . " &nbsp;&nbsp; | Server Timezone: " . date_default_timezone_get() . "<br />" . " Load: " . "<br />" . " &nbsp;&nbsp; | Memory: {$memory_avail} (avail) / {$memory_used}M (used) / {$memory_peak}M (peak)" . "<br />" . " &nbsp;&nbsp; | Time: {$run_time}s &nbsp;&nbsp; | {$pps} req/sec" . "<br />" . "Url: " . "<br />" . " &nbsp;&nbsp; |" . "<br />" . " &nbsp;&nbsp; | Agent: " . ( @$_SERVER["HTTP_USER_AGENT"] ) . "<br />" . "Version Control: " . "<br />" . " &nbsp;&nbsp; </div>" . "<br />";
198
  }
199
-
200
  $debug .= "Plugins<br>";
201
  $debug .= "=====================<br>";
202
-
203
  $plugins = get_plugins();
204
-
205
  require_once ABSPATH . '/wp-admin/includes/plugin.php';
 
206
  foreach ( $plugins as $path => $plugin ) {
207
  if ( is_plugin_active( $path ) ) {
208
  $debug .= $plugin['Name'] . '<br>';
209
  }
210
  }
211
-
212
  return $debug;
213
  }
214
-
215
  /**
216
  * Generates a report about the system and plug-in error
 
217
  * @return string
218
  */
219
  public function gererateReportAction() {
220
  require_once( WCL_PLUGIN_DIR . '/includes/classes/class.zip-archive.php' );
221
-
222
  $reposts_dir = WCL_PLUGIN_DIR . '/reports';
223
  $reports_temp = $reposts_dir . '/temp';
224
-
225
  if ( ! file_exists( $reposts_dir ) ) {
226
  mkdir( $reposts_dir, 0777, true );
227
  }
228
-
229
  if ( ! file_exists( $reports_temp ) ) {
230
  mkdir( $reports_temp, 0777, true );
231
  }
232
-
233
  $file = fopen( $reports_temp . '/site-info.html', 'w+' );
234
  fputs( $file, $this->getDebugReport() );
235
  fclose( $file );
236
-
237
  $download_file_name = 'webcraftic-clearfy-report-' . date( 'Y.m.d-H.i.s' ) . '.zip';
238
  $download_file_path = WCL_PLUGIN_DIR . '/reports/' . $download_file_name;
239
-
240
  Wbcr_ExtendedZip::zipTree( WCL_PLUGIN_DIR . '/reports/temp', $download_file_path, ZipArchive::CREATE );
241
-
242
  array_map( 'unlink', glob( WCL_PLUGIN_DIR . "/reports/temp/*" ) );
243
-
244
  wp_redirect( WCL_PLUGIN_URL . '/reports/' . $download_file_name );
245
  exit;
246
  }
12
  }
13
 
14
  class WCL_ClearfySettingsPage extends Wbcr_FactoryClearfy206_PageBase {
15
+
16
  /**
17
  * The id of the page in the admin menu.
18
  *
19
  * Mainly used to navigate between pages.
 
20
  *
21
  * @since 1.0.0
22
+ * @see FactoryPages410_AdminPage
23
+ *
24
  * @var string
25
  */
26
  public $id = "clearfy_settings";
27
+
28
  /**
29
  * @var string
30
  */
31
  public $page_parent_page = 'none';
32
+
33
  /**
34
  * @var string
35
  */
36
  public $page_menu_dashicon = 'dashicons-list-view';
37
+
38
  /**
39
  * @var bool
40
  */
41
  public $available_for_multisite = true;
42
+
43
  /**
44
  * @param WCL_Plugin $plugin
45
  */
46
  public function __construct( WCL_Plugin $plugin ) {
47
  $this->menu_title = __( 'Clearfy Settings', 'clearfy' );
48
  $this->page_menu_short_description = __( 'Useful tweaks', 'clearfy' );
49
+
50
  parent::__construct( $plugin );
51
+
52
  $this->plugin = $plugin;
53
  }
54
+
55
+
56
  /**
57
  * Requests assets (js and css) for the page.
58
  *
 
 
59
  * @since 1.0.0
60
  * @return void
61
+ * @see FactoryPages410_AdminPage
62
+ *
63
  */
64
  public function assets( $scripts, $styles ) {
65
  parent::assets( $scripts, $styles );
66
+
67
  $this->scripts->add( WCL_PLUGIN_URL . '/admin/assets/js/general.js' );
68
+
69
+ $params = [
70
  'import_options_nonce' => wp_create_nonce( 'wbcr_clearfy_import_options' ),
71
+ 'i18n' => [
72
  'success_update_settings' => __( 'Settings successfully updated!', 'clearfy' ),
73
  'unknown_error' => __( 'During the setup, an unknown error occurred, please try again or contact the plugin support.', 'clearfy' ),
74
+ ]
75
+ ];
76
+
77
  wp_localize_script( 'jquery', 'wbcr_clearfy_ajax', $params );
78
  }
79
+
80
  /**
81
  * Permalinks options.
82
  *
84
  * @return mixed[]
85
  */
86
  public function getPageOptions() {
87
+
88
+ $options = [];
89
+
90
+ $options[] = [
91
  'type' => 'html',
92
  'html' => '<div class="wbcr-clearfy-group-header">' . '<strong>' . __( 'Advanced settings', 'clearfy' ) . '</strong>' . '<p>' . __( 'This group of settings allows you to configure the work of the Clearfy plugin.', 'clearfy' ) . '</p>' . '</div>'
93
+ ];
94
+
95
+ $options[] = [
96
  'type' => 'checkbox',
97
  'way' => 'buttons',
98
  'name' => 'disable_clearfy_extra_menu',
99
  'title' => __( 'Disable menu in adminbar', 'clearfy' ),
100
+ 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'red' ],
101
  'hint' => __( 'This setting allows you to disable the additional menu of the Clearfy plugin, in the admin bar. This menu is required to work with the Minify and Combine and Assets Manager components.', 'clearfy' ),
102
  'default' => false
103
+ ];
104
+
105
+ $options[] = [
106
  'type' => 'checkbox',
107
  'way' => 'buttons',
108
  'name' => 'complete_uninstall',
109
  'title' => __( 'Complete Uninstall', 'clearfy' ),
110
+ 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
111
  'hint' => __( "When the plugin is deleted from the Plugins menu, also delete all plugin settings.", 'clearfy' ),
112
  'default' => false
113
+ ];
114
+
115
+ $options[] = [
116
  'type' => 'html',
117
  'html' => '<div class="wbcr-clearfy-group-header">' . '<strong>' . __( 'Import/Export', 'clearfy' ) . '</strong>' . '<p>' . __( 'This group of settings allows you to configure the work of the Clearfy plugin.', 'clearfy' ) . '</p>' . '</div>'
118
+ ];
119
+
120
+ $options[] = [
121
  'type' => 'html',
122
+ 'html' => [ $this, 'export' ]
123
+ ];
124
+
125
+ $options[] = [
126
  'type' => 'html',
127
  'html' => '<div class="wbcr-clearfy-group-header">' . '<strong>' . __( 'Support', 'clearfy' ) . '</strong>' . '<p>' . __( 'This group of settings allows you to configure the work of the Clearfy plugin.', 'clearfy' ) . '</p>' . '</div>'
128
+ ];
129
+
130
+ $options[] = [
131
  'type' => 'html',
132
+ 'html' => [ $this, 'supports' ]
133
+ ];
134
+
135
+ $formOptions = [];
136
+
137
+ $formOptions[] = [
138
  'type' => 'form-group',
139
  'items' => $options,
140
  //'cssClass' => 'postbox'
141
+ ];
142
+
143
  return apply_filters( 'wbcr/clearfy/settings_form_options', $formOptions, $this );
144
  }
145
+
146
  public function export() {
147
  ?>
148
  <div class="wbcr-clearfy-export-import">
156
  </div>
157
  <?php
158
  }
159
+
160
  public function supports() {
161
  ?>
162
  <div class="wbcr-clearfy-troubleshooting">
176
  </div>
177
  <?php
178
  }
179
+
180
  /**
181
  * Collects error and system error data
182
+ *
183
  * @return string
184
  */
185
  public function getDebugReport() {
186
  $run_time = number_format( microtime( true ), 3 );
187
+ $pps = number_format( 1 / floatval( $run_time ), 0 );
188
  $memory_avail = ini_get( 'memory_limit' );
189
  $memory_used = number_format( memory_get_usage( true ) / ( 1024 * 1024 ), 2 );
190
  $memory_peak = number_format( memory_get_peak_usage( true ) / ( 1024 * 1024 ), 2 );
191
+
192
  $debug = '';
193
  if ( PHP_SAPI == 'cli' ) {
194
  // if run for command line, display some info
198
  $debug = "" //<hr />"
199
  . "<div style=\"text-align: left;\">" . "<hr />" . " Config: " . "<br />" . " &nbsp;&nbsp; | php " . phpversion() . " " . php_sapi_name() . " / zend engine " . zend_version() . "<br />" . " &nbsp;&nbsp; | Server Timezone: " . date_default_timezone_get() . "<br />" . " Load: " . "<br />" . " &nbsp;&nbsp; | Memory: {$memory_avail} (avail) / {$memory_used}M (used) / {$memory_peak}M (peak)" . "<br />" . " &nbsp;&nbsp; | Time: {$run_time}s &nbsp;&nbsp; | {$pps} req/sec" . "<br />" . "Url: " . "<br />" . " &nbsp;&nbsp; |" . "<br />" . " &nbsp;&nbsp; | Agent: " . ( @$_SERVER["HTTP_USER_AGENT"] ) . "<br />" . "Version Control: " . "<br />" . " &nbsp;&nbsp; </div>" . "<br />";
200
  }
201
+
202
  $debug .= "Plugins<br>";
203
  $debug .= "=====================<br>";
204
+
205
  $plugins = get_plugins();
206
+
207
  require_once ABSPATH . '/wp-admin/includes/plugin.php';
208
+
209
  foreach ( $plugins as $path => $plugin ) {
210
  if ( is_plugin_active( $path ) ) {
211
  $debug .= $plugin['Name'] . '<br>';
212
  }
213
  }
214
+
215
  return $debug;
216
  }
217
+
218
  /**
219
  * Generates a report about the system and plug-in error
220
+ *
221
  * @return string
222
  */
223
  public function gererateReportAction() {
224
  require_once( WCL_PLUGIN_DIR . '/includes/classes/class.zip-archive.php' );
225
+
226
  $reposts_dir = WCL_PLUGIN_DIR . '/reports';
227
  $reports_temp = $reposts_dir . '/temp';
228
+
229
  if ( ! file_exists( $reposts_dir ) ) {
230
  mkdir( $reposts_dir, 0777, true );
231
  }
232
+
233
  if ( ! file_exists( $reports_temp ) ) {
234
  mkdir( $reports_temp, 0777, true );
235
  }
236
+
237
  $file = fopen( $reports_temp . '/site-info.html', 'w+' );
238
  fputs( $file, $this->getDebugReport() );
239
  fclose( $file );
240
+
241
  $download_file_name = 'webcraftic-clearfy-report-' . date( 'Y.m.d-H.i.s' ) . '.zip';
242
  $download_file_path = WCL_PLUGIN_DIR . '/reports/' . $download_file_name;
243
+
244
  Wbcr_ExtendedZip::zipTree( WCL_PLUGIN_DIR . '/reports/temp', $download_file_path, ZipArchive::CREATE );
245
+
246
  array_map( 'unlink', glob( WCL_PLUGIN_DIR . "/reports/temp/*" ) );
247
+
248
  wp_redirect( WCL_PLUGIN_URL . '/reports/' . $download_file_name );
249
  exit;
250
  }
admin/pages/components.php CHANGED
@@ -1,466 +1,452 @@
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  /**
3
- * This file is the add-ons page.
4
  *
5
- * @author Alex Kovalev <alex@byonepress.com>
6
- * @copyright (c) 2017, OnePress Ltd
7
  *
8
  * @since 1.0.0
 
 
 
9
  */
 
10
 
11
- // Exit if accessed directly
12
- if( !defined('ABSPATH') ) {
13
- exit;
14
- }
15
 
16
- class WCL_ComponentsPage extends Wbcr_FactoryClearfy206_PageBase {
17
 
18
- /**
19
- * The id of the page in the admin menu.
20
- *
21
- * Mainly used to navigate between pages.
22
- * @see FactoryPages410_AdminPage
23
- *
24
- * @since 1.0.0
25
- * @var string
26
- */
27
- public $id = "components";
28
 
29
- public $page_menu_position = 0;
30
 
31
- public $page_menu_dashicon = 'dashicons-admin-plugins';
32
 
33
- public $type = 'page';
 
 
 
 
 
34
 
35
- public $show_right_sidebar_in_options = false;
36
-
37
- public $available_for_multisite = true;
38
 
39
- /**
40
- * @param WCL_Plugin $plugin
41
- */
42
- public function __construct(WCL_Plugin $plugin)
43
- {
44
- $this->menu_title = __('Components', 'clearfy');
45
- $this->page_menu_short_description = __('More features for plugin', 'clearfy');
46
 
47
- parent::__construct($plugin);
 
 
 
 
 
 
 
 
 
48
 
49
- $this->plugin = $plugin;
50
- }
51
 
52
  /**
53
- * Requests assets (js and css) for the page.
54
- *
55
- * @see FactoryPages410_AdminPage
56
  *
57
- * @since 1.0.0
58
- * @return void
59
  */
60
- public function assets($scripts, $styles)
61
- {
62
- parent::assets($scripts, $styles);
63
-
64
- $this->styles->add(WCL_PLUGIN_URL . '/admin/assets/css/components.css');
65
 
66
- /**
67
- * @param Wbcr_Factory409_ScriptList $scripts
68
- * @param Wbcr_Factory409_StyleList $styles
69
- * @since 1.4.0
70
- */
71
- do_action('wbcr/clearfy/components/page_assets', $scripts, $styles);
72
- }
73
 
74
- /**
75
- * Shows notification inside Clearfy interface
76
- */
77
- public function warningNotice()
78
- {
79
- $package_plugin = WCL_Package::instance();
80
- $package_update_notice = $package_plugin->getUpdateNotice();
81
-
82
- if( $package_update_notice ) {
83
- $this->printWarningNotice($package_update_notice);
84
- }
85
  }
 
86
 
87
 
88
- /**
89
- * We register notifications for some actions
90
- *
91
- * @see libs\factory\pages\themplates\FactoryPages410_ImpressiveThemplate
92
- * @param $notices
93
- * @param Wbcr_Factory409_Plugin $plugin
94
- * @return array
95
- */
96
- public function getActionNotices($notices)
97
- {
98
- $notices[] = array(
99
- 'conditions' => array(
100
- 'wbcr-force-update-components-success' => 1
101
- ),
102
- 'type' => 'success',
103
- 'message' => __('Components have been successfully updated to the latest version.', 'clearfy')
104
- );
105
-
106
- $notices[] = array(
107
- 'conditions' => array(
108
- 'wbcr-force-update-components-error' => 'inactive_licence'
109
- ),
110
- 'type' => 'danger',
111
- 'message' => __('To use premium components, you need activate a license!', 'clearfy') . '<a href="admin.php?page=license-wbcr_clearfy" class="btn btn-gold">' . __('Activate license', 'clearfy') . '</a>'
112
- );
113
-
114
- $notices[] = array(
115
- 'conditions' => array(
116
- 'wbcr-force-update-components-error' => 'unknown_error'
117
- ),
118
- 'type' => 'danger',
119
- 'message' => __('An unknown error occurred while updating plugin components. Please contact the plugin support team to resolve this issue.', 'hide_my_wp')
120
- );
121
-
122
- return $notices;
123
- }
124
-
125
- public function forceUpdateComponentsAction()
126
- {
127
- check_admin_referer('force_update_componetns');
128
 
129
- $licensing = WCL_Licensing::instance();
130
- $licensing->getAddons(true); // обновляем список аддонов
131
 
132
- if( !$licensing->isLicenseValid() and $licensing->isActivePaidAddons() ) {
133
- $this->redirectToAction('index', array('wbcr-force-update-components-error' => 'inactive_licence'));
134
- }
135
 
136
- $package_plugin = WCL_Package::instance();
 
 
137
 
138
- try {
139
- $result = $package_plugin->update();
140
 
141
- if( is_wp_error($result) ) {
142
- $this->redirectToAction('index', array('wbcr-force-update-components-error' => 'unknown_error'));
143
- }
144
 
145
- $this->redirectToAction('index', array('wbcr-force-update-components-success' => 1));
146
- } catch( Exception $e ) {
147
- $this->redirectToAction('index', array('wbcr-force-update-components-error' => 'unknown_error'));
148
  }
149
 
150
- $this->redirectToAction('index');
 
 
151
  }
152
 
153
- /**
154
- * This method simply sorts the list of components.
155
- *
156
- * @param $components
157
- * @return array
158
- */
159
- public function order($components)
160
- {
161
-
162
- $deactivate_components = WCL_Plugin::app()->getPopulateOption('deactive_preinstall_components', array());
163
-
164
- $ordered_components = array(
165
- 'premium_active' => array(),
166
- 'premium_deactive' => array(),
167
- 'free_active' => array(),
168
- 'free_deactive' => array(),
169
- );
170
- $order_key = 'free_deactive';
171
- foreach($components as $component) {
172
- if( in_array($component['type'], array('wordpress', 'internal')) ) {
173
- if( in_array($component['name'], $deactivate_components) ) {
174
- // free component is deactivated
175
- $order_key = 'free_deactive';
176
- } else {
177
- // free component activated
 
 
 
 
 
 
 
 
 
178
  $order_key = 'free_active';
 
 
179
  }
180
- } elseif( $component['type'] == 'freemius' ) {
181
- if( $component['is_free'] ) {
182
- // freemius free
183
- if( $component['actived'] ) {
184
- $order_key = 'free_active';
185
- } else {
186
- $order_key = 'free_deactive';
187
- }
188
  } else {
189
- // freemius premium
190
- if( $component['actived'] ) {
191
- $order_key = 'premium_active';
192
- } else {
193
- $order_key = 'premium_deactive';
194
- }
195
  }
196
  }
197
- $ordered_components[$order_key][] = $component;
198
  }
199
-
200
- return array_merge($ordered_components['premium_active'], $ordered_components['premium_deactive'], $ordered_components['free_active'], $ordered_components['free_deactive']);
201
  }
202
 
203
- /**
204
- * This method simply show contents of the component page.
205
- *
206
- * @throws Exception
207
- */
208
- public function showPageContent()
209
- {
210
- $freemius_activated_addons = WCL_Plugin::app()->getPopulateOption('freemius_activated_addons', array()); // это только для фримиус
211
-
212
- $default_image = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNjAiIGhlaWdodD0iMzYwIiB2aWV3Ym94PSIwIDAgMzYwIDM2MCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0icmdiKDcwLCA4MSwgOTMpIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjE1IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wNTQ2NjY2NjY2NjY2NjciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYwLCAwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4wNDYiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMCwgMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMDIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4MCwgMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMDU0NjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNDAsIDApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjAyODY2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzAwLCAwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4xMDY2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgNjApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjA5OCIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjAsIDYwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4xMTUzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIwLCA2MCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDYzMzMzMzMzMzMzMzMzIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxODAsIDYwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wMzczMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0MCwgNjApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iI2RkZCIgZmlsbC1vcGFjaXR5PSIwLjE0MTMzMzMzMzMzMzMzIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMDAsIDYwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wMzczMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDEyMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMDg5MzMzMzMzMzMzMzMzIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2MCwgMTIwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wODkzMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMCwgMTIwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4wODA2NjY2NjY2NjY2NjciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4MCwgMTIwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4xMzI2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQwLCAxMjApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjE1IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMDAsIDEyMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDk4IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAxODApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjA2MzMzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjAsIDE4MCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMDIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMCwgMTgwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wMzczMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4MCwgMTgwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4xMTUzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQwLCAxODApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjA2MzMzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzAwLCAxODApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iI2RkZCIgZmlsbC1vcGFjaXR5PSIwLjA1NDY2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMjQwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4xMDY2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjAsIDI0MCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMDcyIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjAsIDI0MCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMTE1MzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4MCwgMjQwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4xMzI2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQwLCAyNDApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjA4MDY2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzAwLCAyNDApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjEzMjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAzMDApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iI2RkZCIgZmlsbC1vcGFjaXR5PSIwLjAzNzMzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjAsIDMwMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMTI0IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjAsIDMwMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDI4NjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxODAsIDMwMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMDcyIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNDAsIDMwMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDI4NjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMDAsIDMwMCkiIC8+PC9zdmc+';
213
- $response = array();
214
-
215
- // Удаляется при компиляции
216
-
217
- $response = array_merge($response, array(
218
- array(
219
- 'name' => 'robin_image_optimizer',
220
- 'title' => __('Robin image optimizer', 'clearfy'),
221
- 'url' => 'https://wordpress.org/plugins/robin-image-optimizer/',
222
- 'type' => 'wordpress',
223
- 'base_path' => 'robin-image-optimizer/robin-image-optimizer.php',
224
- 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/rio-icon-128x128.png',
225
- 'description' => __('Automatic image optimization without any quality loss. No limitations, no paid plans. The best Wordpress image optimization plugin allows optimizing any amount of images for free!', 'clearfy')
226
- ),
227
- array(
228
- 'name' => 'hide_login_page',
229
- 'title' => __('Hide login page', 'clearfy'),
230
- 'url' => 'https://wordpress.org/plugins/hide-login-page/',
231
- 'type' => 'wordpress',
232
- 'base_path' => 'hide-login-page/hide-login-page.php',
233
- 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/hlp-icon-128x128.png',
234
- 'description' => __('Hide Login Page is a very light plugin that lets you easily and safely change the url of the login form page to anything you want.', 'clearfy')
235
- ),
236
- array(
237
- 'name' => 'html_minify',
238
- 'title' => __('Html minify', 'clearfy'),
239
- 'url' => '#',
240
- 'type' => 'internal',
241
- 'icon' => $default_image,
242
- 'description' => __('Ever look at the HTML markup of your website and notice how sloppy and amateurish it looks? The Minify HTML options cleans up sloppy looking markup and minifies, which also speeds up download', 'clearfy')
243
- ),
244
- array(
245
- 'name' => 'minify_and_combine',
246
- 'title' => __('Minify and combine (JS, CSS)', 'clearfy'),
247
- 'url' => '#',
248
- 'type' => 'internal',
249
- 'icon' => $default_image,
250
- 'description' => __('Improve your speed score on GTmetrix, Pingdom Tools and Google PageSpeed Insights by merging and minifying CSS, JavaScript.', 'clearfy')
251
- ),
252
- array(
253
- 'name' => 'ga_cache',
254
- 'title' => __('Google Analytics Cache', 'clearfy'),
255
- 'url' => 'https://wordpress.org/plugins/simple-google-analytics/',
256
- 'type' => 'internal',
257
- 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/gac-icon-128x128.jpg',
258
- 'description' => __('To improve Google Page Speed indicators Analytics caching is needed. However, it can also slightly increase your website loading speed, because Analytics js files will load locally.', 'clearfy')
259
- ),
260
- array(
261
- 'name' => 'updates_manager',
262
- 'title' => __('Updates manager', 'clearfy'),
263
- 'url' => 'https://wordpress.org/plugins/webcraftic-updates-manager/',
264
- 'type' => 'internal',
265
- 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/upm-icon-128x128.png',
266
- 'description' => __('Disable updates enable auto updates for themes, plugins and WordPress.', 'clearfy')
267
- ),
268
- array(
269
- 'name' => 'comments_tools',
270
- 'title' => __('Comments tools', 'clearfy'),
271
- 'url' => '#',
272
- 'type' => 'internal',
273
- 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/dic-icon-128x128.png',
274
- 'description' => __('Bulk disable and remove comments, disable “Website” field, hides external links, disable XML-RPC.', 'clearfy')
275
- ),
276
- array(
277
- 'name' => 'widget_tools',
278
- 'title' => __('Widgets tools', 'clearfy'),
279
- 'url' => '#',
280
- 'type' => 'internal',
281
- 'icon' => $default_image,
282
- 'description' => __('Disable unused widgets such as tag cloud, links, calendar etc.', 'clearfy')
283
- ),
284
- array(
285
- 'name' => 'assets_manager',
286
- 'title' => __('Asset manager', 'clearfy'),
287
- 'url' => '#',
288
- 'type' => 'internal',
289
- 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/asm-icon-128x128.png',
290
- 'description' => __('Selectively disable unused scripts and styles on the pages of your website.', 'clearfy')
291
- ),
292
- array(
293
- 'name' => 'disable_notices',
294
- 'title' => __('Disable admin notices', 'clearfy'),
295
- 'url' => '#',
296
- 'type' => 'internal',
297
- 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/dan-icon-128x128.png',
298
- 'description' => __('Disables admin notices bulk or individually. Collects notices into the admin bar.', 'clearfy')
299
- ),
300
- array(
301
- 'name' => 'adminbar_manager',
302
- 'title' => __('Admin bar manager', 'clearfy'),
303
- 'url' => '#',
304
- 'type' => 'internal',
305
- 'icon' => $default_image,
306
- 'description' => __('Disables admin bar. Allows to change and remove admin bar elements.', 'clearfy')
307
- ),
308
- array(
309
- 'name' => 'post_tools',
310
- 'title' => __('Posts tools', 'clearfy'),
311
- 'url' => '#',
312
- 'type' => 'internal',
313
- 'icon' => $default_image,
314
- 'description' => __('Disable revisions, disable posts autosave, disable smart quotes and disable auto paragraphs.', 'clearfy')
315
- ),
316
- array(
317
- 'name' => 'yoast_seo',
318
- 'title' => __('Yoast SEO optimization', 'clearfy'),
319
- 'url' => '#',
320
- 'type' => 'internal',
321
- 'icon' => $default_image,
322
- 'description' => __('Set of optimization functions for the popular Yoast SEO plugin.', 'clearfy')
323
- )
324
- ));
325
-
326
- $response[] = array(
327
- 'name' => 'cyrlitera',
328
- 'title' => __('Transliteration of Cyrillic alphabet', 'clearfy'),
329
- 'type' => 'internal',
330
- 'url' => 'https://wordpress.org/plugins/cyrlitera/',
331
- 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/ctr-icon-128x128.png',
332
- 'description' => __('Converts Cyrillic permalinks of post, pages, taxonomies and media files to the Latin alphabet. Supports Russian, Ukrainian, Georgian, Bulgarian languages.', 'clearfy')
333
- );
334
- $licensing = WCL_Licensing::instance();
335
- $freemius_addons_data = $licensing->getAddons(); // получаем все аддоны
336
-
337
- if( isset($freemius_addons_data->plugins) ) {
338
- foreach($freemius_addons_data->plugins as $freemius_addon) {
339
- $is_free_addon = false;
340
- if( $freemius_addon->free_releases_count ) {
341
- $is_free_addon = true;
342
- }
343
- $actual_version = isset($freemius_addon->info) ? $freemius_addon->info->selling_point_0 : '';
344
- if( !$actual_version ) {
345
- $actual_version = $licensing->getAddonCurrentVersion($freemius_addon->slug);
346
- }
347
- $component = array(
348
- 'name' => $freemius_addon->slug,
349
- 'slug' => $freemius_addon->slug,
350
- 'title' => __($freemius_addon->title, 'clearfy'),
351
- 'type' => 'freemius',
352
- 'installed' => false,
353
- 'is_free' => $is_free_addon,
354
- 'actived' => false,
355
- 'version' => $actual_version,
356
- 'url' => isset($freemius_addon->info) ? $freemius_addon->info->url : '#',
357
- 'icon' => isset($freemius_addon->icon) ? $freemius_addon->icon : WCL_PLUGIN_URL . '/admin/assets/img/ctr-icon-128x128.png',
358
- 'description' => isset($freemius_addon->info) ? __($freemius_addon->info->short_description, 'clearfy') : '',
359
- );
360
-
361
- if( in_array($component['name'], $freemius_activated_addons) ) {
362
- $component['actived'] = true;
363
- }
364
-
365
- array_unshift($response, $component);
366
  }
 
 
367
  }
368
-
 
369
 
370
 
371
- $components = $this->order($response);
372
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
373
  /**
374
- * @param array $components
375
  * @since 1.4.0
376
  */
377
- $components = apply_filters('wbcr/clearfy/components/items_list', $components);
378
-
379
  ?>
380
- <div class="wbcr-factory-page-group-header"><?php _e('<strong>Plugin Components</strong>.', 'clearfy') ?>
381
- <p>
382
- <?php _e('These are components of the plugin bundle. When you activate the plugin, all the components turned on by default. If you don’t need some function, you can easily turn it off on this page.', 'clearfy') ?>
383
- </p>
384
- </div>
385
 
386
- <div class="wbcr-clearfy-components">
387
- <?php foreach($components as $component): ?>
388
- <?php
 
389
 
390
- $slug = $component['name'];
 
 
391
 
392
- if( $component['type'] == 'wordpress' ) {
393
- $slug = $component['base_path'];
394
- }
395
-
396
- if( $component['type'] == 'freemius' ) {
397
- $install_button = WCL_Plugin::app()->getInstallComponentsButton($component['type'], $slug);
398
-
399
- if( !$component['actived'] ) {
400
- $status_class = ' plugin-status-deactive';
401
- } else {
402
- $status_class = ' plugin-status-active';
403
- }
404
-
405
- if( !$component['is_free'] ) {
406
- $status_class .= ' premium';
407
- }
408
  } else {
409
- $install_button = WCL_Plugin::app()->getInstallComponentsButton($component['type'], $slug);
 
410
 
411
- $status_class = '';
412
- if( !$install_button->isPluginActivate() ) {
413
- $status_class = ' plugin-status-deactive';
414
- }
415
  }
 
 
416
 
417
- $install_button->addClass('install-now');
418
-
419
- // Delete button
420
- $delete_button = WCL_Plugin::app()->getDeleteComponentsButton($component['type'], $slug);
421
- $delete_button->addClass('delete-now');
422
-
423
- ?>
424
-
425
- <div class="plugin-card<?= $status_class ?>">
426
- <?php if( $component['type'] == 'freemius' && !$component['is_free'] ): ?>
427
- <div class="premium-ribbon"><?php _e('Premium', 'clearfy') ?></div>
428
- <?php endif; ?>
429
- <div class="plugin-card-top">
430
- <div class="name column-name">
431
- <h3>
432
- <a href="<?= $component['url'] ?>" class="thickbox open-plugin-details-modal">
433
- <?= $component['title'] ?>
434
- <img src="<?= $component['icon'] ?>" class="plugin-icon" alt="">
435
- </a>
436
- </h3>
437
- </div>
438
- <div class="desc column-description">
439
- <p><?= $component['description']; ?></p>
440
- <?php // For the test, we display the current version and the current one ?>
441
- <?php if( isset($component['version']) ) : ?><p>
442
- Freemius: <?php echo $component['version']; ?>,
443
- current: <?php echo $licensing->getAddonCurrentVersion($slug); ?></p><?php endif; ?>
444
- </div>
445
- </div>
446
- <div class="plugin-card-bottom">
447
- <?php $delete_button->renderButton(); ?> <?php $install_button->renderButton(); ?>
448
- </div>
449
- </div>
450
- <?php endforeach; ?>
451
 
 
452
 
453
- <?php
454
- /**
455
- * @since 1.4.0
456
- */
457
- do_action('wbcr/clearfy/components/custom_plugins_card', $components);
458
- ?>
459
 
460
- <div class="clearfix"></div>
461
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
462
  <?php
463
- }
464
  }
 
465
 
466
 
1
  <?php
2
+ /**
3
+ * This file is the add-ons page.
4
+ *
5
+ * @author Alex Kovalev <alex@byonepress.com>
6
+ * @since 1.0.0
7
+ * @copyright (c) 2017, OnePress Ltd
8
+ *
9
+ */
10
+
11
+ // Exit if accessed directly
12
+ if ( ! defined( 'ABSPATH' ) ) {
13
+ exit;
14
+ }
15
+
16
+ class WCL_ComponentsPage extends Wbcr_FactoryClearfy206_PageBase {
17
+
18
  /**
19
+ * The id of the page in the admin menu.
20
  *
21
+ * Mainly used to navigate between pages.
 
22
  *
23
  * @since 1.0.0
24
+ * @see FactoryPages410_AdminPage
25
+ *
26
+ * @var string
27
  */
28
+ public $id = "components";
29
 
30
+ public $page_menu_position = 0;
 
 
 
31
 
32
+ public $page_menu_dashicon = 'dashicons-admin-plugins';
33
 
34
+ public $type = 'page';
 
 
 
 
 
 
 
 
 
35
 
36
+ public $show_right_sidebar_in_options = false;
37
 
38
+ public $available_for_multisite = true;
39
 
40
+ /**
41
+ * @param WCL_Plugin $plugin
42
+ */
43
+ public function __construct( WCL_Plugin $plugin ) {
44
+ $this->menu_title = __( 'Components', 'clearfy' );
45
+ $this->page_menu_short_description = __( 'More features for plugin', 'clearfy' );
46
 
47
+ parent::__construct( $plugin );
 
 
48
 
49
+ $this->plugin = $plugin;
50
+ }
 
 
 
 
 
51
 
52
+ /**
53
+ * Requests assets (js and css) for the page.
54
+ *
55
+ * @since 1.0.0
56
+ * @return void
57
+ * @see FactoryPages410_AdminPage
58
+ *
59
+ */
60
+ public function assets( $scripts, $styles ) {
61
+ parent::assets( $scripts, $styles );
62
 
63
+ $this->styles->add( WCL_PLUGIN_URL . '/admin/assets/css/components.css' );
 
64
 
65
  /**
66
+ * @since 1.4.0
 
 
67
  *
68
+ * @param Wbcr_Factory409_StyleList $styles
69
+ * @param Wbcr_Factory409_ScriptList $scripts
70
  */
71
+ do_action( 'wbcr/clearfy/components/page_assets', $scripts, $styles );
72
+ }
 
 
 
73
 
74
+ /**
75
+ * Shows notification inside Clearfy interface
76
+ */
77
+ public function warningNotice() {
78
+ $package_plugin = WCL_Package::instance();
79
+ $package_update_notice = $package_plugin->getUpdateNotice();
 
80
 
81
+ if ( $package_update_notice ) {
82
+ $this->printWarningNotice( $package_update_notice );
 
 
 
 
 
 
 
 
 
83
  }
84
+ }
85
 
86
 
87
+ /**
88
+ * We register notifications for some actions
89
+ *
90
+ * @param $notices
91
+ * @param Wbcr_Factory409_Plugin $plugin
92
+ *
93
+ * @return array
94
+ * @see libs\factory\pages\themplates\FactoryPages410_ImpressiveThemplate
95
+ */
96
+ public function getActionNotices( $notices ) {
97
+ $notices[] = [
98
+ 'conditions' => [
99
+ 'wbcr-force-update-components-success' => 1
100
+ ],
101
+ 'type' => 'success',
102
+ 'message' => __( 'Components have been successfully updated to the latest version.', 'clearfy' )
103
+ ];
104
+
105
+ $notices[] = [
106
+ 'conditions' => [
107
+ 'wbcr-force-update-components-error' => 'inactive_licence'
108
+ ],
109
+ 'type' => 'danger',
110
+ 'message' => __( 'To use premium components, you need activate a license!', 'clearfy' ) . '<a href="admin.php?page=license-wbcr_clearfy" class="btn btn-gold">' . __( 'Activate license', 'clearfy' ) . '</a>'
111
+ ];
112
+
113
+ $notices[] = [
114
+ 'conditions' => [
115
+ 'wbcr-force-update-components-error' => 'unknown_error'
116
+ ],
117
+ 'type' => 'danger',
118
+ 'message' => __( 'An unknown error occurred while updating plugin components. Please contact the plugin support team to resolve this issue.', 'hide_my_wp' )
119
+ ];
120
+
121
+ return $notices;
122
+ }
 
 
 
 
123
 
124
+ public function forceUpdateComponentsAction() {
125
+ check_admin_referer( 'force_update_componetns' );
126
 
127
+ $licensing = WCL_Licensing::instance();
128
+ $licensing->getAddons( true ); // обновляем список аддонов
 
129
 
130
+ if ( ! $licensing->isLicenseValid() and $licensing->isActivePaidAddons() ) {
131
+ $this->redirectToAction( 'index', [ 'wbcr-force-update-components-error' => 'inactive_licence' ] );
132
+ }
133
 
134
+ $package_plugin = WCL_Package::instance();
 
135
 
136
+ try {
137
+ $result = $package_plugin->update();
 
138
 
139
+ if ( is_wp_error( $result ) ) {
140
+ $this->redirectToAction( 'index', [ 'wbcr-force-update-components-error' => 'unknown_error' ] );
 
141
  }
142
 
143
+ $this->redirectToAction( 'index', [ 'wbcr-force-update-components-success' => 1 ] );
144
+ } catch( Exception $e ) {
145
+ $this->redirectToAction( 'index', [ 'wbcr-force-update-components-error' => 'unknown_error' ] );
146
  }
147
 
148
+ $this->redirectToAction( 'index' );
149
+ }
150
+
151
+ /**
152
+ * This method simply sorts the list of components.
153
+ *
154
+ * @param $components
155
+ *
156
+ * @return array
157
+ */
158
+ public function order( $components ) {
159
+
160
+ $deactivate_components = WCL_Plugin::app()->getPopulateOption( 'deactive_preinstall_components', [] );
161
+
162
+ $ordered_components = [
163
+ 'premium_active' => [],
164
+ 'premium_deactive' => [],
165
+ 'free_active' => [],
166
+ 'free_deactive' => [],
167
+ ];
168
+ $order_key = 'free_deactive';
169
+ foreach ( $components as $component ) {
170
+ if ( in_array( $component['type'], [ 'wordpress', 'internal' ] ) ) {
171
+ if ( in_array( $component['name'], $deactivate_components ) ) {
172
+ // free component is deactivated
173
+ $order_key = 'free_deactive';
174
+ } else {
175
+ // free component activated
176
+ $order_key = 'free_active';
177
+ }
178
+ } else if ( $component['type'] == 'freemius' ) {
179
+ if ( $component['is_free'] ) {
180
+ // freemius free
181
+ if ( $component['actived'] ) {
182
  $order_key = 'free_active';
183
+ } else {
184
+ $order_key = 'free_deactive';
185
  }
186
+ } else {
187
+ // freemius premium
188
+ if ( $component['actived'] ) {
189
+ $order_key = 'premium_active';
 
 
 
 
190
  } else {
191
+ $order_key = 'premium_deactive';
 
 
 
 
 
192
  }
193
  }
 
194
  }
195
+ $ordered_components[ $order_key ][] = $component;
 
196
  }
197
 
198
+ return array_merge( $ordered_components['premium_active'], $ordered_components['premium_deactive'], $ordered_components['free_active'], $ordered_components['free_deactive'] );
199
+ }
200
+
201
+ /**
202
+ * This method simply show contents of the component page.
203
+ *
204
+ * @throws Exception
205
+ */
206
+ public function showPageContent() {
207
+ $freemius_activated_addons = WCL_Plugin::app()->getPopulateOption( 'freemius_activated_addons', [] ); // это только для фримиус
208
+
209
+ $default_image = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNjAiIGhlaWdodD0iMzYwIiB2aWV3Ym94PSIwIDAgMzYwIDM2MCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0icmdiKDcwLCA4MSwgOTMpIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjE1IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wNTQ2NjY2NjY2NjY2NjciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYwLCAwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4wNDYiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMCwgMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMDIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4MCwgMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMDU0NjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNDAsIDApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjAyODY2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzAwLCAwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4xMDY2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgNjApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjA5OCIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjAsIDYwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4xMTUzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIwLCA2MCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDYzMzMzMzMzMzMzMzMzIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxODAsIDYwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wMzczMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0MCwgNjApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iI2RkZCIgZmlsbC1vcGFjaXR5PSIwLjE0MTMzMzMzMzMzMzMzIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMDAsIDYwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wMzczMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDEyMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMDg5MzMzMzMzMzMzMzMzIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2MCwgMTIwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wODkzMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMCwgMTIwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4wODA2NjY2NjY2NjY2NjciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4MCwgMTIwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4xMzI2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQwLCAxMjApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjE1IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMDAsIDEyMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDk4IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAxODApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjA2MzMzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjAsIDE4MCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMDIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMCwgMTgwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wMzczMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4MCwgMTgwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4xMTUzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQwLCAxODApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjA2MzMzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzAwLCAxODApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iI2RkZCIgZmlsbC1vcGFjaXR5PSIwLjA1NDY2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMjQwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4xMDY2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjAsIDI0MCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMDcyIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjAsIDI0MCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMTE1MzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4MCwgMjQwKSIgLz48cG9seWxpbmUgcG9pbnRzPSIxOS44LDAsNDAuMiwwLDYwLDE5LjgsNjAsNDAuMiw0MC4yLDYwLDE5LjgsNjAsMCw0MC4yLDAsMTkuOCwxOS44LDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4xMzI2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQwLCAyNDApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjA4MDY2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzAwLCAyNDApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjEzMjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAzMDApIiAvPjxwb2x5bGluZSBwb2ludHM9IjE5LjgsMCw0MC4yLDAsNjAsMTkuOCw2MCw0MC4yLDQwLjIsNjAsMTkuOCw2MCwwLDQwLjIsMCwxOS44LDE5LjgsMCIgZmlsbD0iI2RkZCIgZmlsbC1vcGFjaXR5PSIwLjAzNzMzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjAsIDMwMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMTI0IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjAsIDMwMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDI4NjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxODAsIDMwMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMDcyIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNDAsIDMwMCkiIC8+PHBvbHlsaW5lIHBvaW50cz0iMTkuOCwwLDQwLjIsMCw2MCwxOS44LDYwLDQwLjIsNDAuMiw2MCwxOS44LDYwLDAsNDAuMiwwLDE5LjgsMTkuOCwwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDI4NjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMDAsIDMwMCkiIC8+PC9zdmc+';
210
+ $response = [];
211
+
212
+ // Удаляется при компиляции
213
+
214
+ $response = array_merge( $response, [
215
+ [
216
+ 'name' => 'robin_image_optimizer',
217
+ 'title' => __( 'Robin image optimizer', 'clearfy' ),
218
+ 'url' => 'https://wordpress.org/plugins/robin-image-optimizer/',
219
+ 'type' => 'wordpress',
220
+ 'base_path' => 'robin-image-optimizer/robin-image-optimizer.php',
221
+ 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/rio-icon-128x128.png',
222
+ 'description' => __( 'Automatic image optimization without any quality loss. No limitations, no paid plans. The best Wordpress image optimization plugin allows optimizing any amount of images for free!', 'clearfy' )
223
+ ],
224
+ [
225
+ 'name' => 'hide_login_page',
226
+ 'title' => __( 'Hide login page', 'clearfy' ),
227
+ 'url' => 'https://wordpress.org/plugins/hide-login-page/',
228
+ 'type' => 'wordpress',
229
+ 'base_path' => 'hide-login-page/hide-login-page.php',
230
+ 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/hlp-icon-128x128.png',
231
+ 'description' => __( 'Hide Login Page is a very light plugin that lets you easily and safely change the url of the login form page to anything you want.', 'clearfy' )
232
+ ],
233
+ [
234
+ 'name' => 'html_minify',
235
+ 'title' => __( 'Html minify', 'clearfy' ),
236
+ 'url' => '#',
237
+ 'type' => 'internal',
238
+ 'icon' => $default_image,
239
+ 'description' => __( 'Ever look at the HTML markup of your website and notice how sloppy and amateurish it looks? The Minify HTML options cleans up sloppy looking markup and minifies, which also speeds up download', 'clearfy' )
240
+ ],
241
+ [
242
+ 'name' => 'minify_and_combine',
243
+ 'title' => __( 'Minify and combine (JS, CSS)', 'clearfy' ),
244
+ 'url' => '#',
245
+ 'type' => 'internal',
246
+ 'icon' => $default_image,
247
+ 'description' => __( 'Improve your speed score on GTmetrix, Pingdom Tools and Google PageSpeed Insights by merging and minifying CSS, JavaScript.', 'clearfy' )
248
+ ],
249
+ [
250
+ 'name' => 'ga_cache',
251
+ 'title' => __( 'Google Analytics Cache', 'clearfy' ),
252
+ 'url' => 'https://wordpress.org/plugins/simple-google-analytics/',
253
+ 'type' => 'internal',
254
+ 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/gac-icon-128x128.jpg',
255
+ 'description' => __( 'To improve Google Page Speed indicators Analytics caching is needed. However, it can also slightly increase your website loading speed, because Analytics js files will load locally.', 'clearfy' )
256
+ ],
257
+ [
258
+ 'name' => 'updates_manager',
259
+ 'title' => __( 'Updates manager', 'clearfy' ),
260
+ 'url' => 'https://wordpress.org/plugins/webcraftic-updates-manager/',
261
+ 'type' => 'internal',
262
+ 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/upm-icon-128x128.png',
263
+ 'description' => __( 'Disable updates enable auto updates for themes, plugins and WordPress.', 'clearfy' )
264
+ ],
265
+ [
266
+ 'name' => 'comments_tools',
267
+ 'title' => __( 'Comments tools', 'clearfy' ),
268
+ 'url' => '#',
269
+ 'type' => 'internal',
270
+ 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/dic-icon-128x128.png',
271
+ 'description' => __( 'Bulk disable and remove comments, disable “Website” field, hides external links, disable XML-RPC.', 'clearfy' )
272
+ ],
273
+ [
274
+ 'name' => 'widget_tools',
275
+ 'title' => __( 'Widgets tools', 'clearfy' ),
276
+ 'url' => '#',
277
+ 'type' => 'internal',
278
+ 'icon' => $default_image,
279
+ 'description' => __( 'Disable unused widgets such as tag cloud, links, calendar etc.', 'clearfy' )
280
+ ],
281
+ [
282
+ 'name' => 'assets_manager',
283
+ 'title' => __( 'Asset manager', 'clearfy' ),
284
+ 'url' => '#',
285
+ 'type' => 'internal',
286
+ 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/asm-icon-128x128.png',
287
+ 'description' => __( 'Selectively disable unused scripts and styles on the pages of your website.', 'clearfy' )
288
+ ],
289
+ [
290
+ 'name' => 'disable_notices',
291
+ 'title' => __( 'Disable admin notices', 'clearfy' ),
292
+ 'url' => '#',
293
+ 'type' => 'internal',
294
+ 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/dan-icon-128x128.png',
295
+ 'description' => __( 'Disables admin notices bulk or individually. Collects notices into the admin bar.', 'clearfy' )
296
+ ],
297
+ [
298
+ 'name' => 'adminbar_manager',
299
+ 'title' => __( 'Admin bar manager', 'clearfy' ),
300
+ 'url' => '#',
301
+ 'type' => 'internal',
302
+ 'icon' => $default_image,
303
+ 'description' => __( 'Disables admin bar. Allows to change and remove admin bar elements.', 'clearfy' )
304
+ ],
305
+ [
306
+ 'name' => 'yoast_seo',
307
+ 'title' => __( 'Yoast SEO optimization', 'clearfy' ),
308
+ 'url' => '#',
309
+ 'type' => 'internal',
310
+ 'icon' => $default_image,
311
+ 'description' => __( 'Set of optimization functions for the popular Yoast SEO plugin.', 'clearfy' )
312
+ ]
313
+ ] );
314
+
315
+ $response[] = [
316
+ 'name' => 'cyrlitera',
317
+ 'title' => __( 'Transliteration of Cyrillic alphabet', 'clearfy' ),
318
+ 'type' => 'internal',
319
+ 'url' => 'https://wordpress.org/plugins/cyrlitera/',
320
+ 'icon' => WCL_PLUGIN_URL . '/admin/assets/img/ctr-icon-128x128.png',
321
+ 'description' => __( 'Converts Cyrillic permalinks of post, pages, taxonomies and media files to the Latin alphabet. Supports Russian, Ukrainian, Georgian, Bulgarian languages.', 'clearfy' )
322
+ ];
323
+ $licensing = WCL_Licensing::instance();
324
+ $freemius_addons_data = $licensing->getAddons(); // получаем все аддоны
325
+
326
+ if ( isset( $freemius_addons_data->plugins ) ) {
327
+ foreach ( $freemius_addons_data->plugins as $freemius_addon ) {
328
+ $is_free_addon = false;
329
+ if ( $freemius_addon->free_releases_count ) {
330
+ $is_free_addon = true;
331
+ }
332
+ $actual_version = isset( $freemius_addon->info ) ? $freemius_addon->info->selling_point_0 : '';
333
+ if ( ! $actual_version ) {
334
+ $actual_version = $licensing->getAddonCurrentVersion( $freemius_addon->slug );
335
+ }
336
+ $component = [
337
+ 'name' => $freemius_addon->slug,
338
+ 'slug' => $freemius_addon->slug,
339
+ 'title' => __( $freemius_addon->title, 'clearfy' ),
340
+ 'type' => 'freemius',
341
+ 'installed' => false,
342
+ 'is_free' => $is_free_addon,
343
+ 'actived' => false,
344
+ 'version' => $actual_version,
345
+ 'url' => isset( $freemius_addon->info ) ? $freemius_addon->info->url : '#',
346
+ 'icon' => isset( $freemius_addon->icon ) ? $freemius_addon->icon : WCL_PLUGIN_URL . '/admin/assets/img/ctr-icon-128x128.png',
347
+ 'description' => isset( $freemius_addon->info ) ? __( $freemius_addon->info->short_description, 'clearfy' ) : '',
348
+ ];
349
+
350
+ if ( in_array( $component['name'], $freemius_activated_addons ) ) {
351
+ $component['actived'] = true;
 
 
 
 
 
 
 
 
 
352
  }
353
+
354
+ array_unshift( $response, $component );
355
  }
356
+ }
357
+
358
 
359
 
360
+ $components = $this->order( $response );
361
 
362
+ /**
363
+ * @since 1.4.0
364
+ *
365
+ * @param array $components
366
+ */
367
+ $components = apply_filters( 'wbcr/clearfy/components/items_list', $components );
368
+
369
+ ?>
370
+ <div class="wbcr-factory-page-group-header"><?php _e( '<strong>Plugin Components</strong>.', 'clearfy' ) ?>
371
+ <p>
372
+ <?php _e( 'These are components of the plugin bundle. When you activate the plugin, all the components turned on by default. If you don’t need some function, you can easily turn it off on this page.', 'clearfy' ) ?>
373
+ </p>
374
+ </div>
375
+ <div class="wbcr-clearfy-components">
376
+ <?php
377
  /**
 
378
  * @since 1.4.0
379
  */
380
+ do_action( 'wbcr/clearfy/components/custom_plugins_card', $components );
 
381
  ?>
 
 
 
 
 
382
 
383
+ <?php foreach ( $components as $component ): ?>
384
+ <?php
385
+
386
+ $slug = $component['name'];
387
 
388
+ if ( $component['type'] == 'wordpress' ) {
389
+ $slug = $component['base_path'];
390
+ }
391
 
392
+ if ( $component['type'] == 'freemius' ) {
393
+ $install_button = WCL_Plugin::app()->getInstallComponentsButton( $component['type'], $slug );
394
+
395
+ if ( ! $component['actived'] ) {
396
+ $status_class = ' plugin-status-deactive';
 
 
 
 
 
 
 
 
 
 
 
397
  } else {
398
+ $status_class = ' plugin-status-active';
399
+ }
400
 
401
+ if ( ! $component['is_free'] ) {
402
+ $status_class .= ' premium';
 
 
403
  }
404
+ } else {
405
+ $install_button = WCL_Plugin::app()->getInstallComponentsButton( $component['type'], $slug );
406
 
407
+ $status_class = '';
408
+ if ( ! $install_button->isPluginActivate() ) {
409
+ $status_class = ' plugin-status-deactive';
410
+ }
411
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
412
 
413
+ $install_button->addClass( 'install-now' );
414
 
415
+ // Delete button
416
+ $delete_button = WCL_Plugin::app()->getDeleteComponentsButton( $component['type'], $slug );
417
+ $delete_button->addClass( 'delete-now' );
 
 
 
418
 
419
+ ?>
420
+ <div class="plugin-card<?= $status_class ?>">
421
+ <?php if ( $component['type'] == 'freemius' && ! $component['is_free'] ): ?>
422
+ <div class="premium-ribbon"><?php _e( 'Premium', 'clearfy' ) ?></div>
423
+ <?php endif; ?>
424
+ <div class="plugin-card-top">
425
+ <div class="name column-name">
426
+ <h3>
427
+ <a href="<?= $component['url'] ?>" class="thickbox open-plugin-details-modal">
428
+ <?= $component['title'] ?>
429
+ <img src="<?= $component['icon'] ?>" class="plugin-icon" alt="">
430
+ </a>
431
+ </h3>
432
+ </div>
433
+ <div class="desc column-description">
434
+ <p><?= $component['description']; ?></p>
435
+ <?php // For the test, we display the current version and the current one ?>
436
+ <?php if ( isset( $component['version'] ) ) : ?><p>
437
+ Freemius: <?php echo $component['version']; ?>,
438
+ current: <?php echo $licensing->getAddonCurrentVersion( $slug ); ?></p><?php endif; ?>
439
+ </div>
440
+ </div>
441
+ <div class="plugin-card-bottom">
442
+ <?php $delete_button->renderButton(); ?><?php $install_button->renderButton(); ?>
443
+ </div>
444
+ </div>
445
+ <?php endforeach; ?>
446
+ <div class="clearfix"></div>
447
+ </div>
448
  <?php
 
449
  }
450
+ }
451
 
452
 
admin/pages/defence.php CHANGED
@@ -123,58 +123,7 @@ class WCL_DefencePage extends Wbcr_FactoryClearfy206_PageBase {
123
  'hint' => __( 'Allows attacker to learn the version of WP installed on the site. This meta tag has no useful function.', 'clearfy' ) . '<br><b>Clearfy: </b>' . sprintf( __( 'Removes the meta tag from the %s section', 'clearfy' ), '&lt;head&gt;' ),
124
  'default' => false
125
  );
126
-
127
- $options[] = array(
128
- 'type' => 'html',
129
- 'html' => '<div class="wbcr-clearfy-group-header">' . '<strong>' . __( 'Remove query strings from static resources', 'clearfy' ) . '</strong>' . '<p>' . __( 'This funcitons will remove query strings from static resources like CSS & JS files inside the HTML <head> element to improve your speed scores in services like Pingdom, GTmetrix, PageSpeed and YSlow.', 'clearfy' ) . '</p>' . '</div>'
130
- );
131
-
132
- $options[] = array(
133
- 'type' => 'checkbox',
134
- 'way' => 'buttons',
135
- 'name' => 'remove_js_version',
136
- 'title' => __( 'Remove Version from Script', 'clearfy' ) . ' <span class="wbcr-clearfy-recomended-text">(' . __( 'Recommended', 'clearfy' ) . ')</span>',
137
- 'layout' => array( 'hint-type' => 'icon' ),
138
- 'hint' => __( 'To make it more difficult for others to hack your website you can remove the WordPress version number from your site, your css and js. Without that number it\'s not possible to see if you run not the current version to exploit bugs from the older versions. <br><br>
139
- Additionally it can improve the loading speed of your site, because without query strings in the URL the css and js files can be cached.', 'clearfy' ) . '<br><br><b>Clearfy: </b>' . __( 'Removes wordpress version number from scripts (not logged in user only).', 'clearfy' ),
140
- 'default' => false
141
- );
142
-
143
- $options[] = array(
144
- 'type' => 'checkbox',
145
- 'way' => 'buttons',
146
- 'name' => 'remove_style_version',
147
- 'title' => __( 'Remove Version from Stylesheet', 'clearfy' ) . ' <span class="wbcr-clearfy-recomended-text">(' . __( 'Recommended', 'clearfy' ) . ')</span>',
148
- 'layout' => array( 'hint-type' => 'icon' ),
149
- 'hint' => __( 'To make it more difficult for others to hack your website you can remove the WordPress version number from your site, your css and js. Without that number it\'s not possible to see if you run not the current version to exploit bugs from the older versions. <br><br>
150
- Additionally it can improve the loading speed of your site, because without query strings in the URL the css and js files can be cached.', 'clearfy' ) . '<br><br><b>Clearfy: </b>' . __( 'Removes the wordpress version number from stylesheets (not logged in user only).', 'clearfy' ),
151
- 'default' => false
152
- /*'eventsOn' => array(
153
- 'show' => '.factory-control-disable_remove_style_version_for_auth_users'
154
- ),
155
- 'eventsOff' => array(
156
- 'hide' => '.factory-control-disable_remove_style_version_for_auth_users'
157
- )*/
158
- );
159
-
160
- $options[] = array(
161
- 'type' => 'checkbox',
162
- 'way' => 'buttons',
163
- 'name' => 'disable_remove_style_version_for_auth_users',
164
- 'title' => __( 'Disable remove versions for auth users', 'clearfy' ) . ' <span class="wbcr-clearfy-recomended-text">(' . __( 'Recommended', 'clearfy' ) . ')</span>',
165
- 'layout' => array( 'hint-type' => 'icon' ),
166
- 'default' => false
167
- );
168
-
169
- $options[] = array(
170
- 'type' => 'textarea',
171
- 'name' => 'remove_version_exclude',
172
- 'height' => '120',
173
- 'title' => __( 'Exclude stylesheet/script file names', 'clearfy' ),
174
- 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
175
- 'hint' => __( 'Enter Stylesheet/Script file names to exclude from version removal (each exclude file starts with a new line)', 'clearfy' ) . '<br><br><b>' . __( 'Example', 'clearfy' ) . ':</b>' . ' http://testwp.dev/wp-includes/js/jquery/jquery.js',
176
- );
177
-
178
  $form_options = array();
179
 
180
  $form_options[] = array(
123
  'hint' => __( 'Allows attacker to learn the version of WP installed on the site. This meta tag has no useful function.', 'clearfy' ) . '<br><b>Clearfy: </b>' . sprintf( __( 'Removes the meta tag from the %s section', 'clearfy' ), '&lt;head&gt;' ),
124
  'default' => false
125
  );
126
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  $form_options = array();
128
 
129
  $form_options[] = array(
admin/pages/performance.php CHANGED
@@ -1,284 +1,490 @@
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  /**
3
- * The page Settings.
 
 
4
  *
5
  * @since 1.0.0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  */
 
 
 
7
 
8
- // Exit if accessed directly
9
- if( !defined('ABSPATH') ) {
10
- exit;
11
  }
12
 
13
- class WCL_PerformancePage extends Wbcr_FactoryClearfy206_PageBase {
14
-
15
- /**
16
- * The id of the page in the admin menu.
17
- *
18
- * Mainly used to navigate between pages.
19
- * @see FactoryPages410_AdminPage
20
- *
21
- * @since 1.0.0
22
- * @var string
23
- */
24
- public $id = "performance";
25
-
26
- /**
27
- * @var string
28
- */
29
- public $page_menu_dashicon = 'dashicons-performance';
30
-
31
- /**
32
- * @var int
33
- */
34
- public $page_menu_position = 20;
35
-
36
- public $available_for_multisite = true;
37
-
38
- /**
39
- * @param WCL_Plugin $plugin
40
- */
41
- public function __construct(WCL_Plugin $plugin)
42
- {
43
- $this->menu_title = __('Performance', 'clearfy');
44
- $this->page_menu_short_description = __('Optimization js, css, fonts', 'clearfy');
45
-
46
- parent::__construct($plugin);
47
-
48
- $this->plugin = $plugin;
49
  }
 
50
 
51
- public function afterFormSave()
52
- {
53
- if( $this->getPopulateOption('disable_gravatars') ) {
54
- update_option('show_avatars', false);
55
- } else {
56
- update_option('show_avatars', true);
57
- }
58
  }
 
59
 
60
- /**
61
- * Permalinks options.
62
- *
63
- * @since 1.0.0
64
- * @return mixed[]
65
- */
66
- public function getPageOptions()
67
- {
68
- $options = array();
69
-
70
- $options[] = array(
71
- 'type' => 'html',
72
- 'html' => '<div class="wbcr-factory-page-group-header">' . __('<strong>Clear the unnecessary scripts</strong>', 'clearfy') . '<p>' . __('This set of settings will help you remove unnecessary links and code from the head section, as well as reduce your website\'s pages weight.', 'clearfy') . '</p></div>'
73
- );
74
-
75
- $options[] = array(
76
- 'type' => 'checkbox',
77
- 'way' => 'buttons',
78
- 'name' => 'disable_feed',
79
- 'title' => __('Disable RSS feeds', 'clearfy'),
80
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
81
- 'hint' => __('By default, WordPress generates all types of different RSS feeds for your site. While RSS feeds can be useful if you are running a blog, businesses might not always utilize these. Not every site out there has a blog.', 'clearfy') . '<br><b>Clearfy: </b>' . sprintf(__('Removes a link to the RSS-feed from the %s section, closes and puts the redirect from all RSS-feeds.', 'clearfy'), '&lt;head&gt;'),
82
- 'default' => false,
83
- 'eventsOn' => array(
84
- 'show' => '.factory-control-disabled_feed_behaviour'
85
- ),
86
- 'eventsOff' => array(
87
- 'hide' => '.factory-control-disabled_feed_behaviour'
88
- )
89
- );
90
-
91
- $options[] = array(
92
- 'type' => 'dropdown',
93
- 'way' => 'buttons',
94
- 'name' => 'disabled_feed_behaviour',
95
- 'data' => array(
96
- array('redirect_301', __('Redirect 301', 'clearfy')),
97
- array('redirect_404', __('Page 404', 'clearfy')),
98
- ),
99
- 'title' => __('Redirect feed requests', 'clearfy'),
100
- 'hint' => __('Forward all requests to page 404 or to the main page through 301 redirects.', 'clearfy'),
101
- //'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
102
- 'default' => 'redirect_301'
103
- );
104
-
105
- $options[] = array(
106
- 'type' => 'checkbox',
107
- 'way' => 'buttons',
108
- 'name' => 'disable_json_rest_api',
109
- 'title' => __('Remove REST API Links', 'clearfy'),
110
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'red'),
111
- 'hint' => __('The WordPress REST API provides API endpoints for WordPress data types that allow developers to interact with sites remotely by sending and receiving JSON (JavaScript Object Notation) objects. However, a lot of sites don’t use this, and therefore in most cases, it is just unnecessary code.', 'clearfy') . '<br><br><b>Clearfy: </b>' . __('Removes REST API link tag from the front end and the REST API header link from page requests.', 'clearfy'),
112
- 'default' => false,
113
- 'eventsOn' => array(
114
- 'show' => '#wbcr-clearfy-rest-api-danger-message'
115
- ),
116
- 'eventsOff' => array(
117
- 'hide' => '#wbcr-clearfy-rest-api-danger-message'
118
- )
119
- );
120
-
121
- $options[] = array(
122
- 'type' => 'html',
123
- 'html' => array( $this, 'restApiDangerMessage' )
124
- );
125
-
126
- $options[] = array(
127
- 'type' => 'checkbox',
128
- 'way' => 'buttons',
129
- 'name' => 'disable_emoji',
130
- 'title' => __('Disable Emojis', 'clearfy'),
131
- 'layout' => array('hint-type' => 'icon'),
132
- 'hint' => __('Emojis are fun and all, but if you are aren’t using them they actually load a JavaScript file (wp-emoji-release.min.js) on every page of your website. For a lot of businesses, this is not needed and simply adds load time to your site. So we recommend disabling this.', 'clearfy') . '<br><br><b>Clearfy: </b>' . __('Removes WordPress Emojis JavaScript file (wp-emoji-release.min.js).', 'clearfy'),
133
- 'default' => false
134
- );
135
-
136
- $options[] = array(
137
- 'type' => 'checkbox',
138
- 'way' => 'buttons',
139
- 'name' => 'remove_jquery_migrate',
140
- 'title' => __('Remove jQuery Migrate', 'clearfy'),
141
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'red'),
142
- 'hint' => __('They started adding jQuery migrate in WordPress 3.6. Most up-to-date frontend code and plugins don’t require jquery-migrate.min.js. In most cases, this simply adds unnecessary load to your site. You can see this running if you launch Chrome Devtools console.', 'clearfy') . '<br><br><b>Clearfy: </b>' . __('Removes jQuery Migrate JavaScript file (jquery-migrate.min.js).', 'clearfy') . '<br>--<br><span class="wbcr-factory-light-orange-color">' . __('Warning! If there is a broke on your site, disable this option!', 'clearfy') . '</span>',
143
- 'default' => false
144
- );
145
-
146
- $options[] = array(
147
- 'type' => 'checkbox',
148
- 'way' => 'buttons',
149
- 'name' => 'disable_embeds',
150
- 'title' => __('Disable Embeds', 'clearfy'),
151
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
152
- 'hint' => __('Embeds were released with WordPress 4.4. This is basically the magic that auto converts your YouTube videos, Tweets, and URLs into pretty previews while you are editing. However, this actually loads a JavaScript file (wp-embed.min.js) on every page of your website. If you don’t care about the auto converting preview (which we don’t), you can disable this across your site.', 'clearfy') . '<br><br><b>Clearfy: </b>' . __('Removes WordPress Embed JavaScript file (wp-embed.min.js)', 'clearfy'),
153
- 'default' => false
154
- );
155
-
156
- /*$options[] = array(
157
- 'type' => 'checkbox',
158
- 'way' => 'buttons',
159
- 'name' => 'remove_dns_prefetch',
160
- 'title' => __('Remove dns-prefetch', 'clearfy'),
161
- 'layout' => array('hint-type' => 'icon'),
162
- 'hint' => sprintf(__('Since version 4.6.1 in WordPress there are new links in the section %s this type of: ', 'clearfy'), 'head') . ' <code>link rel="dns-prefetch" href="//s.w.org"</code><br><br><b>Clearfy: </b>' . sprintf(__('Removes dns-prefetch links from the %s section', 'clearfy'), 'head'),
163
- 'default' => false
164
- );*/
165
- $options[] = array(
166
- 'type' => 'checkbox',
167
- 'way' => 'buttons',
168
- 'name' => 'remove_rsd_link',
169
- 'title' => __('Remove RSD Link', 'clearfy'),
170
- 'layout' => array('hint-type' => 'icon'),
171
- 'hint' => __('The above link is used by blog clients. If you edit your site from your browser then you don’t need this. It is also used by some 3rd party applications that utilize XML-RPC requests. In most cases, this is just unnecessary code.', 'clearfy') . '<br><code>link rel="EditURI" type="application/rsd+xml" title="RSD"</code><br><br><b>Clearfy: </b>' . __('Remove RSD (Real Simple Discovery) link tag.', 'clearfy'),
172
- 'default' => false
173
- );
174
- $options[] = array(
175
- 'type' => 'checkbox',
176
- 'way' => 'buttons',
177
- 'name' => 'remove_xfn_link',
178
- 'title' => __('Removing XFN (XHTML Friends Network) Profile Link', 'clearfy'),
179
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
180
- 'hint' => __('The profile attribute specifies the metadata profile address. Usually, the browser recognizes the value of this attribute and executes some conventions related to the specified profile. Loading the document itself at the specified address does not really happen, moreover, it may not exist at all.
181
  In particular, the profile is used for the XFN microformat (XHTML Friends Network) - a way of representing relationships between people using links and rel attributes with different values. WordPress also actively uses profile in its templates.
182
- ', 'clearfy') . '<br><br><b>Clearfy: </b>' . __('Remove link tag', 'clearfy') . '<br><code>link rel="profile" href="http://gmpg.org/xfn/11"</code>',
183
- 'default' => false
184
- );
185
-
186
- $options[] = array(
187
- 'type' => 'checkbox',
188
- 'way' => 'buttons',
189
- 'name' => 'remove_wlw_link',
190
- 'title' => __('Remove wlwmanifest Link', 'clearfy'),
191
- 'layout' => array('hint-type' => 'icon'),
192
- 'hint' => '<code>link rel="wlwmanifest" type="application/wlwmanifest+xml"</code><br>' . __('This link is actually used by Windows Live Writer. If you don’t know use Windows Live Writer, which we are guessing you don’t, this is just unnecessary code.', 'clearfy') . '<br><br><b>Clearfy: </b>' . __('Remove wlwmanifest (Windows Live Writer) link tag.', 'clearfy'),
193
- 'default' => false
194
- );
195
-
196
- $options[] = array(
197
- 'type' => 'checkbox',
198
- 'way' => 'buttons',
199
- 'name' => 'remove_shortlink_link',
200
- 'title' => __('Remove Shortlink', 'clearfy'),
201
- 'layout' => array('hint-type' => 'icon'),
202
- 'hint' => sprintf(__('By default, the following tag shows up in every WordPress install. %s This is used for a shortlink to your pages and posts. However, if you are already using pretty permalinks, such as domain.com/post, then there is no reason to keep this, it is just unnecessary code.', 'clearfy'), '<br><code>link rel="shortlink" href="https://domain.com?p=712"</code><br>') . '<br><br><b>Clearfy: </b>' . __('Remove Shortlink link tag.', 'clearfy'),
203
- 'default' => false
204
- );
205
-
206
- $options[] = array(
207
- 'type' => 'checkbox',
208
- 'way' => 'buttons',
209
- 'name' => 'remove_adjacent_posts_link',
210
- 'title' => __('Remove links to previous, next post', 'clearfy'),
211
- 'layout' => array('hint-type' => 'icon'),
212
- 'hint' => __('If you use Wordpress as a CMS, then you can delete these links, they can only come in handy for a blog.', 'clearfy') . '<br><br><b>Clearfy: </b>' . __('Remove the previous and next post links within the wp_head of your wordpress theme.', 'clearfy'),
213
- 'default' => false
214
- );
215
-
216
- $options[] = array(
217
- 'type' => 'checkbox',
218
- 'way' => 'buttons',
219
- 'name' => 'remove_recent_comments_style',
220
- 'title' => __('Remove .recentcomments styles', 'clearfy'),
221
- 'layout' => array('hint-type' => 'icon'),
222
- 'hint' => __('WP by default for the widget "recent comments" prescribes in the code styles that are almost impossible to change, because to them apply! important.', 'clearfy') . '<br><br><b>Clearfy: </b>' . __('Removes .recentcomments styles from head section.', 'clearfy'),
223
- 'default' => false
224
- );
225
-
226
- $options[] = array(
227
- 'type' => 'checkbox',
228
- 'way' => 'buttons',
229
- 'name' => 'lazy_load_font_awesome',
230
- 'title' => __('Font Awesome asynchronous', 'clearfy'),
231
- 'layout' => array('hint-type' => 'icon'),
232
- 'hint' => __('By default, WordPress loads Font Awesome icons synchronously, that is, your page will not be fully loaded until Font Awesome icons are loaded. This algorithm slows down the loading of your page and leads to errors when checking the site in Google Page Speed. Using this option, your Font Awesome icons will be loaded after your page is fully loaded. This method has a negative — you and visitors of your site will see changes while loading a page, from the placeholders to icons.', 'clearfy'),
233
- 'default' => false
234
- );
235
-
236
- $options[] = array(
237
- 'type' => 'checkbox',
238
- 'way' => 'buttons',
239
- 'name' => 'disable_dashicons',
240
- 'title' => __('Disable Dashicons', 'clearfy'),
241
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
242
- 'hint' => __('Dashicons is the official icon font of the WordPress admin as of 3.8. Some of you have requested that we add a feature to remove Dashicons. Some themes and developers utilize this (dashicons.min.css) on the front-end of their sites.', 'clearfy'),
243
- 'default' => false
244
- );
245
-
246
- $options[] = array(
247
- 'type' => 'checkbox',
248
- 'way' => 'buttons',
249
- 'name' => 'disable_gravatars',
250
- 'title' => __('Disable gravatars', 'clearfy'),
251
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
252
- 'hint' => __('This function that prevents the user’s gravatar being automatically obtained from gravatar.com based on their registered email. This would be useful for sites where users require an extra layer of privacy, or if you just want to prevent potentially silly or embarrasing avatar accidents.
253
  If you’re using Identicons or any other generated default avatar, the user should keep a consistent avatar unless they change their registered email.
254
- ', 'clearfy'),
255
- 'default' => false
256
- );
257
 
258
- $form_options = array();
 
 
 
259
 
260
- $form_options[] = array(
261
- 'type' => 'form-group',
262
- 'items' => $options,
263
- //'cssClass' => 'postbox'
264
- );
 
 
 
 
 
 
 
 
265
 
266
- return apply_filters('wbcr_clr_code_clean_form_options', $form_options, $this);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
267
  }
268
-
269
- /**
270
- * Adds an html warning notification html markup.
271
- */
272
- public function restApiDangerMessage() {
273
- ?>
274
- <div class="form-group">
275
- <label class="col-sm-4 control-label"></label>
276
- <div class="control-group col-sm-8">
277
- <div id="wbcr-clearfy-rest-api-danger-message" class="wbcr-clearfy-danger-message">
278
- <?php _e( '<b>Use this option carefully!</b><br> Plugins like Contact form 7 may have problems using this option.', 'clearfy' ) ?>
279
- </div>
280
- </div>
281
- </div>
282
- <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
283
  }
 
 
284
  }
 
1
  <?php
2
+ /**
3
+ * The page Settings.
4
+ *
5
+ * @since 1.0.0
6
+ */
7
+
8
+ // Exit if accessed directly
9
+ if ( ! defined( 'ABSPATH' ) ) {
10
+ exit;
11
+ }
12
+
13
+ class WCL_PerformancePage extends Wbcr_FactoryClearfy206_PageBase {
14
+
15
  /**
16
+ * The id of the page in the admin menu.
17
+ *
18
+ * Mainly used to navigate between pages.
19
  *
20
  * @since 1.0.0
21
+ * @see FactoryPages410_AdminPage
22
+ *
23
+ * @var string
24
+ */
25
+ public $id = "performance";
26
+
27
+ /**
28
+ * @var string
29
+ */
30
+ public $page_menu_dashicon = 'dashicons-performance';
31
+
32
+ /**
33
+ * @var int
34
+ */
35
+ public $page_menu_position = 20;
36
+
37
+ public $available_for_multisite = true;
38
+
39
+ /**
40
+ * @param WCL_Plugin $plugin
41
  */
42
+ public function __construct( WCL_Plugin $plugin ) {
43
+ $this->menu_title = __( 'Performance', 'clearfy' );
44
+ $this->page_menu_short_description = __( 'Optimization js, css, fonts', 'clearfy' );
45
 
46
+ parent::__construct( $plugin );
47
+
48
+ $this->plugin = $plugin;
49
  }
50
 
51
+ public function afterFormSave() {
52
+ if ( $this->getPopulateOption( 'disable_gravatars' ) ) {
53
+ update_option( 'show_avatars', false );
54
+ } else {
55
+ update_option( 'show_avatars', true );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  }
57
+ }
58
 
59
+ public function warningNotice() {
60
+ parent::warningNotice();
61
+
62
+ if ( ! $this->plugin->getPopulateOption( 'revisions_disable' ) && $this->is_post_revision_constant() ) {
63
+ $this->printWarningNotice( __( 'Warning! In the wp-config.php file, a constant WP_POST_REVISIONS is found, it determines the number of revisions. Delete it so you can change this value through the admin panel.', 'clearfy' ) );
 
 
64
  }
65
+ }
66
 
67
+ /**
68
+ * Permalinks options.
69
+ *
70
+ * @since 1.0.0
71
+ * @return mixed[]
72
+ */
73
+ public function getPageOptions() {
74
+ $options = [];
75
+
76
+ $options[] = [
77
+ 'type' => 'html',
78
+ 'html' => '<div class="wbcr-factory-page-group-header">' . __( '<strong>Clear the unnecessary scripts</strong>', 'clearfy' ) . '<p>' . __( 'This set of settings will help you remove unnecessary links and code from the head section, as well as reduce your website\'s pages weight.', 'clearfy' ) . '</p></div>'
79
+ ];
80
+
81
+ $options[] = [
82
+ 'type' => 'checkbox',
83
+ 'way' => 'buttons',
84
+ 'name' => 'disable_feed',
85
+ 'title' => __( 'Disable RSS feeds', 'clearfy' ),
86
+ 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
87
+ 'hint' => __( 'By default, WordPress generates all types of different RSS feeds for your site. While RSS feeds can be useful if you are running a blog, businesses might not always utilize these. Not every site out there has a blog.', 'clearfy' ) . '<br><b>Clearfy: </b>' . sprintf( __( 'Removes a link to the RSS-feed from the %s section, closes and puts the redirect from all RSS-feeds.', 'clearfy' ), '&lt;head&gt;' ),
88
+ 'default' => false,
89
+ 'eventsOn' => [
90
+ 'show' => '.factory-control-disabled_feed_behaviour'
91
+ ],
92
+ 'eventsOff' => [
93
+ 'hide' => '.factory-control-disabled_feed_behaviour'
94
+ ]
95
+ ];
96
+
97
+ $options[] = [
98
+ 'type' => 'dropdown',
99
+ 'way' => 'buttons',
100
+ 'name' => 'disabled_feed_behaviour',
101
+ 'data' => [
102
+ [ 'redirect_301', __( 'Redirect 301', 'clearfy' ) ],
103
+ [ 'redirect_404', __( 'Page 404', 'clearfy' ) ],
104
+ ],
105
+ 'title' => __( 'Redirect feed requests', 'clearfy' ),
106
+ 'hint' => __( 'Forward all requests to page 404 or to the main page through 301 redirects.', 'clearfy' ),
107
+ //'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
108
+ 'default' => 'redirect_301'
109
+ ];
110
+
111
+ $options[] = [
112
+ 'type' => 'checkbox',
113
+ 'way' => 'buttons',
114
+ 'name' => 'disable_json_rest_api',
115
+ 'title' => __( 'Remove REST API Links', 'clearfy' ),
116
+ 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'red' ],
117
+ 'hint' => __( 'The WordPress REST API provides API endpoints for WordPress data types that allow developers to interact with sites remotely by sending and receiving JSON (JavaScript Object Notation) objects. However, a lot of sites don’t use this, and therefore in most cases, it is just unnecessary code.', 'clearfy' ) . '<br><br><b>Clearfy: </b>' . __( 'Removes REST API link tag from the front end and the REST API header link from page requests.', 'clearfy' ),
118
+ 'default' => false,
119
+ 'eventsOn' => [
120
+ 'show' => '#wbcr-clearfy-rest-api-danger-message'
121
+ ],
122
+ 'eventsOff' => [
123
+ 'hide' => '#wbcr-clearfy-rest-api-danger-message'
124
+ ]
125
+ ];
126
+
127
+ $options[] = [
128
+ 'type' => 'html',
129
+ 'html' => [ $this, 'restApiDangerMessage' ]
130
+ ];
131
+
132
+ $options[] = [
133
+ 'type' => 'checkbox',
134
+ 'way' => 'buttons',
135
+ 'name' => 'disable_emoji',
136
+ 'title' => __( 'Disable Emojis', 'clearfy' ),
137
+ 'layout' => [ 'hint-type' => 'icon' ],
138
+ 'hint' => __( 'Emojis are fun and all, but if you are aren’t using them they actually load a JavaScript file (wp-emoji-release.min.js) on every page of your website. For a lot of businesses, this is not needed and simply adds load time to your site. So we recommend disabling this.', 'clearfy' ) . '<br><br><b>Clearfy: </b>' . __( 'Removes WordPress Emojis JavaScript file (wp-emoji-release.min.js).', 'clearfy' ),
139
+ 'default' => false
140
+ ];
141
+
142
+ $options[] = [
143
+ 'type' => 'checkbox',
144
+ 'way' => 'buttons',
145
+ 'name' => 'remove_jquery_migrate',
146
+ 'title' => __( 'Remove jQuery Migrate', 'clearfy' ),
147
+ 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'red' ],
148
+ 'hint' => __( 'They started adding jQuery migrate in WordPress 3.6. Most up-to-date frontend code and plugins don’t require jquery-migrate.min.js. In most cases, this simply adds unnecessary load to your site. You can see this running if you launch Chrome Devtools console.', 'clearfy' ) . '<br><br><b>Clearfy: </b>' . __( 'Removes jQuery Migrate JavaScript file (jquery-migrate.min.js).', 'clearfy' ) . '<br>--<br><span class="wbcr-factory-light-orange-color">' . __( 'Warning! If there is a broke on your site, disable this option!', 'clearfy' ) . '</span>',
149
+ 'default' => false
150
+ ];
151
+
152
+ $options[] = [
153
+ 'type' => 'checkbox',
154
+ 'way' => 'buttons',
155
+ 'name' => 'disable_embeds',
156
+ 'title' => __( 'Disable Embeds', 'clearfy' ),
157
+ 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
158
+ 'hint' => __( 'Embeds were released with WordPress 4.4. This is basically the magic that auto converts your YouTube videos, Tweets, and URLs into pretty previews while you are editing. However, this actually loads a JavaScript file (wp-embed.min.js) on every page of your website. If you don’t care about the auto converting preview (which we don’t), you can disable this across your site.', 'clearfy' ) . '<br><br><b>Clearfy: </b>' . __( 'Removes WordPress Embed JavaScript file (wp-embed.min.js)', 'clearfy' ),
159
+ 'default' => false
160
+ ];
161
+
162
+ /*$options[] = array(
163
+ 'type' => 'checkbox',
164
+ 'way' => 'buttons',
165
+ 'name' => 'remove_dns_prefetch',
166
+ 'title' => __('Remove dns-prefetch', 'clearfy'),
167
+ 'layout' => array('hint-type' => 'icon'),
168
+ 'hint' => sprintf(__('Since version 4.6.1 in WordPress there are new links in the section %s this type of: ', 'clearfy'), 'head') . ' <code>link rel="dns-prefetch" href="//s.w.org"</code><br><br><b>Clearfy: </b>' . sprintf(__('Removes dns-prefetch links from the %s section', 'clearfy'), 'head'),
169
+ 'default' => false
170
+ );*/
171
+ $options[] = [
172
+ 'type' => 'checkbox',
173
+ 'way' => 'buttons',
174
+ 'name' => 'remove_rsd_link',
175
+ 'title' => __( 'Remove RSD Link', 'clearfy' ),
176
+ 'layout' => [ 'hint-type' => 'icon' ],
177
+ 'hint' => __( 'The above link is used by blog clients. If you edit your site from your browser then you don’t need this. It is also used by some 3rd party applications that utilize XML-RPC requests. In most cases, this is just unnecessary code.', 'clearfy' ) . '<br><code>link rel="EditURI" type="application/rsd+xml" title="RSD"</code><br><br><b>Clearfy: </b>' . __( 'Remove RSD (Real Simple Discovery) link tag.', 'clearfy' ),
178
+ 'default' => false
179
+ ];
180
+ $options[] = [
181
+ 'type' => 'checkbox',
182
+ 'way' => 'buttons',
183
+ 'name' => 'remove_xfn_link',
184
+ 'title' => __( 'Removing XFN (XHTML Friends Network) Profile Link', 'clearfy' ),
185
+ 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
186
+ 'hint' => __( 'The profile attribute specifies the metadata profile address. Usually, the browser recognizes the value of this attribute and executes some conventions related to the specified profile. Loading the document itself at the specified address does not really happen, moreover, it may not exist at all.
 
187
  In particular, the profile is used for the XFN microformat (XHTML Friends Network) - a way of representing relationships between people using links and rel attributes with different values. WordPress also actively uses profile in its templates.
188
+ ', 'clearfy' ) . '<br><br><b>Clearfy: </b>' . __( 'Remove link tag', 'clearfy' ) . '<br><code>link rel="profile" href="http://gmpg.org/xfn/11"</code>',
189
+ 'default' => false
190
+ ];
191
+
192
+ $options[] = [
193
+ 'type' => 'checkbox',
194
+ 'way' => 'buttons',
195
+ 'name' => 'remove_wlw_link',
196
+ 'title' => __( 'Remove wlwmanifest Link', 'clearfy' ),
197
+ 'layout' => [ 'hint-type' => 'icon' ],
198
+ 'hint' => '<code>link rel="wlwmanifest" type="application/wlwmanifest+xml"</code><br>' . __( 'This link is actually used by Windows Live Writer. If you don’t know use Windows Live Writer, which we are guessing you don’t, this is just unnecessary code.', 'clearfy' ) . '<br><br><b>Clearfy: </b>' . __( 'Remove wlwmanifest (Windows Live Writer) link tag.', 'clearfy' ),
199
+ 'default' => false
200
+ ];
201
+
202
+ $options[] = [
203
+ 'type' => 'checkbox',
204
+ 'way' => 'buttons',
205
+ 'name' => 'remove_shortlink_link',
206
+ 'title' => __( 'Remove Shortlink', 'clearfy' ),
207
+ 'layout' => [ 'hint-type' => 'icon' ],
208
+ 'hint' => sprintf( __( 'By default, the following tag shows up in every WordPress install. %s This is used for a shortlink to your pages and posts. However, if you are already using pretty permalinks, such as domain.com/post, then there is no reason to keep this, it is just unnecessary code.', 'clearfy' ), '<br><code>link rel="shortlink" href="https://domain.com?p=712"</code><br>' ) . '<br><br><b>Clearfy: </b>' . __( 'Remove Shortlink link tag.', 'clearfy' ),
209
+ 'default' => false
210
+ ];
211
+
212
+ $options[] = [
213
+ 'type' => 'checkbox',
214
+ 'way' => 'buttons',
215
+ 'name' => 'remove_adjacent_posts_link',
216
+ 'title' => __( 'Remove links to previous, next post', 'clearfy' ),
217
+ 'layout' => [ 'hint-type' => 'icon' ],
218
+ 'hint' => __( 'If you use Wordpress as a CMS, then you can delete these links, they can only come in handy for a blog.', 'clearfy' ) . '<br><br><b>Clearfy: </b>' . __( 'Remove the previous and next post links within the wp_head of your wordpress theme.', 'clearfy' ),
219
+ 'default' => false
220
+ ];
221
+
222
+ $options[] = [
223
+ 'type' => 'checkbox',
224
+ 'way' => 'buttons',
225
+ 'name' => 'remove_recent_comments_style',
226
+ 'title' => __( 'Remove .recentcomments styles', 'clearfy' ),
227
+ 'layout' => [ 'hint-type' => 'icon' ],
228
+ 'hint' => __( 'WP by default for the widget "recent comments" prescribes in the code styles that are almost impossible to change, because to them apply! important.', 'clearfy' ) . '<br><br><b>Clearfy: </b>' . __( 'Removes .recentcomments styles from head section.', 'clearfy' ),
229
+ 'default' => false
230
+ ];
231
+
232
+ $options[] = [
233
+ 'type' => 'checkbox',
234
+ 'way' => 'buttons',
235
+ 'name' => 'lazy_load_font_awesome',
236
+ 'title' => __( 'Font Awesome asynchronous', 'clearfy' ),
237
+ 'layout' => [ 'hint-type' => 'icon' ],
238
+ 'hint' => __( 'By default, WordPress loads Font Awesome icons synchronously, that is, your page will not be fully loaded until Font Awesome icons are loaded. This algorithm slows down the loading of your page and leads to errors when checking the site in Google Page Speed. Using this option, your Font Awesome icons will be loaded after your page is fully loaded. This method has a negative — you and visitors of your site will see changes while loading a page, from the placeholders to icons.', 'clearfy' ),
239
+ 'default' => false
240
+ ];
241
+
242
+ $options[] = [
243
+ 'type' => 'checkbox',
244
+ 'way' => 'buttons',
245
+ 'name' => 'disable_dashicons',
246
+ 'title' => __( 'Disable Dashicons', 'clearfy' ),
247
+ 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
248
+ 'hint' => __( 'Dashicons is the official icon font of the WordPress admin as of 3.8. Some of you have requested that we add a feature to remove Dashicons. Some themes and developers utilize this (dashicons.min.css) on the front-end of their sites.', 'clearfy' ),
249
+ 'default' => false
250
+ ];
251
+
252
+ $options[] = [
253
+ 'type' => 'checkbox',
254
+ 'way' => 'buttons',
255
+ 'name' => 'disable_gravatars',
256
+ 'title' => __( 'Disable gravatars', 'clearfy' ),
257
+ 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
258
+ 'hint' => __( 'This function that prevents the user’s gravatar being automatically obtained from gravatar.com based on their registered email. This would be useful for sites where users require an extra layer of privacy, or if you just want to prevent potentially silly or embarrasing avatar accidents.
259
  If you’re using Identicons or any other generated default avatar, the user should keep a consistent avatar unless they change their registered email.
260
+ ', 'clearfy' ),
261
+ 'default' => false
262
+ ];
263
 
264
+ $options[] = [
265
+ 'type' => 'html',
266
+ 'html' => '<div class="wbcr-clearfy-group-header">' . '<strong>' . __( 'Classic editor and Gutenberg', 'clearfy' ) . '</strong>' . '<p>' . __( 'In this group of options, you can manage revisions and post autosave.', 'clearfy' ) . '</p>' . '</div>'
267
+ ];
268
 
269
+ $options[] = [
270
+ 'type' => 'checkbox',
271
+ 'way' => 'buttons',
272
+ 'name' => 'revisions_disable',
273
+ 'title' => __( 'Disable revision', 'clearfy' ),
274
+ 'default' => false,
275
+ 'eventsOn' => [
276
+ 'hide' => '.factory-control-revision_limit'
277
+ ],
278
+ 'eventsOff' => [
279
+ 'show' => '.factory-control-revision_limit'
280
+ ],
281
+ ];
282
 
283
+ $options[] = [
284
+ 'type' => 'dropdown',
285
+ 'name' => 'revision_limit',
286
+ 'title' => __( 'Limit Post Revisions', 'clearfy' ),
287
+ 'data' => [
288
+ [ 'default', __( 'Wordpress default', 'clearfy' ) ],
289
+ [ '15', '15 ' . __( 'revisions', 'clearfy' ) ],
290
+ [ '20', '20 ' . __( 'revisions', 'clearfy' ) ],
291
+ [ '25', '25 ' . __( 'revisions', 'clearfy' ) ],
292
+ [ '30', '30 ' . __( 'revisions', 'clearfy' ) ],
293
+ [ '35', '35 ' . __( 'revisions', 'clearfy' ) ],
294
+ [ '40', '40 ' . __( 'revisions', 'clearfy' ) ],
295
+ [ '45', '45 ' . __( 'revisions', 'clearfy' ) ],
296
+ [ '50', '50 ' . __( 'revisions', 'clearfy' ) ],
297
+ [ '55', '55 ' . __( 'revisions', 'clearfy' ) ],
298
+ [ '60', '60 ' . __( 'revisions', 'clearfy' ) ]
299
+ ],
300
+ 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
301
+ 'hint' => __( 'WordPress automatically saves revisions when you are working on posts and pages. These can begin to add up pretty quick. By default, there is no limit in place. We have seen posts with over 1,000 revisions. Multiply this by 50 pages and suddenly you have over 50,000 revisions sitting in your database. The problem with this is that you will most likely never use them and they can start slowing down your database as well as using disk space.
302
+ So we recommend either disabling or limiting your revisions. ', 'clearfy' ),
303
+ 'default' => 'default'
304
+ ];
305
+
306
+ if ( version_compare( get_bloginfo( 'version' ), '5.0', '>=' ) ) {
307
+ $options[] = [
308
+ 'type' => 'checkbox',
309
+ 'way' => 'buttons',
310
+ 'name' => 'gutenberg_autosave_control',
311
+ 'title' => __( 'Gutenberg autosave control', 'clearfy' ),
312
+ 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
313
+ 'hint' => __( 'By activating this option autosave feature in the Gutenberg editor will be disabled. Alternatively it also provides options in the editor to select a longer autosave interval time than the default 10 seconds.', 'clearfy' ),
314
+ 'default' => false
315
+ ];
316
+ } else {
317
+ $options[] = [
318
+ 'type' => 'checkbox',
319
+ 'way' => 'buttons',
320
+ 'name' => 'disable_post_autosave',
321
+ 'title' => __( 'Disable autosave', 'clearfy' ),
322
+ 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
323
+ 'hint' => __( 'WordPress by default automatically saves a draft every 60 seconds (1 minute). There are reasons why you might want to change this.', 'clearfy' ) . '<br><b>Clearfy</b>: ' . __( 'Disables automatic saving of drafts.', 'clearfy' ),
324
+ 'default' => false
325
+ ];
326
  }
327
+
328
+ $options[] = [
329
+ 'type' => 'html',
330
+ 'html' => '<div class="wbcr-clearfy-group-header">' . '<strong>' . __( 'Remove query strings from static resources', 'clearfy' ) . '</strong>' . '<p>' . __( 'This funcitons will remove query strings from static resources like CSS & JS files inside the HTML <head> element to improve your speed scores in services like Pingdom, GTmetrix, PageSpeed and YSlow. <b style="color:#ff5722">Important:</b> This does not work for authorized users. To avoid problems after plugins update!', 'clearfy' ) . '</p>' . '</div>'
331
+ ];
332
+
333
+ $options[] = [
334
+ 'type' => 'checkbox',
335
+ 'way' => 'buttons',
336
+ 'name' => 'remove_js_version',
337
+ 'title' => __( 'Remove Version from Script', 'clearfy' ) . ' <span class="wbcr-clearfy-recomended-text">(' . __( 'Recommended', 'clearfy' ) . ')</span>',
338
+ 'layout' => [ 'hint-type' => 'icon' ],
339
+ 'hint' => __( 'To make it more difficult for others to hack your website you can remove the WordPress version number from your site, your css and js. Without that number it\'s not possible to see if you run not the current version to exploit bugs from the older versions. <br><br>
340
+ Additionally it can improve the loading speed of your site, because without query strings in the URL the css and js files can be cached.', 'clearfy' ) . '<br><br><b>Clearfy: </b>' . __( 'Removes wordpress version number from scripts (not logged in user only).', 'clearfy' ),
341
+ 'default' => false
342
+ ];
343
+
344
+ $options[] = [
345
+ 'type' => 'checkbox',
346
+ 'way' => 'buttons',
347
+ 'name' => 'remove_style_version',
348
+ 'title' => __( 'Remove Version from Stylesheet', 'clearfy' ) . ' <span class="wbcr-clearfy-recomended-text">(' . __( 'Recommended', 'clearfy' ) . ')</span>',
349
+ 'layout' => [ 'hint-type' => 'icon' ],
350
+ 'hint' => __( 'To make it more difficult for others to hack your website you can remove the WordPress version number from your site, your css and js. Without that number it\'s not possible to see if you run not the current version to exploit bugs from the older versions. <br><br>
351
+ Additionally it can improve the loading speed of your site, because without query strings in the URL the css and js files can be cached.', 'clearfy' ) . '<br><br><b>Clearfy: </b>' . __( 'Removes the wordpress version number from stylesheets (not logged in user only).', 'clearfy' ),
352
+ 'default' => false
353
+ /*'eventsOn' => array(
354
+ 'show' => '.factory-control-disable_remove_style_version_for_auth_users'
355
+ ),
356
+ 'eventsOff' => array(
357
+ 'hide' => '.factory-control-disable_remove_style_version_for_auth_users'
358
+ )*/
359
+ ];
360
+
361
+ /*$options[] = array(
362
+ 'type' => 'checkbox',
363
+ 'way' => 'buttons',
364
+ 'name' => 'disable_remove_style_version_for_auth_users',
365
+ 'title' => __( 'Disable remove versions for auth users', 'clearfy' ) . ' <span class="wbcr-clearfy-recomended-text">(' . __( 'Recommended', 'clearfy' ) . ')</span>',
366
+ 'layout' => array( 'hint-type' => 'icon' ),
367
+ 'default' => false
368
+ );*/
369
+
370
+ $options[] = [
371
+ 'type' => 'textarea',
372
+ 'name' => 'remove_version_exclude',
373
+ 'height' => '120',
374
+ 'title' => __( 'Exclude stylesheet/script file names', 'clearfy' ),
375
+ 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
376
+ 'hint' => __( 'Enter Stylesheet/Script file names to exclude from version removal (each exclude file starts with a new line)', 'clearfy' ) . '<br><br><b>' . __( 'Example', 'clearfy' ) . ':</b>' . ' http://testwp.dev/wp-includes/js/jquery/jquery.js',
377
+ ];
378
+
379
+ $options[] = [
380
+ 'type' => 'html',
381
+ 'html' => '<div class="wbcr-clearfy-group-header">' . '<strong>' . __( 'Heartbeat', 'clearfy' ) . '</strong>' . '<p>' . __( 'The WordPress Heartbeat API uses /wp-admin/admin-ajax.php to run AJAX calls from the web-browser. While this is great and all it can also cause high CPU usage and crazy amounts of PHP calls. For example, if you leave your dashboard open it will keep sending POST requests to this file on a regular interval, every 15 seconds. Here is an example below of it happening.', 'clearfy' ) . '</p>' . '</div>'
382
+ ];
383
+
384
+ $options[] = [
385
+ 'type' => 'dropdown',
386
+ 'name' => 'disable_heartbeat',
387
+ 'way' => 'buttons',
388
+ 'title' => __( 'Disable Heartbeat', 'clearfy' ),
389
+ 'data' => [
390
+ [ 'default', __( 'Default', 'clearfy' ) ],
391
+ [ 'everywhere', __( 'Everywhere', 'clearfy' ) ],
392
+ [ 'on_dashboard_page', __( 'On dashboard page', 'clearfy' ) ],
393
+ [ 'allow_only_on_post_edit_pages', __( 'Only allow when editing Posts/Pages', 'clearfy' ) ]
394
+ ],
395
+ //'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
396
+ //'hint' => __('You can disable all plugin updates or choose manual or automatic update mode.', 'clearfy'),
397
+ 'events' => [
398
+ 'default' => [
399
+ 'show' => '.factory-control-heartbeat_frequency'
400
+ ],
401
+ 'on_dashboard_page' => [
402
+ 'show' => '.factory-control-heartbeat_frequency'
403
+ ],
404
+ 'allow_only_on_post_edit_pages' => [
405
+ 'show' => '.factory-control-heartbeat_frequency'
406
+ ],
407
+ 'everywhere' => [
408
+ 'hide' => '.factory-control-heartbeat_frequency'
409
+ ]
410
+ ],
411
+ 'default' => 'default',
412
+ ];
413
+
414
+ $options[] = [
415
+ 'type' => 'dropdown',
416
+ 'name' => 'heartbeat_frequency',
417
+ 'title' => __( 'Heartbeat frequency', 'clearfy' ),
418
+ 'data' => [
419
+ [ 'default', __( 'Wordpress default', 'clearfy' ) ],
420
+ [ '20', '20 ' . __( 'seconds', 'clearfy' ) ],
421
+ [ '25', '25 ' . __( 'seconds', 'clearfy' ) ],
422
+ [ '30', '30 ' . __( 'seconds', 'clearfy' ) ],
423
+ [ '35', '35 ' . __( 'seconds', 'clearfy' ) ],
424
+ [ '40', '40 ' . __( 'seconds', 'clearfy' ) ],
425
+ [ '45', '45 ' . __( 'seconds', 'clearfy' ) ],
426
+ [ '50', '50 ' . __( 'seconds', 'clearfy' ) ],
427
+ [ '55', '55 ' . __( 'seconds', 'clearfy' ) ],
428
+ [ '60', '60 ' . __( 'seconds', 'clearfy' ) ],
429
+ [ '80', '80 ' . __( 'seconds', 'clearfy' ) ],
430
+ [ '120', '120 ' . __( 'seconds', 'clearfy' ) ],
431
+ [ '150', '150 ' . __( 'seconds', 'clearfy' ) ],
432
+ [ '200', '200 ' . __( 'seconds', 'clearfy' ) ],
433
+ [ '250', '250 ' . __( 'seconds', 'clearfy' ) ],
434
+ [ '300', '300 ' . __( 'seconds', 'clearfy' ) ],
435
+ [ '400', '400 ' . __( 'seconds', 'clearfy' ) ],
436
+ [ '500', '500 ' . __( 'seconds', 'clearfy' ) ]
437
+ ],
438
+ 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
439
+ 'hint' => __( 'Select the heartbeat frequency wordpress. We recommend you 60 seconds, default is 20 seconds.', 'clearfy' ),
440
+ 'default' => 'default'
441
+ ];
442
+
443
+ $form_options = [];
444
+
445
+ $form_options[] = [
446
+ 'type' => 'form-group',
447
+ 'items' => $options,
448
+ //'cssClass' => 'postbox'
449
+ ];
450
+
451
+ return apply_filters( 'wbcr_clr_code_clean_form_options', $form_options, $this );
452
+ }
453
+
454
+ /**
455
+ * Adds an html warning notification html markup.
456
+ */
457
+ public function restApiDangerMessage() {
458
+ ?>
459
+ <div class="form-group">
460
+ <label class="col-sm-4 control-label"></label>
461
+ <div class="control-group col-sm-8">
462
+ <div id="wbcr-clearfy-rest-api-danger-message" class="wbcr-clearfy-danger-message">
463
+ <?php _e( '<b>Use this option carefully!</b><br> Plugins like Contact form 7, Anycomments may have problems using this option.', 'clearfy' ) ?>
464
+ </div>
465
+ </div>
466
+ </div>
467
+ <?php
468
+ }
469
+
470
+ /**
471
+ * Check if WP_POST_REVISIONS is installed in wp-config file
472
+ *
473
+ * @return bool
474
+ */
475
+ protected function is_post_revision_constant() {
476
+ $config_path = ABSPATH . '/wp-config.php';
477
+
478
+ if ( file_exists( $config_path ) ) {
479
+ $file = fopen( $config_path, 'r' );
480
+ $content = fread( $file, filesize( $config_path ) );
481
+ fclose( $file );
482
+
483
+ if ( ! empty( $content ) && preg_match( '/define(.+?)WP_POST_REVISIONS/', $content ) ) {
484
+ return true;
485
+ }
486
  }
487
+
488
+ return false;
489
  }
490
+ }
assets/css/admin-bar.css CHANGED
@@ -1,47 +1,47 @@
1
- /**
2
- * Admin bar menu
3
- * @author Webcraftic <wordpress.webraftic@gmail.com>
4
- * @copyright Webcraftic 01.07.2018
5
- */
6
- #wp-admin-bar-clearfy-menu {
7
- background: #443a54 !important;
8
- }
9
- #wp-admin-bar-clearfy-menu::after {
10
- clear: both;
11
- }
12
- #wp-admin-bar-clearfy-menu .dashicons {
13
- font: 400 20px/1 dashicons;
14
- }
15
- #wp-admin-bar-clearfy-menu #wp-admin-bar-clearfy-menu-default {
16
- background: #565656 !important;
17
- }
18
- #wp-admin-bar-clearfy-menu .wbcr-clearfy-admin-bar-menu-icon {
19
- display: inline-block !important;
20
- width: 20px;
21
- height: 25px;
22
- margin-top: 6px;
23
- margin-right: 5px;
24
- float: left;
25
- background: url(../img/webcraftic-plugin-icon.png) 0 0 no-repeat;
26
- }
27
- #wp-admin-bar-clearfy-menu .wbcr-clearfy-admin-bar-menu-title {
28
- display: inline-block !important;
29
- overflow: hidden;
30
- }
31
- #wp-admin-bar-clearfy-menu .wbcr-clearfy-admin-bar-menu-title .dashicons {
32
- font-size: 20px !important;
33
- padding: 6px 0 !important;
34
- }
35
- #wp-admin-bar-clearfy-menu .ab-item .dashicons {
36
- font-size: 14px;
37
- padding: 6px 0;
38
- }
39
- #wp-admin-bar-clearfy-menu .ab-item .dashicons.dashicons-heart {
40
- color: #fb7976;
41
- }
42
- #wp-admin-bar-clearfy-menu .ab-item .dashicons.dashicons-sos {
43
- color: #c6e9f9;
44
- }
45
- #wp-admin-bar-clearfy-menu .ab-item .dashicons.dashicons-star-filled {
46
- color: #ffbe00;
47
- }
1
+ /**
2
+ * Admin bar menu
3
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
4
+ * @copyright Webcraftic 01.07.2018
5
+ */
6
+ #wp-admin-bar-clearfy-menu {
7
+ background: #443a54 !important;
8
+ }
9
+ #wp-admin-bar-clearfy-menu::after {
10
+ clear: both;
11
+ }
12
+ #wp-admin-bar-clearfy-menu .dashicons {
13
+ font: 400 20px/1 dashicons;
14
+ }
15
+ #wp-admin-bar-clearfy-menu #wp-admin-bar-clearfy-menu-default {
16
+ background: #565656 !important;
17
+ }
18
+ #wp-admin-bar-clearfy-menu .wbcr-clearfy-admin-bar-menu-icon {
19
+ display: inline-block !important;
20
+ width: 20px;
21
+ height: 25px;
22
+ margin-top: 6px;
23
+ margin-right: 5px;
24
+ float: left;
25
+ background: url(../img/webcraftic-plugin-icon.png) 0 0 no-repeat;
26
+ }
27
+ #wp-admin-bar-clearfy-menu .wbcr-clearfy-admin-bar-menu-title {
28
+ display: inline-block !important;
29
+ overflow: hidden;
30
+ }
31
+ #wp-admin-bar-clearfy-menu .wbcr-clearfy-admin-bar-menu-title .dashicons {
32
+ font-size: 20px !important;
33
+ padding: 6px 0 !important;
34
+ }
35
+ #wp-admin-bar-clearfy-menu .ab-item .dashicons {
36
+ font-size: 14px;
37
+ padding: 6px 0;
38
+ }
39
+ #wp-admin-bar-clearfy-menu .ab-item .dashicons.dashicons-heart {
40
+ color: #fb7976;
41
+ }
42
+ #wp-admin-bar-clearfy-menu .ab-item .dashicons.dashicons-sos {
43
+ color: #c6e9f9;
44
+ }
45
+ #wp-admin-bar-clearfy-menu .ab-item .dashicons.dashicons-star-filled {
46
+ color: #ffbe00;
47
+ }
clearfy.php CHANGED
@@ -4,13 +4,14 @@
4
  * Plugin URI: https://wordpress.org/plugins/clearfy/
5
  * Description: Disables unused Wordpress features, improves performance and increases SEO rankings, using Clearfy, which makes WordPress very easy.
6
  * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
- * Version: 1.5.0
8
  * Text Domain: clearfy
9
  * Domain Path: /languages/
10
  * Author URI: http://clearfy.pro
11
  * Framework Version: FACTORY_409_VERSION
12
  */
13
 
 
14
  // Exit if accessed directly
15
  if ( ! defined( 'ABSPATH' ) ) {
16
  exit;
@@ -20,7 +21,7 @@ if ( defined( 'WBCR_CLEARFY_PLUGIN_ACTIVE' ) ) {
20
  return;
21
  }
22
 
23
- define( 'WBCR_CLEARFY_PLUGIN_VERSION', '1.5.0' );
24
 
25
  define( 'WBCR_CLEARFY_PLUGIN_ACTIVE', true );
26
 
@@ -53,17 +54,22 @@ $plugin_info = array(
53
  'plugin_name' => 'wbcr_clearfy',
54
  'plugin_title' => __( 'Clearfy', 'clearfy' ),
55
  'plugin_version' => WBCR_CLEARFY_PLUGIN_VERSION,
56
- 'required_php_version' => '5.3',
57
- 'required_wp_version' => '4.2',
58
  'freemius_plugin_id' => 2315,
59
  'freemius_plugin_slug' => 'clearfy',
60
  'freemius_public_key' => 'pk_70e226af07d37d2b9a69720e0952c',
61
  'plugin_build' => 'free',
62
  'updates' => WCL_PLUGIN_DIR . '/updates/',
63
- //'author_site_url' => 'https://clearfy.pro',
64
- //'author_ru_site_url' => 'https://ru.clearfy.pro'
 
 
 
 
 
65
  );
66
 
 
 
67
  /**
68
  * Проверяет совместимость с Wordpress, php и другими плагинами.
69
  */
@@ -80,5 +86,6 @@ require_once( WCL_PLUGIN_DIR . '/libs/factory/core/boot.php' );
80
  require_once( WCL_PLUGIN_DIR . '/includes/class.plugin.php' );
81
 
82
  new WCL_Plugin( __FILE__, $plugin_info );
83
-
84
 
 
 
4
  * Plugin URI: https://wordpress.org/plugins/clearfy/
5
  * Description: Disables unused Wordpress features, improves performance and increases SEO rankings, using Clearfy, which makes WordPress very easy.
6
  * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
+ * Version: 1.5.3
8
  * Text Domain: clearfy
9
  * Domain Path: /languages/
10
  * Author URI: http://clearfy.pro
11
  * Framework Version: FACTORY_409_VERSION
12
  */
13
 
14
+ // @formatter:off
15
  // Exit if accessed directly
16
  if ( ! defined( 'ABSPATH' ) ) {
17
  exit;
21
  return;
22
  }
23
 
24
+ define( 'WBCR_CLEARFY_PLUGIN_VERSION', '1.5.3' );
25
 
26
  define( 'WBCR_CLEARFY_PLUGIN_ACTIVE', true );
27
 
54
  'plugin_name' => 'wbcr_clearfy',
55
  'plugin_title' => __( 'Clearfy', 'clearfy' ),
56
  'plugin_version' => WBCR_CLEARFY_PLUGIN_VERSION,
 
 
57
  'freemius_plugin_id' => 2315,
58
  'freemius_plugin_slug' => 'clearfy',
59
  'freemius_public_key' => 'pk_70e226af07d37d2b9a69720e0952c',
60
  'plugin_build' => 'free',
61
  'updates' => WCL_PLUGIN_DIR . '/updates/',
62
+ 'plugin_as_component' => false,
63
+ 'plugin_dir' => WCL_PLUGIN_DIR,
64
+ 'plugin_base' => WCL_PLUGIN_BASE,
65
+ 'plugin_url' => WCL_PLUGIN_URL,
66
+ 'required_php_version' => '5.4',
67
+ 'required_wp_version' => '4.2.0',
68
+ 'factory_version' => 'FACTORY_409_VERSION'
69
  );
70
 
71
+
72
+
73
  /**
74
  * Проверяет совместимость с Wordpress, php и другими плагинами.
75
  */
86
  require_once( WCL_PLUGIN_DIR . '/includes/class.plugin.php' );
87
 
88
  new WCL_Plugin( __FILE__, $plugin_info );
 
89
 
90
+
91
+ // @formatter:on
components/assets-manager/assets/css/assets-manager.css CHANGED
@@ -375,7 +375,7 @@ body p {
375
  #WBCR .wbcr-gnz-panel {
376
  position: fixed;
377
  z-index: 50;
378
- top: 0;
379
  right: 0;
380
  left: 0;
381
  width: 100%;
@@ -391,6 +391,7 @@ body p {
391
  color: #FFF;
392
  background: #23282d;
393
  font-size: 16px;
 
394
  }
395
  #WBCR .wbcr-gnz-panel .wbcr-gnz-panel__premium {
396
  position: relative;
@@ -997,6 +998,10 @@ body p {
997
  #WBCR .wbcr-gnz-table__note p:not(:last-child) {
998
  margin-bottom: 12px;
999
  }
 
 
 
 
1000
  #WBCR .wbcr-gnz-table__select {
1001
  padding: 8px 28px 8px 10px;
1002
  color: #4B4E51;
@@ -1024,7 +1029,7 @@ body p {
1024
  }
1025
  #WBCR .wbcr-gnz-table__label {
1026
  display: block;
1027
- margin: 0 0 15px 10px;
1028
  padding-bottom: 5px;
1029
  color: #414B56;
1030
  font-size: 13px;
@@ -1140,14 +1145,24 @@ body p {
1140
  #WBCR .wbcr-gnz-table__also {
1141
  font-size: 12px;
1142
  font-weight: bold;
 
1143
  }
1144
  #WBCR .wbcr-gnz-table__also .wbcr-gnz-table__label {
1145
- margin-bottom: 5px;
1146
  font-size: 12px;
 
 
1147
  }
1148
  #WBCR .wbcr-gnz-table__also-url {
1149
  color: #A9AAAA;
1150
  }
 
 
 
 
 
 
 
 
1151
  #WBCR .wbcr-gnz-switch {
1152
  position: relative;
1153
  z-index: 1;
@@ -1394,3 +1409,4 @@ body p {
1394
  display: block;
1395
  }
1396
  }
 
375
  #WBCR .wbcr-gnz-panel {
376
  position: fixed;
377
  z-index: 50;
378
+ top: 30px;
379
  right: 0;
380
  left: 0;
381
  width: 100%;
391
  color: #FFF;
392
  background: #23282d;
393
  font-size: 16px;
394
+ border-top: 2px solid #ffcb1e;
395
  }
396
  #WBCR .wbcr-gnz-panel .wbcr-gnz-panel__premium {
397
  position: relative;
998
  #WBCR .wbcr-gnz-table__note p:not(:last-child) {
999
  margin-bottom: 12px;
1000
  }
1001
+ #WBCR .wbcr-gnz-table__select-wrapper::before,
1002
+ #WBCR .wbcr-gnz-table__select-wrapper::after {
1003
+ display: none !important;
1004
+ }
1005
  #WBCR .wbcr-gnz-table__select {
1006
  padding: 8px 28px 8px 10px;
1007
  color: #4B4E51;
1029
  }
1030
  #WBCR .wbcr-gnz-table__label {
1031
  display: block;
1032
+ margin: 15px 0 15px 10px;
1033
  padding-bottom: 5px;
1034
  color: #414B56;
1035
  font-size: 13px;
1145
  #WBCR .wbcr-gnz-table__also {
1146
  font-size: 12px;
1147
  font-weight: bold;
1148
+ margin-top: 15px;
1149
  }
1150
  #WBCR .wbcr-gnz-table__also .wbcr-gnz-table__label {
 
1151
  font-size: 12px;
1152
+ padding: 5px 5px 5px 0;
1153
+ margin: 0;
1154
  }
1155
  #WBCR .wbcr-gnz-table__also-url {
1156
  color: #A9AAAA;
1157
  }
1158
+ #WBCR .wbcr-gnz-table__also-url span {
1159
+ display: block;
1160
+ }
1161
+ #WBCR .wbcr-gnz-table__also-url span a {
1162
+ text-decoration: underline;
1163
+ color: #adaeae;
1164
+ font-size: 12px;
1165
+ }
1166
  #WBCR .wbcr-gnz-switch {
1167
  position: relative;
1168
  z-index: 1;
1409
  display: block;
1410
  }
1411
  }
1412
+ /*# sourceMappingURL=assets-manager.css.map */
components/assets-manager/assets/css/assets-manager.css.map ADDED
@@ -0,0 +1 @@
 
1
+ {"version":3,"sources":["assets-manager.less","reset.less"],"names":[],"mappings":";;;;;AAMA;AAAM;EACJ,2BAAA;;AAGF;EACE,4BAAA;EACA,yCAAA;EACA,sBAAA;;AAGF;EACE,oBAAA;EACA,qBAAA;EACA,2BAAA;;AAEA;AALF,IAKK;EACD,oBAAoB,4BAApB;;AAIJ;;;;;;;;;;;;;AAAA,KCpBA;ADoBA,KCpBG,EAAC;ADoBJ,KCpBa,EAAC;EACZ,8BAAA;EACA,2BAAA;EACA,sBAAA;;AAGF;ADcA,KCbA;ADaA,KCbI;ADaJ,KCbQ;ADaR,KCbY;ADaZ,KCbgB;ADahB,KCZA;ADYA,KCZG;ADYH,KCZW;ADYX,KCZc;ADYd,KCXA;ADWA,KCXI;ADWJ,KCXO;ADWP,KCXU;ADWV,KCXe;ADWf,KCVA;ADUA,KCVS;ADUT,KCVa;ADUb,KCTA,MAAK;ADSL,KCTsB,MAAK;ADS3B,KCRA;EACE,oBAAoB,4BAApB;EACA,eAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;EACA,iBAAA;;ADEF,KCCA;EACE,cAAA;EACA,gBAAA;;ADHF,KCMA;EACE,uBAAA;EACA,SAAA;EACA,iBAAA;;ADTF,KCYA;EACE,iCAAA;EACA,cAAA;;ADdF,KCiBA;EACE,6BAAA;;ADlBF,KCqBA,KAAI;EACF,mBAAA;EACA,iCAAA;;ADvBF,KC0BA;AD1BA,KC0BG;EACD,mBAAA;;AD3BF,KC8BA;AD9BA,KC8BM;AD9BN,KC8BW;EACT,iCAAA;EACA,cAAA;;ADhCF,KCmCA;EACE,cAAA;;ADpCF,KCuCA;ADvCA,KCuCK;EACH,cAAA;EACA,cAAA;EACA,kBAAA;EACA,wBAAA;;AD3CF,KC8CA;EACE,eAAA;;AD/CF,KCkDA;EACE,WAAA;;ADnDF,KCsDA;EACE,kBAAA;;ADvDF,KC0DA;AD1DA,KC2DA;AD3DA,KC4DA;AD5DA,KC6DA;AD7DA,KC8DA;EACE,oBAAA;EACA,eAAA;EACA,iBAAA;EACA,SAAA;EACA,YAAA;EACA,WAAA;;AACA,KAXF;AAWE,KAVF;AAUE,KATF;AASE,KARF;AAQE,KAPF;AAOK,KAXL,OAWM;AAAD,KAVL,MAUM;AAAD,KATL,SASM;AAAD,KARL,OAQM;AAAD,KAPL,SAOM;AAAQ,KAXd,OAWe;AAAD,KAVd,MAUe;AAAD,KATd,SASe;AAAD,KARd,OAQe;AAAD,KAPd,SAOe;EACX,qBAAA;EACA,oBAAA;EACA,wBAAA;EACA,mBAAA;;ADzEJ,KC6EA;AD7EA,KC8EA;EACE,iBAAA;;AD/EF,KCkFA;ADlFA,KCmFA;EACE,oBAAA;;ADpFF,KCuFA;ADvFA,KCwFA;ADxFA,KCyFA;ADzFA,KC0FA;EACE,0BAAA;;AD3FF,KC8FA,OAAM;AD9FN,KC+FA,gBAAe;AD/Ff,KCgGA,eAAc;ADhGd,KCiGA,gBAAe;EACb,kBAAA;EACA,UAAA;;ADnGF,KCsGA,OAAM;ADtGN,KCuGA,gBAAe;ADvGf,KCwGA,eAAc;ADxGd,KCyGA,gBAAe;EACb,8BAAA;;AD1GF,KC6GA;EACE,8BAAA;;AD9GF,KCiHA;EACE,sBAAA;EACA,cAAA;EACA,cAAA;EACA,eAAA;EACA,UAAA;EACA,mBAAA;;ADvHF,KC0HA;EACE,cAAA;;AD3HF,KC8HA;AD9HA,KC+HA;EACE,sBAAA;EACA,UAAA;;ADjIF,KCoIA,gBAAe;ADpIf,KCqIA,gBAAe;EACb,YAAA;;ADtIF,KCyIA;EACE,6BAAA;EACA,oBAAA;;AD3IF,KC8IA,gBAAe;EACb,wBAAA;;AD/IF,KCkJA;EACE,0BAAA;EACA,aAAA;;ADpJF,KCuJA;EACE,8BAAA;;ADxJF,KC2JA;EACE,sBAAA;EACA,cAAA;EACA,cAAA;EACA,eAAA;EACA,UAAA;EACA,mBAAA;;ADjKF,KCoKA;EACE,wBAAA;;ADrKF,KCwKA;EACE,cAAA;;ADzKF,KC4KA;AD5KA,KC4KiB;EACf,sBAAA;EACA,UAAA;;AD9KF,KCiLA,cAAa;ADjLb,KCiL0C,cAAa;EACrD,YAAA;;ADlLF,KCqLA;EACE,6BAAA;EACA,oBAAA;;ADvLF,KC0LA,cAAa;EACX,wBAAA;;AD3LF,KC8LA;EACE,0BAAA;EACA,aAAA;;ADhMF,KCmMA;EACE,cAAA;;ADpMF,KCuMA;EACE,kBAAA;;ADxMF,KC2MA;EACE,aAAA;;AD5MF,KC+MA;EACE,aAAA;;ADhNF,KCmNA;ADnNA,KCmNO;ADnNP,KCmNgB;ADnNhB,KCmNuB;ADnNvB,KCmN8B;ADnN9B,KCmNqC;ADnNrC,KCmNyC;ADnNzC,KCmN6C;EAC3C,SAAA;EACA,UAAA;EACA,SAAA;EACA,eAAA;EACA,aAAA;EACA,sBAAA;EACA,gBAAA;;AD1NF,KC6NA;EACE,kBAAA;EACA,yBAAA;EACA,iBAAA;;ADhOF,KAOE;EACE,eAAA;EACA,SAAA;;AATJ,KAgBE,MAAK,aAAa;EAChB,cAAA;;AAjBJ,KAoBE,MAAK,aAAa;AApBpB,KAoBiD,SAAQ;EACrD,cAAA;;AArBJ,KAwBE,MAAK,aAAa;AAxBpB,KAwB4C,SAAQ;EAChD,cAAA;;AAzBJ,KA4BE,MAAK,aAAa;AA5BpB,KA4B6C,SAAQ;EACjD,cAAA;;AA7BJ,KAgCE,MAAK,aAAa;AAhCpB,KAgCmC,SAAQ;EACvC,cAAA;;AAjCJ,KAoCE;EACE,qBAAA;EACA,cAAA;EACA,YAAA;EACA,gBAAA;;AAEA,KANF,EAMG;EACC,0BAAA;EACA,eAAA;EACA,mBAAA;;AA7CN,KAiDE;AAjDF,KAiDU;EACN,YAAA;EACA,gBAAA;EACA,UAAA;EACA,gBAAA;;AArDJ,KAwDE;EACE,YAAA;EACA,SAAA;EACA,gBAAA;;AA3DJ,KA8DE;AA9DF,KA8DU;EACN,YAAA;;AA/DJ,KAkEE;EACE,kBAAA;EACA,gBAAA;EACA,MAAM,aAAN;EACA,mBAAmB,WAAnB;EACA,WAAW,WAAX;EACA,UAAA;EACA,WAAA;EACA,YAAA;EACA,UAAA;EACA,mBAAA;EACA,SAAA;;AAGF,KAAC;EACC,iBAAA;EACA,eAAA;EACA,iBAAA;EACA,SAAA;EACA,SAAA;EACA,OAAA;EACA,QAAA;EACA,gBAAA;EACA,gBAAA;;AAzFJ,KA6FE;EACE,qBAAA;EACA,WAAA;EACA,YAAA;EACA,yBAAA;EACA,UAAA;EACA,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,WAAA;EACA,mBAAA;EACA,kBAAA;;AAxGJ,KA6FE,oBAaE;EACE,qBAAA;EACA,mBAAA;;AA5GN,KAgHE;EACE,eAAA;EACA,WAAA;EACA,SAAA;EACA,QAAA;EACA,OAAA;EACA,WAAA;EACA,qBAAA;EACA,oBAAA;EACA,aAAA;EACA,sBAAA;EACA,sCAAA;EACA,8BAAA;EACA,YAAA;EACA,eAAA;EACA,SAAA;EACA,WAAA;EACA,mBAAA;EACA,eAAA;EACA,6BAAA;;AAnIJ,KAgHE,gBAqBE;EACE,kBAAA;EACA,cAAA;EACA,WAAA;EACA,YAAA;EACA,mBAAA;EACA,kBAAA;;AAEA,KA7BJ,gBAqBE,yBAQG;EACC,eAAA;;AA9IR,KAgHE,gBAqBE,yBAYE;EACE,kBAAA;EACA,YAAA;EACA,QAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;EACA,cAAA;EACA,mBAAA;EACA,WAAA;EACA,kBAAA;EACA,kBAAA;EACA,oBAAA;EACA,gBAAA;;AAGF,KAjDJ,gBAqBE,yBA4BG;EACC,cAAA;EACA,SAAS,EAAT;EACA,kBAAA;EACA,QAAA;EACA,OAAA;EACA,WAAA;EACA,YAAA;EACA,mBAAA;;AAzKR,KA8KE;AA9KF,KA+KE;EACE,qBAAA;EACA,oBAAA;EACA,aAAA;EACA,2BAAA;EACA,mBAAA;EACA,sBAAA;;AArLJ,KAwLE;EACE,gBAAA;EACA,kBAAA;;AA1LJ,KA6LE;EACE,WAAA;EACA,YAAA;EACA,kBAAA;EACA,gBAAgB,ymEAAhB;;AAjMJ,KAoME;EACE,qBAAA;EACA,oBAAA;EACA,aAAA;EACA,2BAAA;EACA,mBAAA;EACA,sBAAA;EACA,eAAA;EACA,UAAA;EACA,gBAAA;;AA7MJ,KAgNE,sBAAqB,IAAI;EACvB,kBAAA;;AAjNJ,KAoNE;EACE,cAAA;EACA,cAAA;EACA,kBAAA;EACA,mBAAA;EACA,kBAAA;;AAzNJ,KA4NE;EACE,aAAA;EACA,kBAAA;;AA9NJ,KAiOE,6BAA6B;EAC3B,sBAAA;;AAlOJ,KAqOE;EACE,eAAA;EACA,cAAA;EACA,mBAAA;EACA,kBAAA;EACA,gBAAA;;AA1OJ,KA6OE,yBACE;EACE,mBAAA;EACA,cAAA;;AAhPN,KAoPE,yBACE;EACE,mBAAA;EACA,cAAA;;AAOF,KAHF;AAGE,KAFF;AAEE,KADF;AACK,KAHL,sBAGM,MAAM;AAAP,KAFL,uBAEM,MAAM;AAAP,KADL,sBACM,MAAM;EACR,qBAAA;EACA,qBAAA;EACA,eAAA;EACA,eAAA;EACA,sBAAA;EACA,oCAAA;EACA,YAAA;EACA,kBAAA;EACA,eAAA;EACA,gBAAA;;AAxQN,KA6QE,sBAAqB;AA7QvB,KA8QE,uBAAsB;AA9QxB,KA+QE,sBAAqB;AA/QvB,KAgRE,sBAAqB;AAhRvB,KAiRE,uBAAsB;AAjRxB,KAkRE,sBAAqB;EACnB,aAAA;EACA,qBAAA;;AApRJ,KAuRE,sBAAqB;AAvRvB,KAwRE,uBAAsB;AAxRxB,KAyRE,sBAAqB;EACnB,mBAAmB,eAAnB;EACA,WAAW,eAAX;;AAIA,KADF;AACK,KADL,sBACM,MAAM;EACR,kBAAA;EACA,SAAA;EACA,QAAA;EACA,SAAA;EACA,yBAAA;EACA,8BAAA;EACA,yBAAA;EACA,gBAAA;EACA,eAAA;;AAMF,KAFF,sBAAqB;AAEnB,KADF,sBAAqB;AAChB,KAFL,sBAAqB,MAEf,MAAM;AAAP,KADL,sBAAqB,MACf,MAAM;EACR,8BAAA;;AAKF,KADF,sBAAqB;AAChB,KADL,sBAAqB,OACf,MAAM;EACR,oCAAA;;AAKF,KADF;AACK,KADL,uBACM,MAAM;EACR,kBAAA;EACA,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oCAAA;;AA/TN,KAmUE,uBAAsB;AAnUxB,KAoUE,uBAAsB;EACpB,8BAAA;;AArUJ,KAwUE,uBAAsB;EACpB,oCAAA;;AAIA,KADF;AACK,KADL,sBACM,MAAM;EACR,kBAAA;EACA,mBAAA;EACA,kBAAA;EACA,sBAAA;EACA,8BAAA;EACA,oCAAA;;AAGF,KAVF,sBAUG;AAAQ,KAVX,sBAUY;EACR,8BAAA;EACA,oCAAA;;AAGF,KAfF,sBAeG;EACC,8BAAA;EACA,oCAAA;;AAGF,KApBF,sBAoBI;EACA,SAAA;;AAjWN,KAqWE;EACE,eAAA;EACA,eAAA;EACA,eAAA;;AAxWJ,KA2WE;AA3WF,KA2WkC;EAC9B,kBAAA;EACA,mBAAA;;AAEA,KAJF,+BAIG;AAAD,KAJ8B,uCAI7B;EACC,SAAS,EAAT;EACA,kBAAA;EACA,SAAA;EACA,OAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;EACA,mBAAA;;AAOE,KAHN,gCACG,QACG,iCACC;AAAD,KAHN,gCACG,QACuC,yCACnC;EACC,SAAS,EAAT;EACA,kBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,WAAA;EACA,mBAAmB,cAAnB;EACA,WAAW,cAAX;EACA,kBAAA;EACA,yBAAA;;AAxYV,KA8YE;EACE,eAAA;EACA,+BAAA;;AAhZJ,KA8YE,uCAIE;EACE,qBAAA;EACA,cAAA;EACA,gBAAA;EACA,WAAA;EACA,mBAAA;EACA,WAAA;EACA,cAAA;EACA,kBAAA;EACA,mBAAA;EACA,kBAAA;EACA,gBAAA;;AAGF,KAlBF,uCAkBG;EACC,oCAAA;;AAjaN,KAqaE;EACE,WAAA;EACA,YAAA;EACA,qBAAA;EACA,eAAA;EACA,eAAA;EACA,sBAAA;EACA,kBAAA;EACA,gBAAgB,ijBAAhB;;AAEA,KAVF,uBAUG;EACC,WAAA;;AAGF,KAdF,uBAcG;EACC,WAAA;EACA,aAAA;;AArbN,KAybE;EACE,cAAA;EACA,WAAA;EACA,SAAA;EACA,sBAAA;;AA7bJ,KAgcE;EACE,eAAA;EACA,SAAA;EACA,SAAA;EACA,OAAA;EACA,WAAA;EACA,SAAA;EACA,UAAA;EACA,gBAAA;EACA,mBAAA;EACA,wCAAA;;AA1cJ,KAgcE,eAYE;EACE,SAAA;EACA,UAAA;;AA9cN,KAkdE;EACE,kBAAA;EACA,cAAA;EACA,WAAA;EACA,aAAA;EACA,eAAA;EACA,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,qBAAA;EACA,oBAAA;EACA,wBAAA;EACA,mBAAA;;AAEA,KAfF,uBAeG;AAAQ,KAfX,uBAeY;AAAQ,KAfpB,uBAeqB;AAAQ,KAf7B,uBAe8B;AAAS,KAfvC,uBAewC,MAAM;AAAQ,KAftD,uBAeuD,OAAO;EAC1D,qBAAA;EACA,oBAAA;EACA,wBAAA;EACA,mBAAA;;AAreN,KAyeE,uBAAsB;EACpB,SAAS,EAAT;EACA,kBAAA;EACA,MAAA;EACA,QAAA;EACA,SAAA;EACA,OAAA;EACA,YAAA;;AAhfJ,KAmfE,6BAA4B;EAC1B,gBAAgB,+8FAAhB;;AApfJ,KAufE,8BAA6B;EAC3B,gBAAgB,unEAAhB;;AAxfJ,KA2fE,gCAA+B;EAC7B,gBAAgB,2iHAAhB;;AA5fJ,KA+fE,uBAAsB;AA/fxB,KAggBE,uBAAsB;EACpB,aAAA;EACA,mBAAA;;AAlgBJ,KAqgBE,uBAAsB,MAAM;AArgB9B,KAsgBE,uBAAsB,MAAM;EAC1B,UAAA;;AAvgBJ,KA0gBE,uBAAsB;EACpB,mBAAA;;AA3gBJ,KA8gBE,uBAAsB,OAAO;EAC3B,UAAA;;AA/gBJ,KAkhBE;EACE,aAAA;;AAnhBJ,KAshBE,uBAAsB;EACpB,cAAA;;AAvhBJ,KA0hBE;EACE,cAAA;EAEA,oBAAA;EACA,cAAA;EACA,eAAA;EACA,iBAAA;;AAhiBJ,KA0hBE,eAQE;EACE,eAAA;EACA,SAAA;;AAEA,KAZJ,eAQE,EAIG,IAAI;EACH,mBAAA;;AAviBR,KA0hBE,eAiBE;AA3iBJ,KA0hBE,eAiB2B;EACvB,mBAAA;EACA,UAAA;EACA,gBAAA;EACA,mBAAA;EACA,aAAA;EACA,mBAAA;EAEA,4BAAA;;AAnjBN,KA0hBE,eA6BE;EACE,mBAAA;EAEA,2BAAA;EACA,iBAAA;;AA3jBN,KA0hBE,eA6BE,8BAME;EACE,kBAAA;EACA,gBAAA;EACA,eAAA;EACA,gBAAA;EACA,gCAAA;EACA,sBAAA;;AAnkBR,KA0hBE,eA6BE,8BAME,GAQE;EACE,cAAA;EACA,eAAA;EACA,gBAAA;EACA,cAAA;EACA,yBAAA;;AA1kBV,KA0hBE,eA6BE,8BAuBE;EACE,gBAAA;EACA,gBAAA;EACA,mBAAA;EACA,UAAA;;AAllBR,KA0hBE,eA6BE,8BAuBE,GAME;EACE,kBAAA;EACA,gBAAA;EACA,eAAA;EACA,cAAA;EACA,UAAA;;AAEA,KAjER,eA6BE,8BAuBE,GAME,GAOG;EACC,SAAS,GAAT;EACA,qBAAA;EACA,YAAA;EACA,aAAA;EACA,qBAAA;EACA,6BAAA;EACA,OAAA;EACA,kBAAA;EACA,mBAAmB,aAAnB;EACA,gBAAgB,aAAhB;EACA,cAAc,aAAd;EACA,WAAW,aAAX;;AAvmBZ,KA8mBE;EACE,cAAA;;AA/mBJ,KA8mBE,gBAGE;EACE,WAAA;EACA,yBAAA;;AAnnBN,KA8mBE,gBAQE,MAAK,UAAU;EACb,mBAAA;EACA,+BAAA;;AAxnBN,KA8mBE,gBAaE;EACE,kBAAA;EACA,gBAAA;EACA,WAAA;EACA,mBAAA;EACA,gBAAA;;AAhoBN,KA8mBE,gBAqBE,GAAE,IAAI;EACJ,4BAAA;;AApoBN,KA8mBE,gBAyBE;EACE,kBAAA;EACA,mBAAA;EACA,gCAAA;EACA,gBAAA;EACA,gBAAA;EACA,gBAAA;;AA7oBN,KA8mBE,gBAkCE,GAAE,UAAU;AAhpBhB,KA8mBE,gBAmCE,GAAE,UAAU;AAjpBhB,KA8mBE,gBAoCE,GAAE,UAAU;AAlpBhB,KA8mBE,gBAqCE,GAAE,UAAU;EACV,kBAAA;;AAppBN,KAwpBE,2BAA2B;EACzB,mBAAA;EACA,gBAAA;;AA1pBJ,KA6pBE;EACE,mBAAA;EACA,UAAA;;AA/pBJ,KAmqBE,GAAE;EACA,qBAAA;;AApqBJ,KAuqBE,GAAE,8BAA+B;EAC/B,cAAA;EACA,kBAAA;EACA,kBAAA;EACA,eAAA;EACA,oBAAA;;AA5qBJ,KA+qBE,GAAE,8BAA+B;EAC/B,cAAA;EACA,kBAAA;EACA,gBAAA;;AAlrBJ,KAqrBE;EACE,UAAA;;AAtrBJ,KAyrBE;EACE,YAAA;EACA,kBAAA;;AA3rBJ,KA8rBE;EACE,cAAA;EACA,kBAAA;EACA,eAAA;EACA,mBAAA;EACA,cAAA;EACA,iBAAA;EACA,aAAA;;AArsBJ,KA8rBE,oCASE;EACE,cAAA;EACA,kBAAA;EACA,QAAA;EACA,UAAA;EACA,gBAAA;;AA5sBN,KAgtBE;EACE,kBAAA;EACA,qBAAA;EACA,WAAA;EACA,YAAA;EACA,sBAAA;EACA,mBAAA;;AAttBJ,KAytBE,8BAA6B;EAC3B,SAAS,EAAT;EACA,kBAAA;EACA,QAAA;EACA,SAAA;EACA,WAAA;EACA,WAAA;EACA,mBAAmB,cAAnB;EACA,WAAW,cAAX;EACA,kBAAA;EACA,yBAAA;;AAnuBJ,KAsuBE;EACE,8BAAA;;AAvuBJ,KA0uBE;EACE,mBAAA;;AA3uBJ,KA8uBE;EACE,mBAAA;;AA/uBJ,KAkvBE;EACE,WAAA;;AAnvBJ,KAsvBE;EACE,cAAA;EACA,eAAA;EACA,iBAAA;;AAzvBJ,KA4vBE;EACE,cAAA;;AA7vBJ,KAgwBE,GAAE,qBAAqB,UAAU;EAC/B,gBAAA;;AAjwBJ,KAowBE;EACE,eAAA;EACA,yBAAA;EACA,eAAA;EACA,iBAAA;;AAxwBJ,KA2wBE;EACE,eAAA;;AA5wBJ,KA+wBE;EACE,cAAA;EACA,eAAA;EACA,iBAAA;;AAlxBJ,KA+wBE,6BAKE;EACE,qBAAA;EACA,iBAAA;EACA,eAAA;EACA,yBAAA;EACA,kBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;;AAEA,KAfJ,6BAKE,EAUG;EACC,mBAAA;EACA,cAAA;;AAGF,KApBJ,6BAKE,EAeG;EACC,mBAAA;EACA,cAAA;;AAryBR,KA0yBE,6BAA4B,IAAI;EAC9B,kBAAA;;AA3yBJ,KA8yBE;EACE,cAAA;;AAEA,KAHF;AA9yBF,KA8yBE,6BAGK;EACD,eAAA;;AAlzBN,KAszBE;EACE,cAAA;EACA,eAAA;EACA,cAAA;;AAzzBJ,KA4zBE;EACE,YAAA;;AA7zBJ,KAg0BE;EACE,YAAA;;AAj0BJ,KAo0BE;EACE,WAAA;EACA,kBAAA;EACA,iBAAA;;AAv0BJ,KA00BE,sBAAsB;EACpB,SAAA;;AA30BJ,KA80BE,sBAAsB,EAAC,IAAI;EACzB,mBAAA;;AAIA,KADF,gCACG;AAAU,KADb,gCACc;EACV,wBAAA;;AAp1BN,KAw1BE;EACE,0BAAA;EACA,cAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAwB,kSAAxB;EACA,eAAA;EAEA,wBAAA;EACA,qBAAA;EACA,gBAAA;;AAl2BJ,KAq2BE,wBAAuB,IAAI;EACzB,mBAAA;;AAt2BJ,KAy2BE,wBAAuB;EACrB,aAAA;EACA,yBAAA;EACA,6CAAA;;AA52BJ,KA+2BE,wBAAuB;EACrB,aAAA;;AAh3BJ,KAm3BE;EACE,8BAAA;;AAp3BJ,KAu3BE;EACE,cAAA;EACA,wBAAA;EACA,mBAAA;EACA,cAAA;EACA,eAAA;EACA,iBAAA;EACA,gCAAA;;AA93BJ,KAu3BE,uBASE;EACE,sBAAA;;AAj4BN,KAq4BE;EACE,qBAAA;EACA,oBAAA;EACA,aAAA;EACA,uBAAA;EACA,mBAAA;EACA,eAAA;EACA,gBAAA;EACA,sBAAA;EACA,UAAA;EACA,gBAAA;EACA,cAAA;EACA,eAAA;;AAj5BJ,KAo5BE;EACE,aAAA;EACA,sBAAA;;AAt5BJ,KAy5BE;EACE,eAAA;;AA15BJ,KA65BE;EACE,kBAAA;EACA,mBAAA;EACA,cAAA;;AAh6BJ,KAm6BE,+BAA8B;EAC5B,SAAS,EAAT;EACA,kBAAA;EACA,QAAA;EACA,OAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;EACA,mBAAA;;AA36BJ,KA86BE,gCAA+B,QAAS;EACtC,cAAA;;AA/6BJ,KAk7BE,gCAA+B,QAAS,iCAAgC;EACtE,mBAAA;;AAn7BJ,KAs7BE,gCAA+B,QAAS,iCAAgC;EACtE,SAAS,EAAT;EACA,kBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,WAAA;EACA,mBAAmB,cAAnB;EACA,WAAW,cAAX;EACA,kBAAA;EACA,yBAAA;;AAh8BJ,KAm8BE;EACE,eAAA;;AAp8BJ,KAu8BE;EACE,qBAAA;EACA,oBAAA;EACA,aAAA;EACA,gBAAA;;AA38BJ,KA88BE;AA98BF,KA+8BE;EACE,UAAA;EACA,iBAAA;EACA,iBAAA;EACA,cAAA;EACA,YAAA;EACA,kBAAA;EACA,mBAAA;EACA,eAAA;;AAv9BJ,KA09BE,6BAA4B;AA19B9B,KA29BE,0BAAyB;EACvB,aAAA;;;AA59BJ,KAg+BE;EACE,WAAA;EACA,iBAAA;EACA,eAAA;EACA,YAAA;EACA,kBAAA;EACA,mBAAA;;AAt+BJ,KAy+BE,2BAA0B;EACxB,SAAS,GAAT;EACA,cAAA;;AA3+BJ,KA8+BE,2BAA0B;EACxB,mBAAA;;AA/+BJ,KAk/BE,2BAA0B;EACxB,aAAA;EACA,6CAAA;;AAp/BJ,KAu/BE;EACE,UAAA;EACA,mBAAA;EACA,qBAAA;;AA1/BJ,KA6/BE;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;;AAhgCJ,KAmgCE,sBAAsB;EACpB,eAAA;EACA,sBAAA;EACA,SAAA;;AAtgCJ,KAygCE;EACE,cAAA;;AA1gCJ,KAygCE,0BAGE;EACE,cAAA;;AA7gCN,KAygCE,0BAGE,KAGE;EACE,0BAAA;EACA,cAAA;EACA,eAAA;;AAlhCR,KAuhCE;EACE,kBAAA;EACA,UAAA;EACA,qBAAA;EACA,gBAAA;EACA,WAAA;EACA,YAAA;EACA,eAAA;EACA,sBAAA;EACA,mBAAA;EACA,UAAA;;AAjiCJ,KAuhCE,iBAYE;EACE,qBAAA;EACA,oBAAA;EACA,aAAA;EACA,YAAA;EACA,eAAA;EACA,mBAAmB,iBAAnB;EACA,WAAW,iBAAX;EACA,WAAA;EACA,eAAA;EACA,iBAAA;;AA7iCN,KAuhCE,iBAyBE,wBAAuB;AAhjC3B,KAuhCE,iBA0BE,wBAAuB;EACrB,sBAAA;EACA,oBAAA;EACA,cAAA;EACA,WAAA;;AArjCN,KAuhCE,iBAiCE,wBAAuB;EACrB,SAAS,cAAT;EACA,mBAAA;EACA,mBAAA;;AA3jCN,KAuhCE,iBAuCE,wBAAuB;EACrB,SAAS,aAAT;EACA,mBAAA;EACA,iBAAA;EACA,mBAAA;;AAlkCN,KAuhCE,iBA8CE;EACE,kBAAA;EACA,QAAA;EACA,SAAA;EACA,WAAA;EACA,YAAA;EACA,eAAA;EACA,kBAAA;EACA,mBAAA;EACA,SAAA;;AAGF,KA1DF,iBA0DG,IAAI,0BACH,wBAAuB,QAAS;AADlC,KA1DF,iBA0DG,IAAI,0BAEH,wBAAuB,QAAQ,MAAO;EACpC,mBAAmB,aAAnB;EACA,WAAW,aAAX;;AAJJ,KA1DF,iBA0DG,IAAI,0BAOH,wBAAuB,QAAS;AAPlC,KA1DF,iBA0DG,IAAI,0BAQH,wBAAuB,QAAQ,MAAO;EACpC,UAAA;EACA,mBAAA;;AAIJ,KAxEF,iBAwEG;EACC,kBAAA;EACA,kBAAA;;AAFF,KAxEF,iBAwEG,wBAIC;EACE,mBAAA;;AALJ,KAxEF,iBAwEG,wBAQC,wBAAuB;EACrB,mBAAA;EACA,kBAAA;;AAGF,KArFJ,iBAwEG,wBAaE;EACC,SAAS,KAAT;EACA,cAAA;EACA,kBAAA;EACA,QAAA;EACA,SAAA;EACA,cAAA;EACA,gBAAA;EACA,iBAAA;EACA,WAAA;EACA,mBAAA;EACA,WAAA;EACA,YAAA;;EAEA,kBAAA;EACA,mBAAA;EACA,mBAAA;;AA5nCR,KAioCE;EACE,kBAAA;;AAloCJ,KAqoCE,kBAAiB;EACf,SAAS,EAAT;EACA,kBAAA;EACA,WAAA;EACA,SAAA;EACA,aAAA;EACA,WAAA;EACA,YAAA;;AA5oCJ,KA+oCE,kBAAiB;EACf,SAAS,kBAAT;EACA,kBAAA;EACA,WAAA;EACA,SAAA;EACA,aAAA;EACA,gBAAA;EACA,iBAAA;EACA,cAAA;EACA,mBAAA;EACA,eAAA;EACA,mBAAA;EACA,gBAAA;;AA3pCJ,KA8pCE,sBAAqB;EACnB,YAAA;EACA,YAAY,qFAAZ;;AAhqCJ,KAmqCE,sBAAqB;EACnB,YAAA;EACA,gBAAA;EACA,4BAAA;;AAtqCJ,KAyqCE,yBAAwB;EACtB,SAAA;EACA,YAAY,oFAAZ;;AA3qCJ,KA8qCE,yBAAwB;EACtB,SAAA;EACA,gBAAA;EACA,4BAAA;;AAjrCJ,KAorCE,kBAAiB,MAAM;AAprCzB,KAqrCE,kBAAiB,MAAM;EACrB,cAAA;;AAtrCJ,KAyrCE;EACE,cAAA;EACA,eAAA;;AA3rCJ,KA8rCE,qBAAqB;EACnB,cAAA;;AA/rCJ,KAksCE;AAlsCF,KAksCW;EACP,gBAAA;;AAnsCJ,KAssCE;EACE,qBAAA;;AAIJ,mBAAsC;EACpC,KACE;IACE,eAAA;;EAFJ,KAKE;IACE,sBAAA;;EANJ,KASE,sBACE;IACE,cAAA;;EAXN,KAeE,uBACE;IACE,eAAA;;EAjBN,KAeE,uBAKE;EApBJ,KAeE,uBAK0B;IACtB,eAAA;;EArBN,KAeE,uBASE;IACE,eAAA;IACA,cAAA;IACA,gBAAA;;EA3BN,KAeE,uBAgBE;IACE,WAAA;IACA,YAAA;IACA,qBAAA;IACA,sBAAA;;EAnCN,KAuCE;IACE,UAAA;;EAEA,KAHF;EAvCF,KAuCE,eAGK;IACD,eAAA;;EA3CN,KAuCE,eAOE;IACE,uBAAA;;EA/CN,KAmDE;IACE,eAAA;;EApDJ,KAuDE;IACE,SAAA;;EAxDJ,KAuDE,gBAGE;IACE,eAAA;;EA3DN,KAuDE,gBAOE,sBACE;IACE,eAAA;;EAIA,KAbN,gBAOE,sBAKE;EACE,KAbN,gBAOE,sBAKgC;EAC5B,KAbN,gBAOE,sBAK+D;EAnEnE,KAuDE,gBAOE,sBAKE,6BACK;EApEX,KAuDE,gBAOE,sBAKgC,8BACzB;EApEX,KAuDE,gBAOE,sBAK+D,qBACxD;IACD,eAAA;;EArEV,KAuDE,gBAmBE;IACE,eAAA;;EA3EN,KAuDE,gBAmBE,6BAGE;IACE,eAAA;IACA,oBAAA;IACA,gBAAA;IACA,iBAAA;;EAjFR,KAuDE,gBA8BE,6BACE;IACE,eAAA;;EAvFR,KAuDE,gBAoCE;IACE,UAAA;;EA5FN,KAuDE,gBAoCE,+BAGE;EA9FN,KAuDE,gBAoCE,+BAGuC;IACnC,eAAA;;EA/FR,KAuDE,gBAoCE,+BAOE;IACE,eAAA;;EAnGR,KAuDE,gBAgDE;IACE,UAAA;;;AAMR,mBAAsC;EACpC,KACE;IACE,aAAA;;EAFJ,KAKE;IACE,cAAA","file":"assets-manager.css"}
components/assets-manager/assets/css/assets-manager.less CHANGED
@@ -39,6 +39,7 @@ body {
39
  /**
40
  * Placeholders
41
  */
 
42
  input[type="text"]::-moz-placeholder {
43
  color: #cccccc;
44
  }
@@ -64,6 +65,7 @@ body {
64
  color: #007acc;
65
  border: none;
66
  background: none;
 
67
  &:hover {
68
  text-decoration: underline;
69
  border: inherit;
@@ -137,7 +139,7 @@ body {
137
  .wbcr-gnz-panel {
138
  position: fixed;
139
  z-index: 50;
140
- top: 0;
141
  right: 0;
142
  left: 0;
143
  width: 100%;
@@ -153,6 +155,7 @@ body {
153
  color: #FFF;
154
  background: #23282d;
155
  font-size: 16px;
 
156
 
157
  .wbcr-gnz-panel__premium {
158
  position: relative;
@@ -161,9 +164,11 @@ body {
161
  height: 40px;
162
  background: #ffcb1e;
163
  margin-left: -30px;
 
164
  &:hover {
165
  cursor: pointer;
166
  }
 
167
  .wbcr-gnz-tooltip {
168
  position: relative;
169
  right: -30px;
@@ -179,6 +184,7 @@ body {
179
  padding: 5px 0 5px 0;
180
  line-height: 1.2;
181
  }
 
182
  &:after {
183
  display: block;
184
  content: '';
@@ -364,6 +370,7 @@ body {
364
  background: #FFD340 !important;
365
  box-shadow: 0 4px #BF9A17 !important;
366
  }
 
367
  &:active {
368
  background: #FFD340 !important;
369
  box-shadow: 0 2px #BF9A17 !important;
@@ -418,6 +425,7 @@ body {
418
  .wbcr-gnz-panel__checkbox-text-premium {
419
  display: inline;
420
  color: rgba(245, 245, 245, 0.3);
 
421
  b {
422
  display: inline-block;
423
  font-size: 9px;
@@ -431,6 +439,7 @@ body {
431
  border-radius: 3px;
432
  line-height: 1.5;
433
  }
 
434
  &::before {
435
  background: rgba(245, 245, 245, 0.3);
436
  }
@@ -449,6 +458,7 @@ body {
449
  &:hover {
450
  opacity: .7;
451
  }
 
452
  &:focus {
453
  opacity: .5;
454
  outline: none;
@@ -473,6 +483,7 @@ body {
473
  list-style: none;
474
  background: #F4F4F4;
475
  box-shadow: 2px 0 5px rgba(0, 0, 0, .2);
 
476
  li {
477
  margin: 0;
478
  padding: 0;
@@ -493,6 +504,7 @@ body {
493
  -ms-box-shadow: none;
494
  -webkit-box-shadow: none;
495
  -o-box-shadow: none;
 
496
  &:hover, &:focus, &:after, &:before, &:after:hover, &:before:hover {
497
  -moz-box-shadow: none;
498
  -ms-box-shadow: none;
@@ -561,6 +573,7 @@ body {
561
  p {
562
  font-size: 15px;
563
  margin: 0;
 
564
  &:not(:last-child) {
565
  margin-bottom: 25px;
566
  }
@@ -583,6 +596,7 @@ body {
583
  //border: 1px dashed #e0cb14;
584
  border-left: 2px solid #fff;
585
  margin-left: 10px;
 
586
  h3 {
587
  position: relative;
588
  margin: 0 0 20px;
@@ -599,17 +613,20 @@ body {
599
  text-transform: uppercase;
600
  }
601
  }
 
602
  ul {
603
  list-style: none;
604
  margin-left: 5px;
605
  margin-bottom: 20px;
606
  padding: 0;
 
607
  li {
608
  margin-bottom: 5px;
609
  font-weight: 600;
610
  font-size: 15px;
611
  color: #7d8871;
612
  padding: 0;
 
613
  &:before {
614
  content: " ";
615
  display: inline-block;
@@ -809,6 +826,7 @@ body {
809
  background: #ffcb1e;
810
  color: #403102;
811
  }
 
812
  &.wbcr-wgz-resource-type-css {
813
  background: #9757a5;
814
  color: #ffffff;
@@ -822,6 +840,7 @@ body {
822
 
823
  .wbcr-gnz-table__script-path {
824
  color: #BBBBBA;
 
825
  &, a {
826
  font-size: 12px;
827
  }
@@ -855,6 +874,12 @@ body {
855
  margin-bottom: 12px;
856
  }
857
 
 
 
 
 
 
 
858
  .wbcr-gnz-table__select {
859
  padding: 8px 28px 8px 10px;
860
  color: #4B4E51;
@@ -888,7 +913,7 @@ body {
888
 
889
  .wbcr-gnz-table__label {
890
  display: block;
891
- margin: 0 0 15px 10px;
892
  padding-bottom: 5px;
893
  color: #414B56;
894
  font-size: 13px;
@@ -1023,15 +1048,27 @@ body {
1023
  .wbcr-gnz-table__also {
1024
  font-size: 12px;
1025
  font-weight: bold;
 
1026
  }
1027
 
1028
  .wbcr-gnz-table__also .wbcr-gnz-table__label {
1029
- margin-bottom: 5px;
1030
  font-size: 12px;
 
 
1031
  }
1032
 
1033
  .wbcr-gnz-table__also-url {
1034
  color: #A9AAAA;
 
 
 
 
 
 
 
 
 
 
1035
  }
1036
 
1037
  .wbcr-gnz-switch {
@@ -1113,6 +1150,7 @@ body {
1113
  .wbcr-gnz-switch__slider {
1114
  background: #ababab;
1115
  }
 
1116
  .wbcr-gnz-switch__inner::after {
1117
  background: #d3d4d4;
1118
  font-style: normal;
@@ -1218,9 +1256,11 @@ body {
1218
  p {
1219
  font-size: 13px;
1220
  }
 
1221
  .wbcr-gnz-content {
1222
  padding: 32px 0 0 75px;
1223
  }
 
1224
  .wbcr-gnz-panel__left {
1225
  .wbcr-gnz-panel__item_value {
1226
  display: block;
@@ -1231,6 +1271,7 @@ body {
1231
  .wbcr-gnz-table__checkbox-text {
1232
  font-size: 13px;
1233
  }
 
1234
  .wbcr-gnz-panel__reset, .wbcr-gnz-panel__save {
1235
  font-size: 12px;
1236
  }
@@ -1252,9 +1293,11 @@ body {
1252
 
1253
  .wbcr-gnz-info {
1254
  padding: 0;
 
1255
  &, p {
1256
  font-size: 13px;
1257
  }
 
1258
  .wbcr-gnz-info__warning {
1259
  padding: 20px 20px 30px;
1260
  }
@@ -1266,21 +1309,26 @@ body {
1266
 
1267
  .wbcr-gnz-table {
1268
  margin: 0;
 
1269
  th {
1270
  font-size: 13px;
1271
  }
 
1272
  .wbcr-gnz-table__item {
1273
  .wbcr-gnz-table__item-name {
1274
  font-size: 14px;
1275
  }
 
1276
  .wbcr-gnz-table__item-author, .wbcr-gnz-table__item-version, .wbcr-use-by-comment {
1277
  &, a {
1278
  font-size: 12px;
1279
  }
1280
  }
1281
  }
 
1282
  .wbcr-gnz-table__script-name {
1283
  font-size: 14px;
 
1284
  b {
1285
  font-size: 11px;
1286
  font-weight: lighter;
@@ -1288,20 +1336,25 @@ body {
1288
  margin-right: 8px;
1289
  }
1290
  }
 
1291
  .wbcr-gnz-table__script-path {
1292
  a {
1293
  font-size: 11px;
1294
  }
1295
  }
 
1296
  .wbcr-gnz-table__column_switch {
1297
  width: 10%;
 
1298
  .wbcr-gnz-table__th-external-plugin, em {
1299
  font-size: 10px;
1300
  }
 
1301
  b {
1302
  font-size: 12px;
1303
  }
1304
  }
 
1305
  .wbcr-gnz-table__column_condition {
1306
  width: 35%;
1307
  }
39
  /**
40
  * Placeholders
41
  */
42
+
43
  input[type="text"]::-moz-placeholder {
44
  color: #cccccc;
45
  }
65
  color: #007acc;
66
  border: none;
67
  background: none;
68
+
69
  &:hover {
70
  text-decoration: underline;
71
  border: inherit;
139
  .wbcr-gnz-panel {
140
  position: fixed;
141
  z-index: 50;
142
+ top: 30px;
143
  right: 0;
144
  left: 0;
145
  width: 100%;
155
  color: #FFF;
156
  background: #23282d;
157
  font-size: 16px;
158
+ border-top: 2px solid #ffcb1e;
159
 
160
  .wbcr-gnz-panel__premium {
161
  position: relative;
164
  height: 40px;
165
  background: #ffcb1e;
166
  margin-left: -30px;
167
+
168
  &:hover {
169
  cursor: pointer;
170
  }
171
+
172
  .wbcr-gnz-tooltip {
173
  position: relative;
174
  right: -30px;
184
  padding: 5px 0 5px 0;
185
  line-height: 1.2;
186
  }
187
+
188
  &:after {
189
  display: block;
190
  content: '';
370
  background: #FFD340 !important;
371
  box-shadow: 0 4px #BF9A17 !important;
372
  }
373
+
374
  &:active {
375
  background: #FFD340 !important;
376
  box-shadow: 0 2px #BF9A17 !important;
425
  .wbcr-gnz-panel__checkbox-text-premium {
426
  display: inline;
427
  color: rgba(245, 245, 245, 0.3);
428
+
429
  b {
430
  display: inline-block;
431
  font-size: 9px;
439
  border-radius: 3px;
440
  line-height: 1.5;
441
  }
442
+
443
  &::before {
444
  background: rgba(245, 245, 245, 0.3);
445
  }
458
  &:hover {
459
  opacity: .7;
460
  }
461
+
462
  &:focus {
463
  opacity: .5;
464
  outline: none;
483
  list-style: none;
484
  background: #F4F4F4;
485
  box-shadow: 2px 0 5px rgba(0, 0, 0, .2);
486
+
487
  li {
488
  margin: 0;
489
  padding: 0;
504
  -ms-box-shadow: none;
505
  -webkit-box-shadow: none;
506
  -o-box-shadow: none;
507
+
508
  &:hover, &:focus, &:after, &:before, &:after:hover, &:before:hover {
509
  -moz-box-shadow: none;
510
  -ms-box-shadow: none;
573
  p {
574
  font-size: 15px;
575
  margin: 0;
576
+
577
  &:not(:last-child) {
578
  margin-bottom: 25px;
579
  }
596
  //border: 1px dashed #e0cb14;
597
  border-left: 2px solid #fff;
598
  margin-left: 10px;
599
+
600
  h3 {
601
  position: relative;
602
  margin: 0 0 20px;
613
  text-transform: uppercase;
614
  }
615
  }
616
+
617
  ul {
618
  list-style: none;
619
  margin-left: 5px;
620
  margin-bottom: 20px;
621
  padding: 0;
622
+
623
  li {
624
  margin-bottom: 5px;
625
  font-weight: 600;
626
  font-size: 15px;
627
  color: #7d8871;
628
  padding: 0;
629
+
630
  &:before {
631
  content: " ";
632
  display: inline-block;
826
  background: #ffcb1e;
827
  color: #403102;
828
  }
829
+
830
  &.wbcr-wgz-resource-type-css {
831
  background: #9757a5;
832
  color: #ffffff;
840
 
841
  .wbcr-gnz-table__script-path {
842
  color: #BBBBBA;
843
+
844
  &, a {
845
  font-size: 12px;
846
  }
874
  margin-bottom: 12px;
875
  }
876
 
877
+ .wbcr-gnz-table__select-wrapper {
878
+ &::before, &::after {
879
+ display: none !important;
880
+ }
881
+ }
882
+
883
  .wbcr-gnz-table__select {
884
  padding: 8px 28px 8px 10px;
885
  color: #4B4E51;
913
 
914
  .wbcr-gnz-table__label {
915
  display: block;
916
+ margin: 15px 0 15px 10px;
917
  padding-bottom: 5px;
918
  color: #414B56;
919
  font-size: 13px;
1048
  .wbcr-gnz-table__also {
1049
  font-size: 12px;
1050
  font-weight: bold;
1051
+ margin-top: 15px;
1052
  }
1053
 
1054
  .wbcr-gnz-table__also .wbcr-gnz-table__label {
 
1055
  font-size: 12px;
1056
+ padding: 5px 5px 5px 0;
1057
+ margin: 0;
1058
  }
1059
 
1060
  .wbcr-gnz-table__also-url {
1061
  color: #A9AAAA;
1062
+
1063
+ span {
1064
+ display: block;
1065
+
1066
+ a {
1067
+ text-decoration: underline;
1068
+ color: #adaeae;
1069
+ font-size: 12px;
1070
+ }
1071
+ }
1072
  }
1073
 
1074
  .wbcr-gnz-switch {
1150
  .wbcr-gnz-switch__slider {
1151
  background: #ababab;
1152
  }
1153
+
1154
  .wbcr-gnz-switch__inner::after {
1155
  background: #d3d4d4;
1156
  font-style: normal;
1256
  p {
1257
  font-size: 13px;
1258
  }
1259
+
1260
  .wbcr-gnz-content {
1261
  padding: 32px 0 0 75px;
1262
  }
1263
+
1264
  .wbcr-gnz-panel__left {
1265
  .wbcr-gnz-panel__item_value {
1266
  display: block;
1271
  .wbcr-gnz-table__checkbox-text {
1272
  font-size: 13px;
1273
  }
1274
+
1275
  .wbcr-gnz-panel__reset, .wbcr-gnz-panel__save {
1276
  font-size: 12px;
1277
  }
1293
 
1294
  .wbcr-gnz-info {
1295
  padding: 0;
1296
+
1297
  &, p {
1298
  font-size: 13px;
1299
  }
1300
+
1301
  .wbcr-gnz-info__warning {
1302
  padding: 20px 20px 30px;
1303
  }
1309
 
1310
  .wbcr-gnz-table {
1311
  margin: 0;
1312
+
1313
  th {
1314
  font-size: 13px;
1315
  }
1316
+
1317
  .wbcr-gnz-table__item {
1318
  .wbcr-gnz-table__item-name {
1319
  font-size: 14px;
1320
  }
1321
+
1322
  .wbcr-gnz-table__item-author, .wbcr-gnz-table__item-version, .wbcr-use-by-comment {
1323
  &, a {
1324
  font-size: 12px;
1325
  }
1326
  }
1327
  }
1328
+
1329
  .wbcr-gnz-table__script-name {
1330
  font-size: 14px;
1331
+
1332
  b {
1333
  font-size: 11px;
1334
  font-weight: lighter;
1336
  margin-right: 8px;
1337
  }
1338
  }
1339
+
1340
  .wbcr-gnz-table__script-path {
1341
  a {
1342
  font-size: 11px;
1343
  }
1344
  }
1345
+
1346
  .wbcr-gnz-table__column_switch {
1347
  width: 10%;
1348
+
1349
  .wbcr-gnz-table__th-external-plugin, em {
1350
  font-size: 10px;
1351
  }
1352
+
1353
  b {
1354
  font-size: 12px;
1355
  }
1356
  }
1357
+
1358
  .wbcr-gnz-table__column_condition {
1359
  width: 35%;
1360
  }
components/assets-manager/assets/css/reset.css CHANGED
@@ -1,251 +1,251 @@
1
- /**
2
- * Reset styles
3
- * @author Webcraftic <wordpress.webraftic@gmail.com>
4
- * @copyright Webcraftic 15.10.2018
5
- */
6
- *,
7
- *:before,
8
- *:after {
9
- -webkit-box-sizing: border-box;
10
- -moz-box-sizing: border-box;
11
- box-sizing: border-box;
12
- }
13
- h2,
14
- h3,
15
- h4,
16
- h5,
17
- h6,
18
- p,
19
- strong,
20
- b,
21
- span,
22
- em,
23
- i,
24
- a,
25
- div,
26
- main,
27
- section,
28
- li,
29
- button,
30
- input[type="submit"],
31
- input[type="reset"],
32
- .wbcr-gnz-switch-premium {
33
- font-family: Arial, "Helvetica Neue", sans-serif !important;
34
- font-size: 14px;
35
- font-style: normal;
36
- font-weight: normal;
37
- text-transform: none;
38
- text-shadow: none;
39
- }
40
- h1 {
41
- font-size: 2em;
42
- margin: 0.67em 0;
43
- }
44
- hr {
45
- box-sizing: content-box;
46
- height: 0;
47
- overflow: visible;
48
- }
49
- pre {
50
- font-family: monospace, monospace;
51
- font-size: 1em;
52
- }
53
- a {
54
- background-color: transparent;
55
- }
56
- abbr[title] {
57
- border-bottom: none;
58
- text-decoration: underline dotted;
59
- }
60
- b,
61
- strong {
62
- font-weight: bolder;
63
- }
64
- code,
65
- kbd,
66
- samp {
67
- font-family: monospace, monospace;
68
- font-size: 1em;
69
- }
70
- small {
71
- font-size: 80%;
72
- }
73
- sub,
74
- sup {
75
- font-size: 75%;
76
- line-height: 0;
77
- position: relative;
78
- vertical-align: baseline;
79
- }
80
- sub {
81
- bottom: -0.25em;
82
- }
83
- sup {
84
- top: -0.5em;
85
- }
86
- img {
87
- border-style: none;
88
- }
89
- button,
90
- input,
91
- optgroup,
92
- select,
93
- textarea {
94
- font-family: inherit;
95
- font-size: 100%;
96
- line-height: 1.15;
97
- margin: 0;
98
- height: auto;
99
- width: auto;
100
- }
101
- button,
102
- input,
103
- optgroup,
104
- select,
105
- textarea,
106
- button:hover,
107
- input:hover,
108
- optgroup:hover,
109
- select:hover,
110
- textarea:hover,
111
- button:focus,
112
- input:focus,
113
- optgroup:focus,
114
- select:focus,
115
- textarea:focus {
116
- -moz-box-shadow: none;
117
- -ms-box-shadow: none;
118
- -webkit-box-shadow: none;
119
- -o-box-shadow: none;
120
- }
121
- button,
122
- input {
123
- overflow: visible;
124
- }
125
- button,
126
- select {
127
- text-transform: none;
128
- }
129
- button,
130
- [type="button"],
131
- [type="reset"],
132
- [type="submit"] {
133
- -webkit-appearance: button;
134
- }
135
- button::-moz-focus-inner,
136
- [type="button"]::-moz-focus-inner,
137
- [type="reset"]::-moz-focus-inner,
138
- [type="submit"]::-moz-focus-inner {
139
- border-style: none;
140
- padding: 0;
141
- }
142
- button:-moz-focusring,
143
- [type="button"]:-moz-focusring,
144
- [type="reset"]:-moz-focusring,
145
- [type="submit"]:-moz-focusring {
146
- outline: 1px dotted ButtonText;
147
- }
148
- fieldset {
149
- padding: 0.35em 0.75em 0.625em;
150
- }
151
- legend {
152
- box-sizing: border-box;
153
- color: inherit;
154
- display: table;
155
- max-width: 100%;
156
- padding: 0;
157
- white-space: normal;
158
- }
159
- textarea {
160
- overflow: auto;
161
- }
162
- [type="checkbox"],
163
- [type="radio"] {
164
- box-sizing: border-box;
165
- padding: 0;
166
- }
167
- [type="number"]::-webkit-inner-spin-button,
168
- [type="number"]::-webkit-outer-spin-button {
169
- height: auto;
170
- }
171
- [type="search"] {
172
- -webkit-appearance: textfield;
173
- outline-offset: -2px;
174
- }
175
- [type="search"]::-webkit-search-decoration {
176
- -webkit-appearance: none;
177
- }
178
- ::-webkit-file-upload-button {
179
- -webkit-appearance: button;
180
- font: inherit;
181
- }
182
- fieldset {
183
- padding: 0.35em 0.75em 0.625em;
184
- }
185
- legend {
186
- box-sizing: border-box;
187
- color: inherit;
188
- display: table;
189
- max-width: 100%;
190
- padding: 0;
191
- white-space: normal;
192
- }
193
- progress {
194
- vertical-align: baseline;
195
- }
196
- textarea {
197
- overflow: auto;
198
- }
199
- [type=checkbox],
200
- [type=radio] {
201
- box-sizing: border-box;
202
- padding: 0;
203
- }
204
- [type=number]::-webkit-inner-spin-button,
205
- [type=number]::-webkit-outer-spin-button {
206
- height: auto;
207
- }
208
- [type=search] {
209
- -webkit-appearance: textfield;
210
- outline-offset: -2px;
211
- }
212
- [type=search]::-webkit-search-decoration {
213
- -webkit-appearance: none;
214
- }
215
- ::-webkit-file-upload-button {
216
- -webkit-appearance: button;
217
- font: inherit;
218
- }
219
- details {
220
- display: block;
221
- }
222
- summary {
223
- display: list-item;
224
- }
225
- template {
226
- display: none;
227
- }
228
- [hidden] {
229
- display: none;
230
- }
231
- table,
232
- caption,
233
- tbody,
234
- tfoot,
235
- thead,
236
- tr,
237
- th,
238
- td {
239
- margin: 0;
240
- padding: 0;
241
- border: 0;
242
- font-size: 100%;
243
- font: inherit;
244
- vertical-align: middle;
245
- line-height: 1.2;
246
- }
247
- table {
248
- table-layout: auto;
249
- border-collapse: collapse;
250
- border-spacing: 0;
251
- }
1
+ /**
2
+ * Reset styles
3
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
4
+ * @copyright Webcraftic 15.10.2018
5
+ */
6
+ *,
7
+ *:before,
8
+ *:after {
9
+ -webkit-box-sizing: border-box;
10
+ -moz-box-sizing: border-box;
11
+ box-sizing: border-box;
12
+ }
13
+ h2,
14
+ h3,
15
+ h4,
16
+ h5,
17
+ h6,
18
+ p,
19
+ strong,
20
+ b,
21
+ span,
22
+ em,
23
+ i,
24
+ a,
25
+ div,
26
+ main,
27
+ section,
28
+ li,
29
+ button,
30
+ input[type="submit"],
31
+ input[type="reset"],
32
+ .wbcr-gnz-switch-premium {
33
+ font-family: Arial, "Helvetica Neue", sans-serif !important;
34
+ font-size: 14px;
35
+ font-style: normal;
36
+ font-weight: normal;
37
+ text-transform: none;
38
+ text-shadow: none;
39
+ }
40
+ h1 {
41
+ font-size: 2em;
42
+ margin: 0.67em 0;
43
+ }
44
+ hr {
45
+ box-sizing: content-box;
46
+ height: 0;
47
+ overflow: visible;
48
+ }
49
+ pre {
50
+ font-family: monospace, monospace;
51
+ font-size: 1em;
52
+ }
53
+ a {
54
+ background-color: transparent;
55
+ }
56
+ abbr[title] {
57
+ border-bottom: none;
58
+ text-decoration: underline dotted;
59
+ }
60
+ b,
61
+ strong {
62
+ font-weight: bolder;
63
+ }
64
+ code,
65
+ kbd,
66
+ samp {
67
+ font-family: monospace, monospace;
68
+ font-size: 1em;
69
+ }
70
+ small {
71
+ font-size: 80%;
72
+ }
73
+ sub,
74
+ sup {
75
+ font-size: 75%;
76
+ line-height: 0;
77
+ position: relative;
78
+ vertical-align: baseline;
79
+ }
80
+ sub {
81
+ bottom: -0.25em;
82
+ }
83
+ sup {
84
+ top: -0.5em;
85
+ }
86
+ img {
87
+ border-style: none;
88
+ }
89
+ button,
90
+ input,
91
+ optgroup,
92
+ select,
93
+ textarea {
94
+ font-family: inherit;
95
+ font-size: 100%;
96
+ line-height: 1.15;
97
+ margin: 0;
98
+ height: auto;
99
+ width: auto;
100
+ }
101
+ button,
102
+ input,
103
+ optgroup,
104
+ select,
105
+ textarea,
106
+ button:hover,
107
+ input:hover,
108
+ optgroup:hover,
109
+ select:hover,
110
+ textarea:hover,
111
+ button:focus,
112
+ input:focus,
113
+ optgroup:focus,
114
+ select:focus,
115
+ textarea:focus {
116
+ -moz-box-shadow: none;
117
+ -ms-box-shadow: none;
118
+ -webkit-box-shadow: none;
119
+ -o-box-shadow: none;
120
+ }
121
+ button,
122
+ input {
123
+ overflow: visible;
124
+ }
125
+ button,
126
+ select {
127
+ text-transform: none;
128
+ }
129
+ button,
130
+ [type="button"],
131
+ [type="reset"],
132
+ [type="submit"] {
133
+ -webkit-appearance: button;
134
+ }
135
+ button::-moz-focus-inner,
136
+ [type="button"]::-moz-focus-inner,
137
+ [type="reset"]::-moz-focus-inner,
138
+ [type="submit"]::-moz-focus-inner {
139
+ border-style: none;
140
+ padding: 0;
141
+ }
142
+ button:-moz-focusring,
143
+ [type="button"]:-moz-focusring,
144
+ [type="reset"]:-moz-focusring,
145
+ [type="submit"]:-moz-focusring {
146
+ outline: 1px dotted ButtonText;
147
+ }
148
+ fieldset {
149
+ padding: 0.35em 0.75em 0.625em;
150
+ }
151
+ legend {
152
+ box-sizing: border-box;
153
+ color: inherit;
154
+ display: table;
155
+ max-width: 100%;
156
+ padding: 0;
157
+ white-space: normal;
158
+ }
159
+ textarea {
160
+ overflow: auto;
161
+ }
162
+ [type="checkbox"],
163
+ [type="radio"] {
164
+ box-sizing: border-box;
165
+ padding: 0;
166
+ }
167
+ [type="number"]::-webkit-inner-spin-button,
168
+ [type="number"]::-webkit-outer-spin-button {
169
+ height: auto;
170
+ }
171
+ [type="search"] {
172
+ -webkit-appearance: textfield;
173
+ outline-offset: -2px;
174
+ }
175
+ [type="search"]::-webkit-search-decoration {
176
+ -webkit-appearance: none;
177
+ }
178
+ ::-webkit-file-upload-button {
179
+ -webkit-appearance: button;
180
+ font: inherit;
181
+ }
182
+ fieldset {
183
+ padding: 0.35em 0.75em 0.625em;
184
+ }
185
+ legend {
186
+ box-sizing: border-box;
187
+ color: inherit;
188
+ display: table;
189
+ max-width: 100%;
190
+ padding: 0;
191
+ white-space: normal;
192
+ }
193
+ progress {
194
+ vertical-align: baseline;
195
+ }
196
+ textarea {
197
+ overflow: auto;
198
+ }
199
+ [type=checkbox],
200
+ [type=radio] {
201
+ box-sizing: border-box;
202
+ padding: 0;
203
+ }
204
+ [type=number]::-webkit-inner-spin-button,
205
+ [type=number]::-webkit-outer-spin-button {
206
+ height: auto;
207
+ }
208
+ [type=search] {
209
+ -webkit-appearance: textfield;
210
+ outline-offset: -2px;
211
+ }
212
+ [type=search]::-webkit-search-decoration {
213
+ -webkit-appearance: none;
214
+ }
215
+ ::-webkit-file-upload-button {
216
+ -webkit-appearance: button;
217
+ font: inherit;
218
+ }
219
+ details {
220
+ display: block;
221
+ }
222
+ summary {
223
+ display: list-item;
224
+ }
225
+ template {
226
+ display: none;
227
+ }
228
+ [hidden] {
229
+ display: none;
230
+ }
231
+ table,
232
+ caption,
233
+ tbody,
234
+ tfoot,
235
+ thead,
236
+ tr,
237
+ th,
238
+ td {
239
+ margin: 0;
240
+ padding: 0;
241
+ border: 0;
242
+ font-size: 100%;
243
+ font: inherit;
244
+ vertical-align: middle;
245
+ line-height: 1.2;
246
+ }
247
+ table {
248
+ table-layout: auto;
249
+ border-collapse: collapse;
250
+ border-spacing: 0;
251
+ }
components/assets-manager/assets/js/assets-manager.js CHANGED
@@ -26,8 +26,7 @@
26
  if( typeof wbcrChangeHandleState == 'function' ) {
27
  wbcrChangeHandleState(this, 1);
28
  }
29
- }
30
- else {
31
  $(this).closest('label').find('input[type="hidden"]').val('');
32
  $(this).closest('tr').find('.wbcr-assets-manager-enable').hide();
33
  $(this).closest('tr').find('.wbcr-assets-manager-enable-placeholder').show();
@@ -42,10 +41,10 @@
42
 
43
  $('.wbcr-gnz-action-select').on('change', function(ev) {
44
  var selectElement = $(this).children(':selected');
45
- $(this).closest('span').find('.wbcr-assets-manager').hide();
46
 
47
  if( selectElement.val() != 'current' ) {
48
- $(this).closest('span').find('.wbcr-assets-manager.' + selectElement.val()).show();
49
  }
50
  });
51
 
26
  if( typeof wbcrChangeHandleState == 'function' ) {
27
  wbcrChangeHandleState(this, 1);
28
  }
29
+ } else {
 
30
  $(this).closest('label').find('input[type="hidden"]').val('');
31
  $(this).closest('tr').find('.wbcr-assets-manager-enable').hide();
32
  $(this).closest('tr').find('.wbcr-assets-manager-enable-placeholder').show();
41
 
42
  $('.wbcr-gnz-action-select').on('change', function(ev) {
43
  var selectElement = $(this).children(':selected');
44
+ $(this).closest('.wbcr-assets-manager-enable').find('.wbcr-assets-manager').hide();
45
 
46
  if( selectElement.val() != 'current' ) {
47
+ $(this).closest('.wbcr-assets-manager-enable').find('.wbcr-assets-manager.' + selectElement.val()).show();
48
  }
49
  });
50
 
components/assets-manager/gonzales.php CHANGED
@@ -1,88 +1,96 @@
1
  <?php
2
- /**
3
- * Plugin Name: Webcraftic Assets manager
4
- * Plugin URI: https://wordpress.org/plugins/gonzales/
5
- * Description: Increase the speed of the pages by disabling unused scripts (.JS) and styles (.CSS). Make your website REACTIVE!
6
- * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
- * Version: 1.0.7
8
- * Text Domain: gonzales
9
- * Domain Path: /languages/
10
- * Author URI: https://clearfy.pro
11
- * Framework Version: FACTORY_409_VERSION
12
- */
13
-
14
- // Exit if accessed directly
15
- if( !defined('ABSPATH') ) {
16
- exit;
17
- }
18
-
19
- define('WGZ_PLUGIN_VERSION', '1.0.7');
20
-
21
- // Fix for ithemes sync. When the ithemes sync plugin accepts the request, set the WP_ADMIN constant,
22
- // after which the plugin Clearfy begins to create errors, and how the logic of its work is broken.
23
- // Solution to simply terminate the plugin if there is a request from ithemes sync
24
- // --------------------------------------
25
- if( defined('DOING_AJAX') && DOING_AJAX && isset($_REQUEST['action']) && $_REQUEST['action'] == 'ithemes_sync_request' ) {
26
- return;
27
- }
28
-
29
- if( isset($_GET['ithemes-sync-request']) && !empty($_GET['ithemes-sync-request']) ) {
30
- return;
31
- }
32
- // ----------------------------------------
33
-
34
- define('WGZ_PLUGIN_DIR', dirname(__FILE__));
35
- define('WGZ_PLUGIN_BASE', plugin_basename(__FILE__));
36
- define('WGZ_PLUGIN_URL', plugins_url(null, __FILE__));
37
-
38
-
39
-
40
- if( !defined('LOADING_ASSETS_MANAGER_AS_ADDON') ) {
41
- require_once(WGZ_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php');
42
- require_once(WGZ_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php');
43
- }
44
-
45
- $plugin_info = array(
46
- 'prefix' => 'wbcr_gnz_',
47
- 'plugin_name' => 'wbcr_gonzales',
48
- 'plugin_title' => __('Webcraftic assets manager', 'gonzales'),
49
- 'plugin_version' => WGZ_PLUGIN_VERSION,
50
- 'plugin_build' => 'free',
51
- 'updates' => WGZ_PLUGIN_DIR . '/updates/'
52
- );
53
-
54
- /**
55
- * Проверяет совместимость с Wordpress, php и другими плагинами.
56
- */
57
- $compatibility = new Wbcr_FactoryClearfy_Compatibility(array_merge($plugin_info, array(
58
- 'plugin_already_activate' => defined('WGZ_PLUGIN_ACTIVE'),
59
- 'plugin_as_component' => defined('LOADING_ASSETS_MANAGER_AS_ADDON'),
60
- 'plugin_dir' => WGZ_PLUGIN_DIR,
61
- 'plugin_base' => WGZ_PLUGIN_BASE,
62
- 'plugin_url' => WGZ_PLUGIN_URL,
63
- 'required_php_version' => '5.3',
64
- 'required_wp_version' => '4.2.0',
65
- 'required_clearfy_check_component' => true
66
- )));
67
-
68
- /**
69
- * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
70
- * а пользователь получит предупреждение.
71
- */
72
- if( !$compatibility->check() ) {
73
- return;
74
- }
75
-
76
- define('WGZ_PLUGIN_ACTIVE', true);
77
-
78
- if( !defined('LOADING_ASSETS_MANAGER_AS_ADDON') ) {
79
- require_once(WGZ_PLUGIN_DIR . '/libs/factory/core/boot.php');
80
- }
81
-
82
- require_once(WGZ_PLUGIN_DIR . '/includes/class.plugin.php');
83
-
84
- if( !defined('LOADING_ASSETS_MANAGER_AS_ADDON') ) {
85
- new WGZ_Plugin(__FILE__, $plugin_info);
86
- }
 
 
 
 
 
 
 
 
87
 
88
 
1
  <?php
2
+ /**
3
+ * Plugin Name: Webcraftic Assets manager
4
+ * Plugin URI: https://wordpress.org/plugins/gonzales/
5
+ * Description: Increase the speed of the pages by disabling unused scripts (.JS) and styles (.CSS). Make your website REACTIVE!
6
+ * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
+ * Version: 1.0.7
8
+ * Text Domain: gonzales
9
+ * Domain Path: /languages/
10
+ * Author URI: https://clearfy.pro
11
+ * Framework Version: FACTORY_409_VERSION
12
+ */
13
+
14
+ // Exit if accessed directly
15
+ if ( ! defined( 'ABSPATH' ) ) {
16
+ exit;
17
+ }
18
+ if ( ! defined( 'WGZ_PLUGIN_VERSION' ) ) {
19
+ define( 'WGZ_PLUGIN_VERSION', '1.0.7' );
20
+ }
21
+
22
+ // Fix for ithemes sync. When the ithemes sync plugin accepts the request, set the WP_ADMIN constant,
23
+ // after which the plugin Clearfy begins to create errors, and how the logic of its work is broken.
24
+ // Solution to simply terminate the plugin if there is a request from ithemes sync
25
+ // --------------------------------------
26
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'ithemes_sync_request' ) {
27
+ return;
28
+ }
29
+
30
+ if ( isset( $_GET['ithemes-sync-request'] ) && ! empty( $_GET['ithemes-sync-request'] ) ) {
31
+ return;
32
+ }
33
+ // ----------------------------------------
34
+
35
+ if ( ! defined( 'WGZ_PLUGIN_DIR' ) ) {
36
+ define( 'WGZ_PLUGIN_DIR', dirname( __FILE__ ) );
37
+ }
38
+ if ( ! defined( 'WGZ_PLUGIN_BASE' ) ) {
39
+ define( 'WGZ_PLUGIN_BASE', plugin_basename( __FILE__ ) );
40
+ }
41
+ if ( ! defined( 'WGZ_PLUGIN_URL' ) ) {
42
+ define( 'WGZ_PLUGIN_URL', plugins_url( null, __FILE__ ) );
43
+ }
44
+
45
+
46
+
47
+ if ( ! defined( 'LOADING_ASSETS_MANAGER_AS_ADDON' ) ) {
48
+ require_once( WGZ_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php' );
49
+ require_once( WGZ_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php' );
50
+ }
51
+
52
+ $plugin_info = array(
53
+ 'prefix' => 'wbcr_gnz_',
54
+ 'plugin_name' => 'wbcr_gonzales',
55
+ 'plugin_title' => __( 'Webcraftic assets manager', 'gonzales' ),
56
+ 'plugin_version' => WGZ_PLUGIN_VERSION,
57
+ 'plugin_build' => 'free',
58
+ 'updates' => WGZ_PLUGIN_DIR . '/updates/'
59
+ );
60
+
61
+ /**
62
+ * Проверяет совместимость с Wordpress, php и другими плагинами.
63
+ */
64
+ $compatibility = new Wbcr_FactoryClearfy_Compatibility( array_merge( $plugin_info, array(
65
+ 'factory_version' => 'FACTORY_409_VERSION',
66
+ 'plugin_already_activate' => defined( 'WGZ_PLUGIN_ACTIVE' ),
67
+ 'plugin_as_component' => defined( 'LOADING_ASSETS_MANAGER_AS_ADDON' ),
68
+ 'plugin_dir' => WGZ_PLUGIN_DIR,
69
+ 'plugin_base' => WGZ_PLUGIN_BASE,
70
+ 'plugin_url' => WGZ_PLUGIN_URL,
71
+ 'required_php_version' => '5.3',
72
+ 'required_wp_version' => '4.2.0',
73
+ 'required_clearfy_check_component' => true
74
+ ) ) );
75
+
76
+ /**
77
+ * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
78
+ * а пользователь получит предупреждение.
79
+ */
80
+ if ( ! $compatibility->check() ) {
81
+ return;
82
+ }
83
+
84
+ define( 'WGZ_PLUGIN_ACTIVE', true );
85
+
86
+ if ( ! defined( 'LOADING_ASSETS_MANAGER_AS_ADDON' ) ) {
87
+ require_once( WGZ_PLUGIN_DIR . '/libs/factory/core/boot.php' );
88
+ }
89
+
90
+ require_once( WGZ_PLUGIN_DIR . '/includes/class.plugin.php' );
91
+
92
+ if ( ! defined( 'LOADING_ASSETS_MANAGER_AS_ADDON' ) ) {
93
+ new WGZ_Plugin( __FILE__, $plugin_info );
94
+ }
95
 
96
 
components/assets-manager/includes/class.configurate-assets.php CHANGED
@@ -2,9 +2,10 @@
2
 
3
  /**
4
  * Assets manager base class
5
- * @author Webcraftic <wordpress.webraftic@gmail.com>
 
6
  * @copyright (c) 05.11.2017, Webcraftic
7
- * @version 1.0
8
  */
9
 
10
  // Exit if accessed directly
@@ -13,33 +14,33 @@ if ( ! defined( 'ABSPATH' ) ) {
13
  }
14
 
15
  class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
16
-
17
  /**
18
  * Stores list of all available assets (used in rendering panel)
19
  *
20
  * @var array
21
  */
22
- public $collection = array();
23
-
24
  /**
25
  * Plugins for additional columns
26
  *
27
  * @var array
28
  */
29
- private $sided_plugins = array();
30
-
31
  /**
32
  * Css and js files excluded in sided plugins
33
  *
34
  * @var array
35
  */
36
- private $sided_plugin_files = array();
37
-
38
  /**
39
  * @var bool
40
  */
41
  private $is_user_can;
42
-
43
  /**
44
  * @param Wbcr_Factory409_Plugin $plugin
45
  */
@@ -47,11 +48,11 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
47
  parent::__construct( $plugin );
48
  $this->plugin = $plugin;
49
  }
50
-
51
  protected function isUserCan() {
52
  return current_user_can( 'manage_options' ) || current_user_can( 'manage_network' );
53
  }
54
-
55
  /**
56
  * Initilize entire machine
57
  */
@@ -59,78 +60,78 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
59
  if ( $this->getPopulateOption( 'disable_assets_manager', false ) ) {
60
  return;
61
  }
62
-
63
  $on_frontend = $this->getPopulateOption( 'disable_assets_manager_on_front' );
64
  $on_backend = $this->getPopulateOption( 'disable_assets_manager_on_backend', true );
65
  $is_panel = $this->getPopulateOption( 'disable_assets_manager_panel' );
66
-
67
  if ( ( ! is_admin() && ! $on_frontend ) || ( is_admin() && ! $on_backend ) ) {
68
- add_filter( 'script_loader_src', array( $this, 'unloadAssets' ), 10, 2 );
69
- add_filter( 'style_loader_src', array( $this, 'unloadAssets' ), 10, 2 );
70
  }
71
-
72
  if ( ! $is_panel && ( ( is_admin() && ! $on_backend ) || ( ! is_admin() && ! $on_frontend ) ) ) {
73
  if ( ! is_admin() ) {
74
- add_action( 'wp_enqueue_scripts', array( $this, 'appendAsset' ), - 100001 );
75
- add_action( 'wp_footer', array( $this, 'assetsManager' ), 100001 );
76
  } else {
77
- add_action( 'admin_enqueue_scripts', array( $this, 'appendAsset' ), - 100001 );
78
- add_action( 'admin_footer', array( $this, 'assetsManager' ), 100001 );
79
  }
80
  }
81
-
82
  if ( ! is_admin() && ! $on_frontend ) {
83
- add_action( 'wp_head', array( $this, 'collectAssets' ), 10000 );
84
- add_action( 'wp_footer', array( $this, 'collectAssets' ), 10000 );
85
  }
86
-
87
  if ( is_admin() && ! $on_backend ) {
88
- add_action( 'admin_head', array( $this, 'collectAssets' ), 10000 );
89
- add_action( 'admin_footer', array( $this, 'collectAssets' ), 10000 );
90
  }
91
-
92
  if ( ! $is_panel && ( ( is_admin() && ! $on_backend ) || ( ! is_admin() && ! $on_frontend ) ) ) {
93
  if ( defined( 'LOADING_ASSETS_MANAGER_AS_ADDON' ) ) {
94
- add_action( 'wbcr/clearfy/adminbar_menu_items', array( $this, 'clearfyAdminBarMenu' ) );
95
  } else {
96
- add_action( 'admin_bar_menu', array( $this, 'assetsManagerAdminBar' ), 1000 );
97
  }
98
  }
99
-
100
  if ( ! is_admin() && ! $on_frontend ) {
101
- add_action( 'init', array( $this, 'formSave' ) );
102
  }
103
-
104
  if ( is_admin() && ! $on_backend ) {
105
- add_action( 'admin_init', array( $this, 'formSave' ) );
106
  }
107
-
108
- add_action( 'plugins_loaded', array( $this, 'pluginsLoaded' ) );
109
- add_action( 'wbcr_gnz_form_save', array( $this, 'actionFormSave' ) );
110
-
111
- add_filter( 'wbcr_gnz_unset_disabled', array( $this, 'unsetDisabled' ), 10, 2 );
112
- add_filter( 'wbcr_gnz_get_additional_head_columns', array( $this, 'getAdditionalHeadColumns' ) );
113
- add_filter( 'wbcr_gnz_get_additional_controls_columns', array( $this, 'getAdditionalControlsColumns' ), 10, 4 );
114
-
115
- add_filter( 'autoptimize_filter_js_exclude', array( $this, 'aoptFilterJsExclude' ), 10, 2 );
116
- add_filter( 'autoptimize_filter_css_exclude', array( $this, 'aoptFilterCssExclude' ), 10, 2 );
117
- add_filter( 'wmac_filter_js_exclude', array( $this, 'wmacFilterJsExclude' ), 10, 2 );
118
- add_filter( 'wmac_filter_css_exclude', array( $this, 'wmacFilterCssExclude' ), 10, 2 );
119
- add_filter( 'wmac_filter_js_minify_excluded', array( $this, 'wmacFilterJsMinifyExclude' ), 10, 2 );
120
- add_filter( 'wmac_filter_css_minify_excluded', array( $this, 'wmacFilterCssMinifyExclude' ), 10, 2 );
121
  }
122
-
123
  function clearfyAdminBarMenu( $menu_items ) {
124
- $current_url = add_query_arg( array( 'wbcr_assets_manager' => 1 ) );
125
-
126
- $menu_items['assetsManager'] = array(
127
  'title' => '<span class="dashicons dashicons-list-view"></span> ' . __( 'Assets Manager', 'gonzales' ),
128
  'href' => $current_url
129
- );
130
-
131
  return $menu_items;
132
  }
133
-
134
  /**
135
  * @param WP_Admin_Bar $wp_admin_bar
136
  */
@@ -138,61 +139,61 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
138
  if ( ! $this->isUserCan() ) {
139
  return;
140
  }
141
-
142
- $current_url = add_query_arg( array( 'wbcr_assets_manager' => 1 ) );
143
-
144
- $args = array(
145
  'id' => 'assetsManager',
146
  'title' => __( 'Assets Manager', 'gonzales' ),
147
  'href' => $current_url
148
- );
149
  $wp_admin_bar->add_node( $args );
150
  }
151
-
152
  /**
153
  * Action plugins loaded
154
  */
155
  public function pluginsLoaded() {
156
  if ( ! is_admin() ) {
157
- $this->sided_plugins = array(
158
  'aopt' => 'autoptimize/autoptimize.php',
159
  'wmac' => 'minify-and-combine/minify-and-combine.php'
160
- );
161
  }
162
-
163
  if ( class_exists( 'WCL_Plugin' ) && ( WCL_Plugin::app()->getPopulateOption( 'remove_js_version', false ) || WCL_Plugin::app()->getPopulateOption( 'remove_css_version', false ) ) ) {
164
  $this->sided_plugins['wclp'] = 'clearfy/clearfy.php';
165
  }
 
166
 
167
-
168
-
169
  $this->sided_plugins = apply_filters( 'wbcr_gnz_sided_plugins', $this->sided_plugins );
170
  }
171
-
172
  function assetsManager() {
173
  if ( ! $this->isUserCan() || ! isset( $_GET['wbcr_assets_manager'] ) ) {
174
  return;
175
  }
176
-
177
  $current_url = esc_url( $this->getCurrentUrl() );
178
-
179
  // todo: вынести в метод
180
  if ( is_multisite() && is_network_admin() ) {
181
- $options = $this->getNetworkOption( 'assets_manager_options', array() );
182
  } else {
183
- $options = $this->getOption( 'assets_manager_options', array() );
184
  }
185
-
186
  echo '<div id="WBCR" class="wbcr-gnz-wrapper"';
187
  if ( isset( $_GET['wbcr_assets_manager'] ) ) {
188
  echo 'style="display: block;"';
189
  }
190
  echo '>';
191
-
192
  //Form
193
  echo '<form method="POST">';
194
  wp_nonce_field( 'wbcr_assets_manager_nonce', 'wbcr_assets_manager_save' );
195
-
196
  //Header
197
  echo '<header class="wbcr-gnz-panel">';
198
  echo '<div class="wbcr-gnz-panel__left">';
@@ -216,22 +217,22 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
216
  echo '<button class="wbcr-gnz-panel__close wbcr-close-button" type="button" aria-label="' . __( 'Close', 'gonzales' ) . '" data-href="' . remove_query_arg( 'wbcr_assets_manager' ) . '"></button>';
217
  echo '</div>';
218
  echo '</header>';
219
-
220
  // Main content
221
  echo '<main class="wbcr-gnz-content">';
222
-
223
  uksort( $this->collection, function ( $a, $b ) {
224
  if ( 'plugins' == $a ) {
225
  return - 1;
226
  }
227
-
228
  if ( 'plugins' == $b ) {
229
  return 1;
230
  }
231
-
232
  return strcasecmp( $a, $b );
233
  } );
234
-
235
  // Tabs
236
  echo '<ul class="wbcr-gnz-tabs">';
237
  foreach ( $this->collection as $resource_type => $resources ) {
@@ -240,16 +241,16 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
240
  echo '</li>';
241
  }
242
  echo '</ul>';
243
-
244
  // Info
245
  echo '<div class="wbcr-gnz-info"><div class="wbcr-gnz-info__warning">';
246
  echo '<p><b>' . __( 'Important! Each page of your website has different sets of scripts and styles files.', 'gonzales' ) . '</b></p>';
247
  echo '<p>' . __( 'Use this feature to disable unwanted scripts and styles by setting up the logic for different types of pages. We recommend working in "Safe mode" because disabling any necessary system script file can corrupt the website. All changes done in Safe mode are available for administrator only. This way only you, as the administrator, can see the result of optimization. To enable the changes for other users, uncheck Safe mode.', 'gonzales' ) . '</p>';
248
  echo '<p>' . sprintf( __( 'For more details and user guides, check the plugin’s <a href="%s" target="_blank" rel="noreferrer noopener">documentation</a>.', 'gonzales' ), WbcrFactoryClearfy206_Helpers::getWebcrafticSitePageUrl( WGZ_Plugin::app()->getPluginName(), 'docs' ) ) . '</p>';
249
  echo '</div>';
250
-
251
  $premium_button = '<a class="wbcr-gnz-button__pro" href="' . WbcrFactoryClearfy206_Helpers::getWebcrafticSitePageUrl( WGZ_Plugin::app()->getPluginName(), 'assets-manager' ) . '" target="_blank" rel="noreferrer noopener">' . __( 'Upgrade to Premium', 'gonzales' ) . '</a>';
252
-
253
  $upgrade_to_premium_info = '<div class="wbcr-gnz-info__go-to-premium"><ul>';
254
  $upgrade_to_premium_info .= '<h3><span>' . __( 'MORE IN CLEARFY BUSINESS', 'gonzales' ) . '</span>' . $premium_button . '</h3><ul>';
255
  $upgrade_to_premium_info .= '<li>' . __( 'Disable plugins (groups of scripts)', 'gonzales' ) . '</li>';
@@ -261,9 +262,9 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
261
  $upgrade_to_premium_info .= '</div>';
262
  echo apply_filters( 'wbcr_gnz_upgrade_to_premium_info', $upgrade_to_premium_info );
263
  echo '</div>';
264
-
265
  global $plugin_state;
266
-
267
  foreach ( $this->collection as $resource_type => $resources ) {
268
  // Tabs content
269
  echo '<div class="wbcr-gnz-tabs-content">';
@@ -274,31 +275,31 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
274
  echo '<col class="wbcr-gnz-table__script"/>';
275
  echo '<col class="wbcr-gnz-table__state"/>';
276
  echo '<col class="wbcr-gnz-table__turn-on"/>';
277
-
278
  foreach ( $resources as $resource_name => $types ) {
279
  $plugin_state = false;
280
-
281
  if ( 'plugins' == $resource_type && ! empty( $resource_name ) ) {
282
  $plugin_data = $this->getPluginData( $resource_name );
283
-
284
  echo '<tbody>';
285
-
286
  if ( ! empty( $plugin_data ) ) {
287
  $is_disabled = $this->getIsDisabled( $options, $resource_type, $resource_name );
288
  $disabled = $this->getDisabled( $is_disabled, $options, $resource_type, $resource_name );
289
-
290
  $is_enabled = $this->getIsEnabled( $options, $resource_type, $resource_name );
291
  $enabled = $this->getEnabled( $is_enabled, $options, $resource_type, $resource_name );
292
-
293
  $plugin_state = $this->getState( $is_disabled, $disabled, $current_url );
294
  $plugin_state = apply_filters( 'wbcr_gnz_get_plugin_state', false, $plugin_state );
295
-
296
  echo '<tr class="wbcr-gnz-table__alternate">';
297
  echo '<th style="width:5%">' . __( 'Loaded', 'gonzales' ) . '</th>';
298
  echo '<th colspan="2">' . __( 'Plugin', 'gonzales' ) . '</th>';
299
-
300
  echo apply_filters( 'wbcr_gnz_get_additional_head_columns', '' );
301
-
302
  echo '<th class="wbcr-gnz-table__column_switch"><b>' . __( 'Load resource?', 'gonzales' ) . '</b></th>';
303
  echo '<th class="wbcr-gnz-table__column_condition">' . __( 'Conditions', 'gonzales' ) . '</th>';
304
  echo '</tr>';
@@ -311,59 +312,59 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
311
  echo '<div class="wbcr-gnz-table__item-author"><strong>' . __( 'Author', 'gonzales' ) . ':</strong> ' . $plugin_data['Author'] . '</div>';
312
  echo '<div class="wbcr-gnz-table__item-version"><strong>' . __( 'Version', 'gonzales' ) . ':</strong> ' . $plugin_data['Version'] . '</div>';
313
  echo '</td>';
314
-
315
  echo apply_filters( 'wbcr_gnz_get_additional_controls_columns', '', $resource_type, $resource_name, $resource_name );
316
-
317
  // State Controls
318
  $id = '[' . $resource_type . '][' . $resource_name . ']';
319
  echo $this->getStateControrlHTML( $id, $plugin_state, $is_disabled, $is_enabled, $resource_type, $resource_name, $disabled, $enabled, $current_url );
320
  echo '</tr>';
321
  }
322
  }
323
-
324
  echo '<tr class="wbcr-gnz-table__alternate">';
325
  echo '<th style="width:5%">' . __( 'Loaded', 'gonzales' ) . '</th>';
326
  echo '<th style="width:5%">' . __( 'Size', 'gonzales' ) . '</th>';
327
  echo '<th class="wgz-th">' . __( 'Resource', 'gonzales' ) . '</th>';
328
-
329
  echo apply_filters( 'wbcr_gnz_get_additional_head_columns', '' );
330
-
331
  echo '<th class="wbcr-gnz-table__column_switch"><b>' . __( 'Load resource?', 'gonzales' ) . '</b></th>';
332
  echo '<th class="wbcr-gnz-table__column_condition">' . __( 'Conditions', 'gonzales' ) . '</th>';
333
  echo '</tr>';
334
-
335
  foreach ( $types as $type_name => $rows ) {
336
-
337
  if ( ! empty( $rows ) ) {
338
  foreach ( $rows as $handle => $row ) {
339
  $is_disabled = $this->getIsDisabled( $options, $type_name, $handle );
340
  $disabled = $this->getDisabled( $is_disabled, $options, $type_name, $handle );
341
-
342
  $is_enabled = $this->getIsEnabled( $options, $type_name, $handle );
343
  $enabled = $this->getEnabled( $is_enabled, $options, $type_name, $handle );
344
-
345
  /**
346
  * Find dependency
347
  */
348
- $deps = array();
349
  foreach ( $rows as $dep_key => $dep_val ) {
350
  if ( in_array( $handle, $dep_val['deps'] ) /*&& $is_disabled*/ ) {
351
  $deps[] = '<a href="#' . $type_name . '-' . $dep_key . '">' . $dep_key . '</a>';
352
  }
353
  }
354
-
355
  $comment = ( ! empty( $deps ) ? '<span class="wbcr-use-by-comment">' . __( 'In use by', 'gonzales' ) . ' ' . implode( ', ', $deps ) . '</span>' : '' );
356
  $requires = '';
357
  if ( ! empty( $row['deps'] ) ) {
358
- $rdeps = array();
359
  foreach ( $row['deps'] as $dep_val ) {
360
  $rdeps[] = '<a href="#' . $type_name . '-' . $dep_val . '">' . $dep_val . '</a>';
361
  }
362
  $requires = ( $comment ? '<br>' : '' ) . '<span class="wbcr-use-by-comment">' . __( 'Requires', 'gonzales' ) . ' ' . implode( ', ', $rdeps ) . '</span>';
363
  }
364
-
365
  echo '<tr>';
366
-
367
  // Loaded
368
  $state = $this->getState( $is_disabled, $disabled, $current_url );
369
  $display_state = $plugin_state === 1 ? 1 : $state;
@@ -373,12 +374,12 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
373
  echo ( 'plugins' == $resource_type ? ' wbcr-state-' . $resource_name : '' ) . '">';
374
  echo '</div>';
375
  echo '</td>';
376
-
377
  // Size
378
  echo '<td>';
379
  echo '<div class="wbcr-gnz-table__size-value">' . $row['size'] . ' <b>KB</b></div>';
380
  echo '</td>';
381
-
382
  // Handle + Path + In use
383
  echo '<td class="wgz-td">';
384
  echo '<div class="wbcr-gnz-table__script-name"><b class="wbcr-wgz-resource-type-' . $type_name . '">' . $type_name . '</b>[' . $handle . ']</div>';
@@ -392,27 +393,27 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
392
  echo '</div>';
393
  echo '<div>' . $comment . $requires . '</div>';
394
  echo '</td>';
395
-
396
  // Controls for other plugins
397
  echo apply_filters( 'wbcr_gnz_get_additional_controls_columns', '', $type_name, $row['url_full'], $resource_name );
398
-
399
  // State Controls
400
  $id = '[' . $type_name . '][' . $handle . ']';
401
  echo $this->getStateControrlHTML( $id, $state, $is_disabled, $is_enabled, $type_name, $handle, $disabled, $enabled, $current_url );
402
-
403
  echo "<input type='hidden' class='wbcr-info-data' data-type='{$type_name}' data-off='{$display_state}' value='{$row['size']}'>";
404
  echo '</tr>';
405
-
406
  echo apply_filters( 'wbcr_gnz_after_scripts_table_row', '', $resource_type, $resource_name, $type_name, $handle );
407
  }
408
  }
409
  }
410
-
411
  if ( 'plugins' == $resource_type && ! empty( $resource_name ) ) {
412
  echo '</tbody>';
413
  }
414
  }
415
-
416
  echo '</table>';
417
  echo '</div>';
418
  echo '</div>';
@@ -421,7 +422,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
421
  echo '</form> <!-- /endform -->';
422
  echo '</div> <!-- /div2 -->';
423
  }
424
-
425
  /**
426
  * Get is disabled
427
  *
@@ -434,7 +435,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
434
  public function getIsDisabled( $options, $type_name, $handle ) {
435
  return isset( $options['disabled'] ) && isset( $options['disabled'][ $type_name ] ) && isset( $options['disabled'][ $type_name ][ $handle ] );
436
  }
437
-
438
  /**
439
  * Get disabled
440
  *
@@ -446,23 +447,23 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
446
  * @return array
447
  */
448
  public function getDisabled( $is_disabled, $options, $type_name, $handle ) {
449
- $disabled = array();
450
-
451
  if ( $is_disabled ) {
452
  $disabled = &$options['disabled'][ $type_name ][ $handle ];
453
  if ( ! isset( $disabled['current'] ) ) {
454
- $disabled['current'] = array();
455
  }
456
  if ( ! isset( $disabled['everywhere'] ) ) {
457
- $disabled['everywhere'] = array();
458
  }
459
-
460
  $disabled = apply_filters( 'wbcr_gnz_get_disabled', $disabled );
461
  }
462
-
463
  return $disabled;
464
  }
465
-
466
  /**
467
  * Get is enabled
468
  *
@@ -475,7 +476,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
475
  public function getIsEnabled( $options, $type_name, $handle ) {
476
  return isset( $options['enabled'] ) && isset( $options['enabled'][ $type_name ] ) && isset( $options['enabled'][ $type_name ][ $handle ] );
477
  }
478
-
479
  /**
480
  * Get enabled
481
  *
@@ -487,24 +488,24 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
487
  * @return array
488
  */
489
  public function getEnabled( $is_enabled, $options, $type_name, $handle ) {
490
- $enabled = array();
491
-
492
  if ( $is_enabled ) {
493
  $enabled = &$options['enabled'][ $type_name ][ $handle ];
494
-
495
  if ( ! isset( $enabled['current'] ) ) {
496
- $enabled['current'] = array();
497
  }
498
  if ( ! isset( $enabled['everywhere'] ) ) {
499
- $enabled['everywhere'] = array();
500
  }
501
-
502
  $enabled = apply_filters( 'wbcr_gnz_get_enabled', $enabled );
503
  }
504
-
505
  return $enabled;
506
  }
507
-
508
  /**
509
  * Get State
510
  *
@@ -519,10 +520,10 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
519
  if ( $is_disabled && ( $disabled['everywhere'] == 1 || in_array( $current_url, $disabled['current'] ) || apply_filters( 'wbcr_gnz_check_state_disabled', false, $disabled ) ) ) {
520
  $state = 1;
521
  }
522
-
523
  return $state;
524
  }
525
-
526
  /**
527
  * Get state controrl HTML
528
  *
@@ -549,7 +550,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
549
  $html .= '<span class="wbcr-gnz-switch__slider"></span>';
550
  $html .= '</label>';
551
  $html .= '</td>';
552
-
553
  // Enable
554
  $class_name = 'wbcr-assets-manager-enable';
555
  if ( 'plugins' == $type_name ) {
@@ -578,7 +579,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
578
  $options .= '<option value="regex"' . selected( $is_disabled && ! empty( $disabled['regex'] ), true, false ) . ' class="wbcr-gnz-table__select-pro">' . __( 'Regular expression (PRO)', 'gonzales' ) . '</option>';
579
  $html .= apply_filters( 'wbcr_gnz_select_options', $options, $is_disabled, $disabled );
580
  $html .= '</select>';
581
-
582
  // Everywhere
583
  $html .= "<span class='wbcr-assets-manager everywhere'";
584
  if ( ! $is_disabled || empty( $disabled['everywhere'] ) ) {
@@ -587,7 +588,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
587
  $html .= ">";
588
  $html .= '<div class="wbcr-gnz-table__label">' . __( 'Exclude', 'gonzales' ) . ': <i class="wbcr-gnz-help-hint wbcr-gnz-tooltip wbcr-gnz-tooltip-bottom" data-tooltip="' . __( 'You can disable this resource for all pages, except sections and page types listed below. Specify sections and page types with the enabled resource.', 'gonzales' ) . '"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""></i></div>';
589
  $html .= '<ul class="wbcr-gnz-table__options">';
590
-
591
  $html .= '<li class="wbcr-gnz-table__options-item">';
592
  $html .= "<input type='hidden' name='enabled{$id}[current]' value='' />";
593
  $html .= '<label class="wbcr-gnz-table__checkbox">';
@@ -599,8 +600,8 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
599
  $html .= '<span class="wbcr-gnz-table__checkbox-text">' . __( 'Current URL', 'gonzales' ) . '</span>';
600
  $html .= '</label>';
601
  $html .= '</li>';
602
-
603
- $post_types = get_post_types( array( 'public' => true ), 'objects', 'and' );
604
  if ( ! empty( $post_types ) ) {
605
  $html .= "<input type='hidden' name='enabled{$id}[post_types]' value='' />";
606
  foreach ( $post_types as $key => $value ) {
@@ -618,9 +619,9 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
618
  $html .= '</li>';
619
  }
620
  }
621
-
622
- $taxonomies = get_taxonomies( array( 'public' => true ), 'objects', 'and' );
623
-
624
  if ( ! empty( $taxonomies ) ) {
625
  unset( $taxonomies['category'] );
626
  $html .= "<input type='hidden' name='enabled{$id}[taxonomies]' value='' />";
@@ -639,9 +640,9 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
639
  $html .= '</li>';
640
  }
641
  }
642
-
643
  $categories = get_categories();
644
-
645
  if ( ! empty( $categories ) ) {
646
  $html .= "<input type='hidden' name='enabled{$id}[categories]' value='' />";
647
  foreach ( $categories as $key => $cat ) {
@@ -659,10 +660,10 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
659
  $html .= '</li>';
660
  }
661
  }
662
-
663
  $html .= '</ul>';
664
  $html .= '</span>';
665
-
666
  // Custom URL
667
  $control_html = '<div class="wbcr-gnz-table__field wbcr-assets-manager custom"';
668
  if ( ! $is_disabled || empty( $disabled['custom'] ) ) {
@@ -686,19 +687,19 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
686
  $control_html .= '<textarea class="wbcr-gnz-table__textarea" rows="3" name="disabled' . $id . '[regex]" placeholder="^rockstar-[0-9]{2,5}" disabled="disabled"></textarea>';
687
  $control_html .= "</div>";
688
  $html .= apply_filters( 'wbcr_gnz_control_html', $control_html, $id, $is_disabled, $disabled );
689
-
690
  $html .= '</span>';
691
-
692
  if ( isset( $disabled['current'] ) && ! empty( $disabled['current'] ) ) {
693
  $custom_urls = "";
694
-
695
  foreach ( $disabled['current'] as $item_url ) {
696
  if ( $current_url != $item_url ) {
697
  $full_url = site_url() . $item_url;
698
  $custom_urls .= "<span><a href='" . $full_url . "'>" . $full_url . "</a></span>";
699
  }
700
  }
701
-
702
  if ( ! empty( $custom_urls ) ) {
703
  $html .= '<div class="wbcr-gnz-table__also">';
704
  $html .= '<div class="wbcr-gnz-table__label">' . __( 'Also disabled for pages', 'gonzales' ) . ':</div>';
@@ -707,54 +708,55 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
707
  }
708
  }
709
  $html .= '</td>';
710
-
711
  return $html;
712
  }
713
-
714
  public function formSave() {
715
  if ( isset( $_GET['wbcr_assets_manager'] ) && isset( $_POST['wbcr_assets_manager_save'] ) ) {
716
-
717
  if ( ! $this->isUserCan() || ! wp_verify_nonce( filter_input( INPUT_POST, 'wbcr_assets_manager_save' ), 'wbcr_assets_manager_nonce' ) ) {
718
  wp_die( __( 'You don\'t have enough capability to edit this information.', 'gonzales' ), 403 );
719
-
720
  return;
721
  }
722
-
723
  // todo: вынести в метод
724
  if ( is_multisite() && is_network_admin() ) {
725
- $options = $this->getNetworkOption( 'assets_manager_options', array() );
726
  } else {
727
- $options = $this->getOption( 'assets_manager_options', array() );
728
  }
729
-
730
  $current_url = esc_url( $this->getCurrentUrl() );
731
-
732
  if ( isset( $_POST['disabled'] ) && ! empty( $_POST['disabled'] ) ) {
733
  foreach ( $_POST['disabled'] as $type => $assets ) {
734
  if ( ! empty( $assets ) ) {
735
  foreach ( $assets as $handle => $where ) {
736
  $handle = sanitize_text_field( $handle );
737
  $where = sanitize_text_field( $where['state'] );
738
-
739
  if ( ! isset( $options['disabled'][ $type ][ $handle ] ) ) {
740
- $options['disabled'][ $type ][ $handle ] = array();
 
741
  }
742
  $disabled = &$options['disabled'][ $type ][ $handle ];
743
-
744
  if ( ! empty( $where ) && 'disable' == $where ) {
745
  $action = isset( $_POST['wgz_action'][ $type ][ $handle ] ) ? $_POST['wgz_action'][ $type ][ $handle ] : '';
746
-
747
  if ( "everywhere" == $action ) {
748
  $disabled = apply_filters( 'wbcr_gnz_unset_disabled', $disabled, $action );
749
-
750
  $disabled['everywhere'] = 1;
751
  } else if ( "current" == $action ) {
752
  $disabled = apply_filters( 'wbcr_gnz_unset_disabled', $disabled, $action );
753
-
754
  if ( ! isset( $disabled['current'] ) || ! is_array( $disabled['current'] ) ) {
755
- $disabled['current'] = array();
756
  }
757
-
758
  if ( ! in_array( $current_url, $disabled['current'] ) ) {
759
  array_push( $disabled['current'], $current_url );
760
  }
@@ -764,10 +766,10 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
764
  }
765
  } else {
766
  $disabled = apply_filters( 'wbcr_gnz_unset_disabled', $disabled, 'current' );
767
-
768
  if ( isset( $disabled['current'] ) ) {
769
  $current_key = array_search( $current_url, $disabled['current'] );
770
-
771
  if ( ! empty( $current_key ) || $current_key === 0 ) {
772
  unset( $disabled['current'][ $current_key ] );
773
  if ( empty( $disabled['current'] ) ) {
@@ -776,7 +778,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
776
  }
777
  }
778
  }
779
-
780
  if ( empty( $disabled ) ) {
781
  unset( $options['disabled'][ $type ][ $handle ] );
782
  if ( empty( $options['disabled'][ $type ] ) ) {
@@ -790,22 +792,23 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
790
  }
791
  }
792
  }
793
-
794
  if ( isset( $_POST['enabled'] ) && ! empty( $_POST['enabled'] ) ) {
795
  foreach ( $_POST['enabled'] as $type => $assets ) {
796
  if ( ! empty( $assets ) ) {
797
  foreach ( $assets as $handle => $where ) {
798
-
799
  if ( ! isset( $options['enabled'][ $type ][ $handle ] ) ) {
800
- $options['enabled'][ $type ][ $handle ] = array();
 
801
  }
802
  $enabled = &$options['enabled'][ $type ][ $handle ];
803
-
804
  $action = isset( $_POST['wgz_action'][ $type ][ $handle ] ) ? $_POST['wgz_action'][ $type ][ $handle ] : '';
805
-
806
  if ( "everywhere" == $action && ( ! empty( $where['current'] ) || $where['current'] === "0" ) ) {
807
  if ( ! isset( $enabled['current'] ) || ! is_array( $enabled['current'] ) ) {
808
- $enabled['current'] = array();
809
  }
810
  if ( ! in_array( $where['current'], $enabled['current'] ) ) {
811
  array_push( $enabled['current'], $where['current'] );
@@ -821,9 +824,9 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
821
  }
822
  }
823
  }
824
-
825
  if ( "everywhere" == $action && ! empty( $where['post_types'] ) ) {
826
- $enabled['post_types'] = array();
827
  foreach ( $where['post_types'] as $key => $post_type ) {
828
  if ( isset( $enabled['post_types'] ) ) {
829
  if ( ! in_array( $post_type, $enabled['post_types'] ) ) {
@@ -834,9 +837,9 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
834
  } else {
835
  unset( $enabled['post_types'] );
836
  }
837
-
838
  if ( "everywhere" == $action && ! empty( $where['taxonomies'] ) ) {
839
- $enabled['taxonomies'] = array();
840
  foreach ( $where['taxonomies'] as $key => $taxonomy ) {
841
  if ( isset( $enabled['taxonomies'] ) ) {
842
  if ( ! in_array( $taxonomy, $enabled['taxonomies'] ) ) {
@@ -847,9 +850,9 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
847
  } else {
848
  unset( $enabled['taxonomies'] );
849
  }
850
-
851
  if ( "everywhere" == $action && ! empty( $where['categories'] ) ) {
852
- $enabled['categories'] = array();
853
  foreach ( $where['categories'] as $key => $category ) {
854
  if ( isset( $enabled['categories'] ) ) {
855
  if ( ! in_array( $category, $enabled['categories'] ) ) {
@@ -860,7 +863,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
860
  } else {
861
  unset( $enabled['categories'] );
862
  }
863
-
864
  if ( empty( $enabled ) ) {
865
  unset( $options['enabled'][ $type ][ $handle ] );
866
  if ( empty( $options['enabled'][ $type ] ) ) {
@@ -874,19 +877,19 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
874
  }
875
  }
876
  }
877
-
878
  do_action( 'wbcr_gnz_form_save' );
879
-
880
  if ( is_multisite() && is_network_admin() ) {
881
  $this->updateNetworkOption( 'assets_manager_options', $options );
882
  } else {
883
  $this->updateOption( 'assets_manager_options', $options );
884
  }
885
-
886
  WbcrFactoryClearfy206_Helpers::flushPageCache();
887
  }
888
  }
889
-
890
  /**
891
  * Get disabled from options
892
  *
@@ -898,23 +901,23 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
898
  private function getDisabledFromOptions( $type, $handle ) {
899
  // todo: вынести в метод
900
  if ( is_multisite() && is_network_admin() ) {
901
- $options = $this->getNetworkOption( 'assets_manager_options', array() );
902
  } else {
903
- $options = $this->getOption( 'assets_manager_options', array() );
904
  }
905
-
906
  $results = apply_filters( 'wbcr_gnz_get_disabled_from_options', false, $options, $type, $handle );
907
  if ( false !== $results ) {
908
  return $results;
909
  }
910
-
911
  if ( isset( $options['disabled'] ) && isset( $options['disabled'][ $type ] ) && isset( $options['disabled'][ $type ][ $handle ] ) ) {
912
  return $options['disabled'][ $type ][ $handle ];
913
  }
914
-
915
  return null;
916
  }
917
-
918
  /**
919
  * Get enabled from options
920
  *
@@ -926,67 +929,71 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
926
  private function getEnabledFromOptions( $type, $handle ) {
927
  // todo: вынести в метод
928
  if ( is_multisite() && is_network_admin() ) {
929
- $options = $this->getNetworkOption( 'assets_manager_options', array() );
930
  } else {
931
- $options = $this->getOption( 'assets_manager_options', array() );
932
  }
933
-
934
  $results = apply_filters( 'wbcr_gnz_get_enabled_from_options', false, $options, $type, $handle );
935
  if ( false !== $results ) {
936
  return $results;
937
  }
938
-
939
  if ( isset( $options['enabled'] ) && isset( $options['enabled'][ $type ] ) && isset( $options['enabled'][ $type ][ $handle ] ) ) {
940
  return $options['enabled'][ $type ][ $handle ];
941
  }
942
-
943
  return null;
944
  }
945
-
946
  function unloadAssets( $src, $handle ) {
947
  if ( isset( $_GET['wbcr_assets_manager'] ) ) {
948
  return $src;
949
  }
950
-
951
  if ( apply_filters( 'wbcr_gnz_check_unload_assets', false ) ) {
952
  return $src;
953
  }
954
-
955
  $type = ( current_filter() == 'script_loader_src' ) ? 'js' : 'css';
956
-
957
  $current_url = esc_url( $this->getCurrentUrl() );
958
-
959
  $disabled = $this->getDisabledFromOptions( $type, $handle );
960
  $enabled = $this->getEnabledFromOptions( $type, $handle );
961
-
962
  if ( ( isset( $disabled['everywhere'] ) && $disabled['everywhere'] == 1 ) || ( isset( $disabled['current'] ) && is_array( $disabled['current'] ) && in_array( $current_url, $disabled['current'] ) ) || apply_filters( 'wbcr_gnz_check_disabled_is_set', false, $disabled, $current_url ) ) {
963
-
964
  if ( isset( $enabled['current'] ) && is_array( $enabled['current'] ) && in_array( $current_url, $enabled['current'] ) ) {
965
  return $src;
966
  }
967
-
968
  if ( apply_filters( 'wbcr_gnz_check_unload_disabled', false, $disabled, $current_url ) ) {
969
  return $src;
970
  }
971
-
972
  if ( isset( $enabled['post_types'] ) && is_singular() && in_array( get_post_type(), $enabled['post_types'] ) ) {
973
  return $src;
974
  }
975
-
976
- if ( isset( $enabled['taxonomies'] ) && in_array( get_queried_object()->taxonomy, $enabled['taxonomies'] ) ) {
977
- return $src;
 
 
 
 
978
  }
979
-
980
  if ( isset( $enabled['categories'] ) && in_array( get_query_var( 'cat' ), $enabled['categories'] ) ) {
981
  return $src;
982
  }
983
-
984
  return false;
985
  }
986
-
987
  return $src;
988
  }
989
-
990
  /**
991
  * Get information regarding used assets
992
  *
@@ -996,22 +1003,22 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
996
  if ( ! isset( $_GET['wbcr_assets_manager'] ) || ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
997
  return false;
998
  }
999
-
1000
- $denied = array(
1001
- 'js' => array( 'wbcr-assets-manager', 'admin-bar' ),
1002
- 'css' => array( 'wbcr-assets-manager', 'admin-bar', 'dashicons' ),
1003
- );
1004
  $denied = apply_filters( 'wbcr_gnz_denied_assets', $denied );
1005
-
1006
  /**
1007
  * Imitate full untouched list without dequeued assets
1008
  * Appends part of original table. Safe approach.
1009
  */
1010
- $data_assets = array(
1011
  'js' => wp_scripts(),
1012
  'css' => wp_styles(),
1013
- );
1014
-
1015
  foreach ( $data_assets as $type => $data ) {
1016
  //$resource = array();
1017
  foreach ( $data->groups as $el => $val ) {
@@ -1021,7 +1028,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1021
  if ( isset( $data->registered[ $el ]->src ) ) {
1022
  $url = $this->prepareCorrectUrl( $data->registered[ $el ]->src );
1023
  $url_short = str_replace( get_home_url(), '', $url );
1024
-
1025
  if ( false !== strpos( $url, get_theme_root_uri() ) ) {
1026
  $resource_type = 'theme';
1027
  } else if ( false !== strpos( $url, plugins_url() ) ) {
@@ -1029,47 +1036,47 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1029
  } else {
1030
  $resource_type = 'misc';
1031
  }
1032
-
1033
  $resource_name = '';
1034
  if ( 'plugins' == $resource_type ) {
1035
  $clean_url = str_replace( WP_PLUGIN_URL . '/', '', $url );
1036
  $url_parts = explode( '/', $clean_url );
1037
  $resource_name = isset( $url_parts[0] ) ? $url_parts[0] : '';
1038
  }
1039
-
1040
- $this->collection[ $resource_type ][ $resource_name ][ $type ][ $el ] = array(
1041
  'url_full' => $url,
1042
  'url_short' => $url_short,
1043
  //'state' => $this->get_visibility($type, $el),
1044
  'size' => $this->getAssetSize( $url ),
1045
  'ver' => $data->registered[ $el ]->ver,
1046
- 'deps' => ( isset( $data->registered[ $el ]->deps ) ? $data->registered[ $el ]->deps : array() ),
1047
- );
1048
  }
1049
  }
1050
  //}
1051
  }
1052
  }
1053
  }
1054
-
1055
  return false;
1056
  }
1057
-
1058
  /**
1059
  * Loads functionality that allows to enable/disable js/css without site reload
1060
  */
1061
  public function appendAsset() {
1062
  if ( $this->isUserCan() && isset( $_GET['wbcr_assets_manager'] ) ) {
1063
- wp_enqueue_style( 'wbcr-assets-manager', WGZ_PLUGIN_URL . '/assets/css/assets-manager.css', array(), $this->plugin->getPluginVersion() );
1064
- wp_enqueue_script( 'wbcr-assets-manager', WGZ_PLUGIN_URL . '/assets/js/assets-manager.js', array( 'jquery' ), $this->plugin->getPluginVersion(), true );
1065
  }
1066
  }
1067
-
1068
  /**
1069
  * Exception for address starting from "//example.com" instead of
1070
  * "http://example.com". WooCommerce likes such a format
1071
  *
1072
- * @param string $url Incorrect URL.
1073
  *
1074
  * @return string Correct URL.
1075
  */
@@ -1079,10 +1086,10 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1079
  } else {
1080
  $out = $url;
1081
  }
1082
-
1083
  return $out;
1084
  }
1085
-
1086
  /**
1087
  * Get current URL
1088
  *
@@ -1095,36 +1102,36 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1095
  } else {
1096
  $out = $url[0];
1097
  }
1098
-
1099
  return $out;
1100
  }
1101
-
1102
  /**
1103
  * Checks how heavy is file
1104
  *
1105
- * @param string $src URL.
1106
  *
1107
  * @return int Size in KB.
1108
  */
1109
  private function getAssetSize( $src ) {
1110
  $weight = 0;
1111
-
1112
  $home = get_theme_root() . '/../..';
1113
  $src = explode( '?', $src );
1114
-
1115
  if ( ! filter_var( $src[0], FILTER_VALIDATE_URL ) === false && strpos( $src[0], get_home_url() ) === false ) {
1116
  return 0;
1117
  }
1118
-
1119
  $src_relative = $home . str_replace( get_home_url(), '', $this->prepareCorrectUrl( $src[0] ) );
1120
-
1121
  if ( file_exists( $src_relative ) ) {
1122
  $weight = round( filesize( $src_relative ) / 1024, 1 );
1123
  }
1124
-
1125
  return $weight;
1126
  }
1127
-
1128
  /**
1129
  * Unset disabled
1130
  *
@@ -1139,10 +1146,10 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1139
  } else if ( "current" == $action ) {
1140
  unset( $disabled['everywhere'] );
1141
  }
1142
-
1143
  return $disabled;
1144
  }
1145
-
1146
  /**
1147
  * Get plugin data from folder name
1148
  *
@@ -1151,8 +1158,8 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1151
  * @return array
1152
  */
1153
  private function getPluginData( $name ) {
1154
- $data = array();
1155
-
1156
  if ( $name ) {
1157
  if ( ! function_exists( 'get_plugins' ) ) {
1158
  // подключим файл с функцией get_plugins()
@@ -1169,10 +1176,10 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1169
  }
1170
  }
1171
  }
1172
-
1173
  return $data;
1174
  }
1175
-
1176
  /**
1177
  * Get sided plugin name
1178
  *
@@ -1190,13 +1197,13 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1190
 
1191
  return "";*/
1192
  }
1193
-
1194
  /**
1195
  * Get exclude sided plugin files
1196
  *
1197
  * @param string $index
1198
  * @param string $type
1199
- * @param bool $full
1200
  *
1201
  * @return array
1202
  */
@@ -1204,25 +1211,25 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1204
  if ( isset( $this->sided_plugin_files[ $index ][ $type ] ) && ! empty( $this->sided_plugin_files[ $index ][ $type ] ) ) {
1205
  return $this->sided_plugin_files[ $index ][ $type ];
1206
  }
1207
-
1208
- $this->sided_plugin_files[ $index ][ $type ] = array();
1209
-
1210
  // todo: вынести в метод
1211
  if ( is_multisite() && is_network_admin() ) {
1212
- $options = $this->getNetworkOption( 'assets_manager_sided_plugins', array() );
1213
  } else {
1214
- $options = $this->getOption( 'assets_manager_sided_plugins', array() );
1215
  }
1216
-
1217
  $plugin = $this->getSidedPluginName( $index );
1218
-
1219
  if ( $plugin && $options ) {
1220
  if ( isset( $options[ $plugin ][ $type ] ) ) {
1221
  $urls = $options[ $plugin ][ $type ];
1222
-
1223
  if ( is_array( $urls ) ) {
1224
  foreach ( $urls as $url ) {
1225
-
1226
  if ( $full ) {
1227
  $file = ( false !== strpos( $url, site_url() ) ? $url : site_url() . '/' . trim( $url, '/\\' ) );
1228
  } else {
@@ -1232,16 +1239,16 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1232
  $file = $url;
1233
  }
1234
  }
1235
-
1236
  $this->sided_plugin_files[ $index ][ $type ][] = $file;
1237
  }
1238
  }
1239
  }
1240
  }
1241
-
1242
  return $this->sided_plugin_files[ $index ][ $type ];
1243
  }
1244
-
1245
  /**
1246
  * Is component active
1247
  *
@@ -1251,16 +1258,16 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1251
  */
1252
  private function isComponentActive( $index ) {
1253
  include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
1254
-
1255
  $plugin_path = isset( $this->sided_plugins[ $index ] ) ? $this->sided_plugins[ $index ] : null;
1256
-
1257
  if ( $index == 'wmac' && defined( 'LOADING_ASSETS_MANAGER_AS_ADDON' ) && class_exists( 'WCL_Plugin' ) ) {
1258
  return WCL_Plugin::app()->isActivateComponent( 'minify_and_combine' );
1259
  }
1260
-
1261
  return is_plugin_active( $plugin_path );
1262
  }
1263
-
1264
  /**
1265
  * Get component name
1266
  *
@@ -1278,10 +1285,10 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1278
  $data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin_path );
1279
  $name = $data['Name'];
1280
  }
1281
-
1282
  return $name;
1283
  }
1284
-
1285
  /**
1286
  * Get head columns
1287
  *
@@ -1295,7 +1302,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1295
  if ( $this->isComponentActive( $index ) ) {
1296
  $title = $this->getComponentName( $plugin_path, $index );
1297
  $text = $index == 'wclp' ? __( 'remove version?', 'gonzales' ) : __( 'optimize?', 'gonzales' );
1298
-
1299
  $hint = '';
1300
  if ( $index == 'wclp' ) {
1301
  $hint = __( 'You’ve enabled &#34;Remove query strings&#34; from static resources in the &#34;Clearfy&#34; plugin. This list of settings helps you to exclude the necessary scripts and styles with remaining query strings. Press No to add a file to the excluded list.', 'gonzales' );
@@ -1308,10 +1315,10 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1308
  }
1309
  }
1310
  }
1311
-
1312
  return $html;
1313
  }
1314
-
1315
  /**
1316
  * Get active status for sided plugin
1317
  *
@@ -1325,7 +1332,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1325
  */
1326
  private function getActiveStatusForSidedPlugin( $index, $options, $plugin, $type, $handle ) {
1327
  $active = isset( $options[ $plugin ][ $type ] ) && is_array( $options[ $plugin ][ $type ] ) && in_array( $handle, $options[ $plugin ][ $type ] );
1328
-
1329
  /*if( !$active && !isset($options[$plugin]) ) {
1330
 
1331
  switch( $index ) {
@@ -1343,10 +1350,10 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1343
  break;
1344
  }
1345
  }*/
1346
-
1347
  return $active;
1348
  }
1349
-
1350
  /**
1351
  * Get controls columns
1352
  *
@@ -1359,23 +1366,23 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1359
  */
1360
  public function getAdditionalControlsColumns( $html, $type, $handle, $plugin_handle ) {
1361
  if ( ! empty( $this->sided_plugins ) ) {
1362
-
1363
  // todo: вынести в метод
1364
  if ( is_multisite() && is_network_admin() ) {
1365
- $options = $this->getNetworkOption( 'assets_manager_sided_plugins', array() );
1366
  } else {
1367
- $options = $this->getOption( 'assets_manager_sided_plugins', array() );
1368
  }
1369
-
1370
  foreach ( $this->sided_plugins as $index => $plugin_path ) {
1371
  if ( $this->isComponentActive( $index ) ) {
1372
  $plugin = $this->getSidedPluginName( $index );
1373
-
1374
  $active = $this->getActiveStatusForSidedPlugin( $index, $options, $plugin, $type, $handle );
1375
  $name = "sided_plugins[{$plugin}][{$type}][{$handle}]";
1376
-
1377
  $html .= "<td>";
1378
-
1379
  if ( ! empty( $handle ) && ( 'plugins' != $type && false !== strpos( $handle, '.' . $type ) || 'plugins' == $type ) ) {
1380
  $html .= '<label class="wbcr-gnz-switch">';
1381
  $html .= '<input class="wbcr-gnz-switch__input visually-hidden wbcr-gnz-sided-disable';
@@ -1391,10 +1398,10 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1391
  }
1392
  }
1393
  }
1394
-
1395
  return $html;
1396
  }
1397
-
1398
  /**
1399
  * @param $index
1400
  * @param $type
@@ -1404,7 +1411,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1404
  */
1405
  private function filterExclusions( $index, $type, $exclude ) {
1406
  $files = $this->getSidedPluginFiles( $index, $type );
1407
-
1408
  if ( ! empty( $files ) ) {
1409
  if ( is_array( $exclude ) ) {
1410
  $exclude = array_merge( $exclude, $files );
@@ -1413,10 +1420,10 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1413
  $exclude .= ! empty( $exclude ) ? ',' . $dontmove : $dontmove;
1414
  }
1415
  }
1416
-
1417
  return $exclude;
1418
  }
1419
-
1420
  /**
1421
  * aopt filter js exclude
1422
  *
@@ -1428,7 +1435,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1428
  public function aoptFilterJsExclude( $exclude, $content ) {
1429
  return $this->filterExclusions( 'aopt', 'js', $exclude );
1430
  }
1431
-
1432
  /**
1433
  * aopt filter css exclude
1434
  *
@@ -1440,7 +1447,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1440
  public function aoptFilterCssExclude( $exclude, $content ) {
1441
  return $this->filterExclusions( 'aopt', 'css', $exclude );
1442
  }
1443
-
1444
  /**
1445
  * wmac filter js exclude
1446
  *
@@ -1452,7 +1459,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1452
  public function wmacFilterJsExclude( $exclude, $content ) {
1453
  return $this->filterExclusions( 'wmac', 'js', $exclude );
1454
  }
1455
-
1456
  /**
1457
  * wmac filter css exclude
1458
  *
@@ -1464,7 +1471,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1464
  public function wmacFilterCssExclude( $exclude, $content ) {
1465
  return $this->filterExclusions( 'wmac', 'css', $exclude );
1466
  }
1467
-
1468
  /**
1469
  * Filter js minify exclusions
1470
  *
@@ -1477,7 +1484,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1477
  */
1478
  private function filterJsMinifyExclusions( $index, $type, $result, $url ) {
1479
  $files = $this->getSidedPluginFiles( $index, $type );
1480
-
1481
  if ( ! empty( $files ) ) {
1482
  foreach ( $files as $file ) {
1483
  if ( false !== strpos( $url, $file ) ) {
@@ -1485,10 +1492,10 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1485
  }
1486
  }
1487
  }
1488
-
1489
  return $result;
1490
  }
1491
-
1492
  /**
1493
  * Action wmac_filter_js_minify_excluded
1494
  *
@@ -1500,7 +1507,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1500
  public function wmacFilterJsMinifyExclude( $result, $url ) {
1501
  return $this->filterJsMinifyExclusions( 'wmac', 'js', $result, $url );
1502
  }
1503
-
1504
  /**
1505
  * Action wmac_filter_css_minify_excluded
1506
  *
@@ -1512,7 +1519,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1512
  public function wmacFilterCssMinifyExclude( $result, $url ) {
1513
  return $this->filterJsMinifyExclusions( 'wmac', 'css', $result, $url );
1514
  }
1515
-
1516
  /**
1517
  * Manage excluded files
1518
  *
@@ -1546,29 +1553,29 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1546
  default:
1547
  return;
1548
  }
1549
-
1550
  // For clearfy need new line
1551
  $delimeter = $index == 'wclp' ? "\n" : ",";
1552
- $current_exclude_files = ! empty( $exclude_files ) ? array_filter( array_map( 'trim', explode( $delimeter, $exclude_files ) ) ) : array();
1553
-
1554
  $delete_files = array_diff( $sided_exclude_files['before'][ $type ], $sided_exclude_files['after'][ $type ] );
1555
  $new_files = array_diff( $sided_exclude_files['after'][ $type ], $current_exclude_files );
1556
-
1557
  if ( empty( $current_exclude_files ) && ! empty( $new_files ) ) {
1558
  $current_exclude_files = $new_files;
1559
  } else if ( ! empty( $current_exclude_files ) ) {
1560
- $new_exclude_files = array();
1561
  foreach ( $current_exclude_files as $file ) {
1562
-
1563
  if ( ! in_array( $file, $delete_files ) ) {
1564
  $new_exclude_files[] = $file;
1565
  }
1566
  }
1567
  $current_exclude_files = array_merge( $new_exclude_files, $new_files );
1568
  }
1569
-
1570
  $current_exclude_files = array_filter( array_unique( $current_exclude_files ) );
1571
-
1572
  switch ( $index ) {
1573
  case 'aopt':
1574
  update_option( 'autoptimize_' . $type . '_exclude', implode( ', ', $current_exclude_files ) );
@@ -1585,7 +1592,7 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1585
  break;
1586
  }
1587
  }
1588
-
1589
  /**
1590
  * Action form save
1591
  *
@@ -1594,55 +1601,55 @@ class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
1594
  public function actionFormSave( $empty_before = false ) {
1595
  if ( ! empty( $this->sided_plugins ) && ! $empty_before ) {
1596
  foreach ( $this->sided_plugins as $index => $sided_plugin ) {
1597
- $sided_exclude_files[ $index ]['before'] = array(
1598
- 'js' => array(),
1599
- 'css' => array()
1600
- );
1601
  // For clearfy need full url
1602
  $full = ( $index == 'wclp' ? true : false );
1603
-
1604
  $sided_exclude_files[ $index ]['before']['js'] += $this->getSidedPluginFiles( $index, 'js', $full );
1605
  $sided_exclude_files[ $index ]['before']['css'] += $this->getSidedPluginFiles( $index, 'css', $full );
1606
  }
1607
  }
1608
-
1609
  if ( isset( $_POST['sided_plugins'] ) && ! empty( $_POST['sided_plugins'] ) ) {
1610
- $sided_plugins_options = array();
1611
  foreach ( $_POST['sided_plugins'] as $plugin => $types ) {
1612
  foreach ( $types as $type => $urls ) {
1613
  foreach ( $urls as $url => $active ) {
1614
-
1615
  if ( ! empty( $url ) && $active ) {
1616
  $sided_plugins_options[ $plugin ][ $type ][] = $url;
1617
  }
1618
  }
1619
  }
1620
  }
1621
-
1622
  if ( is_multisite() && is_network_admin() ) {
1623
  $this->updateNetworkOption( 'assets_manager_sided_plugins', $sided_plugins_options );
1624
  } else {
1625
  $this->updateOption( 'assets_manager_sided_plugins', $sided_plugins_options );
1626
  }
1627
  }
1628
-
1629
  if ( ! empty( $this->sided_plugins ) ) {
1630
- $this->sided_plugin_files = array();
1631
  foreach ( $this->sided_plugins as $index => $sided_plugin ) {
1632
- $sided_exclude_files[ $index ]['after'] = array(
1633
- 'js' => array(),
1634
- 'css' => array()
1635
- );
1636
  // For clearfy need full url
1637
  $full = ( $index == 'wclp' ? true : false );
1638
-
1639
  $sided_exclude_files[ $index ]['after']['js'] += $this->getSidedPluginFiles( $index, 'js', $full );
1640
  $sided_exclude_files[ $index ]['after']['css'] += $this->getSidedPluginFiles( $index, 'css', $full );
1641
-
1642
  if ( ! empty( $sided_exclude_files[ $index ]['before']['js'] ) || ! empty( $sided_exclude_files[ $index ]['after']['js'] ) ) {
1643
  $this->manageExcludeFiles( $sided_exclude_files[ $index ], $index, 'js' );
1644
  }
1645
-
1646
  if ( ! empty( $sided_exclude_files[ $index ]['before']['css'] ) || ! empty( $sided_exclude_files[ $index ]['after']['css'] ) ) {
1647
  $this->manageExcludeFiles( $sided_exclude_files[ $index ], $index, 'css' );
1648
  }
2
 
3
  /**
4
  * Assets manager base class
5
+ *
6
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
7
  * @copyright (c) 05.11.2017, Webcraftic
8
+ * @version 1.0
9
  */
10
 
11
  // Exit if accessed directly
14
  }
15
 
16
  class WbcrGnz_ConfigAssetsManager extends Wbcr_FactoryClearfy206_Configurate {
17
+
18
  /**
19
  * Stores list of all available assets (used in rendering panel)
20
  *
21
  * @var array
22
  */
23
+ public $collection = [];
24
+
25
  /**
26
  * Plugins for additional columns
27
  *
28
  * @var array
29
  */
30
+ private $sided_plugins = [];
31
+
32
  /**
33
  * Css and js files excluded in sided plugins
34
  *
35
  * @var array
36
  */
37
+ private $sided_plugin_files = [];
38
+
39
  /**
40
  * @var bool
41
  */
42
  private $is_user_can;
43
+
44
  /**
45
  * @param Wbcr_Factory409_Plugin $plugin
46
  */
48
  parent::__construct( $plugin );
49
  $this->plugin = $plugin;
50
  }
51
+
52
  protected function isUserCan() {
53
  return current_user_can( 'manage_options' ) || current_user_can( 'manage_network' );
54
  }
55
+
56
  /**
57
  * Initilize entire machine
58
  */
60
  if ( $this->getPopulateOption( 'disable_assets_manager', false ) ) {
61
  return;
62
  }
63
+
64
  $on_frontend = $this->getPopulateOption( 'disable_assets_manager_on_front' );
65
  $on_backend = $this->getPopulateOption( 'disable_assets_manager_on_backend', true );
66
  $is_panel = $this->getPopulateOption( 'disable_assets_manager_panel' );
67
+
68
  if ( ( ! is_admin() && ! $on_frontend ) || ( is_admin() && ! $on_backend ) ) {
69
+ add_filter( 'script_loader_src', [ $this, 'unloadAssets' ], 10, 2 );
70
+ add_filter( 'style_loader_src', [ $this, 'unloadAssets' ], 10, 2 );
71
  }
72
+
73
  if ( ! $is_panel && ( ( is_admin() && ! $on_backend ) || ( ! is_admin() && ! $on_frontend ) ) ) {
74
  if ( ! is_admin() ) {
75
+ add_action( 'wp_enqueue_scripts', [ $this, 'appendAsset' ], - 100001 );
76
+ add_action( 'wp_footer', [ $this, 'assetsManager' ], 100001 );
77
  } else {
78
+ add_action( 'admin_enqueue_scripts', [ $this, 'appendAsset' ], - 100001 );
79
+ add_action( 'admin_footer', [ $this, 'assetsManager' ], 100001 );
80
  }
81
  }
82
+
83
  if ( ! is_admin() && ! $on_frontend ) {
84
+ add_action( 'wp_head', [ $this, 'collectAssets' ], 10000 );
85
+ add_action( 'wp_footer', [ $this, 'collectAssets' ], 10000 );
86
  }
87
+
88
  if ( is_admin() && ! $on_backend ) {
89
+ add_action( 'admin_head', [ $this, 'collectAssets' ], 10000 );
90
+ add_action( 'admin_footer', [ $this, 'collectAssets' ], 10000 );
91
  }
92
+
93
  if ( ! $is_panel && ( ( is_admin() && ! $on_backend ) || ( ! is_admin() && ! $on_frontend ) ) ) {
94
  if ( defined( 'LOADING_ASSETS_MANAGER_AS_ADDON' ) ) {
95
+ add_action( 'wbcr/clearfy/adminbar_menu_items', [ $this, 'clearfyAdminBarMenu' ] );
96
  } else {
97
+ add_action( 'admin_bar_menu', [ $this, 'assetsManagerAdminBar' ], 1000 );
98
  }
99
  }
100
+
101
  if ( ! is_admin() && ! $on_frontend ) {
102
+ add_action( 'init', [ $this, 'formSave' ] );
103
  }
104
+
105
  if ( is_admin() && ! $on_backend ) {
106
+ add_action( 'admin_init', [ $this, 'formSave' ] );
107
  }
108
+
109
+ add_action( 'plugins_loaded', [ $this, 'pluginsLoaded' ] );
110
+ add_action( 'wbcr_gnz_form_save', [ $this, 'actionFormSave' ] );
111
+
112
+ add_filter( 'wbcr_gnz_unset_disabled', [ $this, 'unsetDisabled' ], 10, 2 );
113
+ add_filter( 'wbcr_gnz_get_additional_head_columns', [ $this, 'getAdditionalHeadColumns' ] );
114
+ add_filter( 'wbcr_gnz_get_additional_controls_columns', [ $this, 'getAdditionalControlsColumns' ], 10, 4 );
115
+
116
+ add_filter( 'autoptimize_filter_js_exclude', [ $this, 'aoptFilterJsExclude' ], 10, 2 );
117
+ add_filter( 'autoptimize_filter_css_exclude', [ $this, 'aoptFilterCssExclude' ], 10, 2 );
118
+ add_filter( 'wmac_filter_js_exclude', [ $this, 'wmacFilterJsExclude' ], 10, 2 );
119
+ add_filter( 'wmac_filter_css_exclude', [ $this, 'wmacFilterCssExclude' ], 10, 2 );
120
+ add_filter( 'wmac_filter_js_minify_excluded', [ $this, 'wmacFilterJsMinifyExclude' ], 10, 2 );
121
+ add_filter( 'wmac_filter_css_minify_excluded', [ $this, 'wmacFilterCssMinifyExclude' ], 10, 2 );
122
  }
123
+
124
  function clearfyAdminBarMenu( $menu_items ) {
125
+ $current_url = add_query_arg( [ 'wbcr_assets_manager' => 1 ] );
126
+
127
+ $menu_items['assetsManager'] = [
128
  'title' => '<span class="dashicons dashicons-list-view"></span> ' . __( 'Assets Manager', 'gonzales' ),
129
  'href' => $current_url
130
+ ];
131
+
132
  return $menu_items;
133
  }
134
+
135
  /**
136
  * @param WP_Admin_Bar $wp_admin_bar
137
  */
139
  if ( ! $this->isUserCan() ) {
140
  return;
141
  }
142
+
143
+ $current_url = add_query_arg( [ 'wbcr_assets_manager' => 1 ] );
144
+
145
+ $args = [
146
  'id' => 'assetsManager',
147
  'title' => __( 'Assets Manager', 'gonzales' ),
148
  'href' => $current_url
149
+ ];
150
  $wp_admin_bar->add_node( $args );
151
  }
152
+
153
  /**
154
  * Action plugins loaded
155
  */
156
  public function pluginsLoaded() {
157
  if ( ! is_admin() ) {
158
+ $this->sided_plugins = [
159
  'aopt' => 'autoptimize/autoptimize.php',
160
  'wmac' => 'minify-and-combine/minify-and-combine.php'
161
+ ];
162
  }
163
+
164
  if ( class_exists( 'WCL_Plugin' ) && ( WCL_Plugin::app()->getPopulateOption( 'remove_js_version', false ) || WCL_Plugin::app()->getPopulateOption( 'remove_css_version', false ) ) ) {
165
  $this->sided_plugins['wclp'] = 'clearfy/clearfy.php';
166
  }
167
+
168
 
169
+
 
170
  $this->sided_plugins = apply_filters( 'wbcr_gnz_sided_plugins', $this->sided_plugins );
171
  }
172
+
173
  function assetsManager() {
174
  if ( ! $this->isUserCan() || ! isset( $_GET['wbcr_assets_manager'] ) ) {
175
  return;
176
  }
177
+
178
  $current_url = esc_url( $this->getCurrentUrl() );
179
+
180
  // todo: вынести в метод
181
  if ( is_multisite() && is_network_admin() ) {
182
+ $options = $this->getNetworkOption( 'assets_manager_options', [] );
183
  } else {
184
+ $options = $this->getOption( 'assets_manager_options', [] );
185
  }
186
+
187
  echo '<div id="WBCR" class="wbcr-gnz-wrapper"';
188
  if ( isset( $_GET['wbcr_assets_manager'] ) ) {
189
  echo 'style="display: block;"';
190
  }
191
  echo '>';
192
+
193
  //Form
194
  echo '<form method="POST">';
195
  wp_nonce_field( 'wbcr_assets_manager_nonce', 'wbcr_assets_manager_save' );
196
+
197
  //Header
198
  echo '<header class="wbcr-gnz-panel">';
199
  echo '<div class="wbcr-gnz-panel__left">';
217
  echo '<button class="wbcr-gnz-panel__close wbcr-close-button" type="button" aria-label="' . __( 'Close', 'gonzales' ) . '" data-href="' . remove_query_arg( 'wbcr_assets_manager' ) . '"></button>';
218
  echo '</div>';
219
  echo '</header>';
220
+
221
  // Main content
222
  echo '<main class="wbcr-gnz-content">';
223
+
224
  uksort( $this->collection, function ( $a, $b ) {
225
  if ( 'plugins' == $a ) {
226
  return - 1;
227
  }
228
+
229
  if ( 'plugins' == $b ) {
230
  return 1;
231
  }
232
+
233
  return strcasecmp( $a, $b );
234
  } );
235
+
236
  // Tabs
237
  echo '<ul class="wbcr-gnz-tabs">';
238
  foreach ( $this->collection as $resource_type => $resources ) {
241
  echo '</li>';
242
  }
243
  echo '</ul>';
244
+
245
  // Info
246
  echo '<div class="wbcr-gnz-info"><div class="wbcr-gnz-info__warning">';
247
  echo '<p><b>' . __( 'Important! Each page of your website has different sets of scripts and styles files.', 'gonzales' ) . '</b></p>';
248
  echo '<p>' . __( 'Use this feature to disable unwanted scripts and styles by setting up the logic for different types of pages. We recommend working in "Safe mode" because disabling any necessary system script file can corrupt the website. All changes done in Safe mode are available for administrator only. This way only you, as the administrator, can see the result of optimization. To enable the changes for other users, uncheck Safe mode.', 'gonzales' ) . '</p>';
249
  echo '<p>' . sprintf( __( 'For more details and user guides, check the plugin’s <a href="%s" target="_blank" rel="noreferrer noopener">documentation</a>.', 'gonzales' ), WbcrFactoryClearfy206_Helpers::getWebcrafticSitePageUrl( WGZ_Plugin::app()->getPluginName(), 'docs' ) ) . '</p>';
250
  echo '</div>';
251
+
252
  $premium_button = '<a class="wbcr-gnz-button__pro" href="' . WbcrFactoryClearfy206_Helpers::getWebcrafticSitePageUrl( WGZ_Plugin::app()->getPluginName(), 'assets-manager' ) . '" target="_blank" rel="noreferrer noopener">' . __( 'Upgrade to Premium', 'gonzales' ) . '</a>';
253
+
254
  $upgrade_to_premium_info = '<div class="wbcr-gnz-info__go-to-premium"><ul>';
255
  $upgrade_to_premium_info .= '<h3><span>' . __( 'MORE IN CLEARFY BUSINESS', 'gonzales' ) . '</span>' . $premium_button . '</h3><ul>';
256
  $upgrade_to_premium_info .= '<li>' . __( 'Disable plugins (groups of scripts)', 'gonzales' ) . '</li>';
262
  $upgrade_to_premium_info .= '</div>';
263
  echo apply_filters( 'wbcr_gnz_upgrade_to_premium_info', $upgrade_to_premium_info );
264
  echo '</div>';
265
+
266
  global $plugin_state;
267
+
268
  foreach ( $this->collection as $resource_type => $resources ) {
269
  // Tabs content
270
  echo '<div class="wbcr-gnz-tabs-content">';
275
  echo '<col class="wbcr-gnz-table__script"/>';
276
  echo '<col class="wbcr-gnz-table__state"/>';
277
  echo '<col class="wbcr-gnz-table__turn-on"/>';
278
+
279
  foreach ( $resources as $resource_name => $types ) {
280
  $plugin_state = false;
281
+
282
  if ( 'plugins' == $resource_type && ! empty( $resource_name ) ) {
283
  $plugin_data = $this->getPluginData( $resource_name );
284
+
285
  echo '<tbody>';
286
+
287
  if ( ! empty( $plugin_data ) ) {
288
  $is_disabled = $this->getIsDisabled( $options, $resource_type, $resource_name );
289
  $disabled = $this->getDisabled( $is_disabled, $options, $resource_type, $resource_name );
290
+
291
  $is_enabled = $this->getIsEnabled( $options, $resource_type, $resource_name );
292
  $enabled = $this->getEnabled( $is_enabled, $options, $resource_type, $resource_name );
293
+
294
  $plugin_state = $this->getState( $is_disabled, $disabled, $current_url );
295
  $plugin_state = apply_filters( 'wbcr_gnz_get_plugin_state', false, $plugin_state );
296
+
297
  echo '<tr class="wbcr-gnz-table__alternate">';
298
  echo '<th style="width:5%">' . __( 'Loaded', 'gonzales' ) . '</th>';
299
  echo '<th colspan="2">' . __( 'Plugin', 'gonzales' ) . '</th>';
300
+
301
  echo apply_filters( 'wbcr_gnz_get_additional_head_columns', '' );
302
+
303
  echo '<th class="wbcr-gnz-table__column_switch"><b>' . __( 'Load resource?', 'gonzales' ) . '</b></th>';
304
  echo '<th class="wbcr-gnz-table__column_condition">' . __( 'Conditions', 'gonzales' ) . '</th>';
305
  echo '</tr>';
312
  echo '<div class="wbcr-gnz-table__item-author"><strong>' . __( 'Author', 'gonzales' ) . ':</strong> ' . $plugin_data['Author'] . '</div>';
313
  echo '<div class="wbcr-gnz-table__item-version"><strong>' . __( 'Version', 'gonzales' ) . ':</strong> ' . $plugin_data['Version'] . '</div>';
314
  echo '</td>';
315
+
316
  echo apply_filters( 'wbcr_gnz_get_additional_controls_columns', '', $resource_type, $resource_name, $resource_name );
317
+
318
  // State Controls
319
  $id = '[' . $resource_type . '][' . $resource_name . ']';
320
  echo $this->getStateControrlHTML( $id, $plugin_state, $is_disabled, $is_enabled, $resource_type, $resource_name, $disabled, $enabled, $current_url );
321
  echo '</tr>';
322
  }
323
  }
324
+
325
  echo '<tr class="wbcr-gnz-table__alternate">';
326
  echo '<th style="width:5%">' . __( 'Loaded', 'gonzales' ) . '</th>';
327
  echo '<th style="width:5%">' . __( 'Size', 'gonzales' ) . '</th>';
328
  echo '<th class="wgz-th">' . __( 'Resource', 'gonzales' ) . '</th>';
329
+
330
  echo apply_filters( 'wbcr_gnz_get_additional_head_columns', '' );
331
+
332
  echo '<th class="wbcr-gnz-table__column_switch"><b>' . __( 'Load resource?', 'gonzales' ) . '</b></th>';
333
  echo '<th class="wbcr-gnz-table__column_condition">' . __( 'Conditions', 'gonzales' ) . '</th>';
334
  echo '</tr>';
335
+
336
  foreach ( $types as $type_name => $rows ) {
337
+
338
  if ( ! empty( $rows ) ) {
339
  foreach ( $rows as $handle => $row ) {
340
  $is_disabled = $this->getIsDisabled( $options, $type_name, $handle );
341
  $disabled = $this->getDisabled( $is_disabled, $options, $type_name, $handle );
342
+
343
  $is_enabled = $this->getIsEnabled( $options, $type_name, $handle );
344
  $enabled = $this->getEnabled( $is_enabled, $options, $type_name, $handle );
345
+
346
  /**
347
  * Find dependency
348
  */
349
+ $deps = [];
350
  foreach ( $rows as $dep_key => $dep_val ) {
351
  if ( in_array( $handle, $dep_val['deps'] ) /*&& $is_disabled*/ ) {
352
  $deps[] = '<a href="#' . $type_name . '-' . $dep_key . '">' . $dep_key . '</a>';
353
  }
354
  }
355
+
356
  $comment = ( ! empty( $deps ) ? '<span class="wbcr-use-by-comment">' . __( 'In use by', 'gonzales' ) . ' ' . implode( ', ', $deps ) . '</span>' : '' );
357
  $requires = '';
358
  if ( ! empty( $row['deps'] ) ) {
359
+ $rdeps = [];
360
  foreach ( $row['deps'] as $dep_val ) {
361
  $rdeps[] = '<a href="#' . $type_name . '-' . $dep_val . '">' . $dep_val . '</a>';
362
  }
363
  $requires = ( $comment ? '<br>' : '' ) . '<span class="wbcr-use-by-comment">' . __( 'Requires', 'gonzales' ) . ' ' . implode( ', ', $rdeps ) . '</span>';
364
  }
365
+
366
  echo '<tr>';
367
+
368
  // Loaded
369
  $state = $this->getState( $is_disabled, $disabled, $current_url );
370
  $display_state = $plugin_state === 1 ? 1 : $state;
374
  echo ( 'plugins' == $resource_type ? ' wbcr-state-' . $resource_name : '' ) . '">';
375
  echo '</div>';
376
  echo '</td>';
377
+
378
  // Size
379
  echo '<td>';
380
  echo '<div class="wbcr-gnz-table__size-value">' . $row['size'] . ' <b>KB</b></div>';
381
  echo '</td>';
382
+
383
  // Handle + Path + In use
384
  echo '<td class="wgz-td">';
385
  echo '<div class="wbcr-gnz-table__script-name"><b class="wbcr-wgz-resource-type-' . $type_name . '">' . $type_name . '</b>[' . $handle . ']</div>';
393
  echo '</div>';
394
  echo '<div>' . $comment . $requires . '</div>';
395
  echo '</td>';
396
+
397
  // Controls for other plugins
398
  echo apply_filters( 'wbcr_gnz_get_additional_controls_columns', '', $type_name, $row['url_full'], $resource_name );
399
+
400
  // State Controls
401
  $id = '[' . $type_name . '][' . $handle . ']';
402
  echo $this->getStateControrlHTML( $id, $state, $is_disabled, $is_enabled, $type_name, $handle, $disabled, $enabled, $current_url );
403
+
404
  echo "<input type='hidden' class='wbcr-info-data' data-type='{$type_name}' data-off='{$display_state}' value='{$row['size']}'>";
405
  echo '</tr>';
406
+
407
  echo apply_filters( 'wbcr_gnz_after_scripts_table_row', '', $resource_type, $resource_name, $type_name, $handle );
408
  }
409
  }
410
  }
411
+
412
  if ( 'plugins' == $resource_type && ! empty( $resource_name ) ) {
413
  echo '</tbody>';
414
  }
415
  }
416
+
417
  echo '</table>';
418
  echo '</div>';
419
  echo '</div>';
422
  echo '</form> <!-- /endform -->';
423
  echo '</div> <!-- /div2 -->';
424
  }
425
+
426
  /**
427
  * Get is disabled
428
  *
435
  public function getIsDisabled( $options, $type_name, $handle ) {
436
  return isset( $options['disabled'] ) && isset( $options['disabled'][ $type_name ] ) && isset( $options['disabled'][ $type_name ][ $handle ] );
437
  }
438
+
439
  /**
440
  * Get disabled
441
  *
447
  * @return array
448
  */
449
  public function getDisabled( $is_disabled, $options, $type_name, $handle ) {
450
+ $disabled = [];
451
+
452
  if ( $is_disabled ) {
453
  $disabled = &$options['disabled'][ $type_name ][ $handle ];
454
  if ( ! isset( $disabled['current'] ) ) {
455
+ $disabled['current'] = [];
456
  }
457
  if ( ! isset( $disabled['everywhere'] ) ) {
458
+ $disabled['everywhere'] = [];
459
  }
460
+
461
  $disabled = apply_filters( 'wbcr_gnz_get_disabled', $disabled );
462
  }
463
+
464
  return $disabled;
465
  }
466
+
467
  /**
468
  * Get is enabled
469
  *
476
  public function getIsEnabled( $options, $type_name, $handle ) {
477
  return isset( $options['enabled'] ) && isset( $options['enabled'][ $type_name ] ) && isset( $options['enabled'][ $type_name ][ $handle ] );
478
  }
479
+
480
  /**
481
  * Get enabled
482
  *
488
  * @return array
489
  */
490
  public function getEnabled( $is_enabled, $options, $type_name, $handle ) {
491
+ $enabled = [];
492
+
493
  if ( $is_enabled ) {
494
  $enabled = &$options['enabled'][ $type_name ][ $handle ];
495
+
496
  if ( ! isset( $enabled['current'] ) ) {
497
+ $enabled['current'] = [];
498
  }
499
  if ( ! isset( $enabled['everywhere'] ) ) {
500
+ $enabled['everywhere'] = [];
501
  }
502
+
503
  $enabled = apply_filters( 'wbcr_gnz_get_enabled', $enabled );
504
  }
505
+
506
  return $enabled;
507
  }
508
+
509
  /**
510
  * Get State
511
  *
520
  if ( $is_disabled && ( $disabled['everywhere'] == 1 || in_array( $current_url, $disabled['current'] ) || apply_filters( 'wbcr_gnz_check_state_disabled', false, $disabled ) ) ) {
521
  $state = 1;
522
  }
523
+
524
  return $state;
525
  }
526
+
527
  /**
528
  * Get state controrl HTML
529
  *
550
  $html .= '<span class="wbcr-gnz-switch__slider"></span>';
551
  $html .= '</label>';
552
  $html .= '</td>';
553
+
554
  // Enable
555
  $class_name = 'wbcr-assets-manager-enable';
556
  if ( 'plugins' == $type_name ) {
579
  $options .= '<option value="regex"' . selected( $is_disabled && ! empty( $disabled['regex'] ), true, false ) . ' class="wbcr-gnz-table__select-pro">' . __( 'Regular expression (PRO)', 'gonzales' ) . '</option>';
580
  $html .= apply_filters( 'wbcr_gnz_select_options', $options, $is_disabled, $disabled );
581
  $html .= '</select>';
582
+
583
  // Everywhere
584
  $html .= "<span class='wbcr-assets-manager everywhere'";
585
  if ( ! $is_disabled || empty( $disabled['everywhere'] ) ) {
588
  $html .= ">";
589
  $html .= '<div class="wbcr-gnz-table__label">' . __( 'Exclude', 'gonzales' ) . ': <i class="wbcr-gnz-help-hint wbcr-gnz-tooltip wbcr-gnz-tooltip-bottom" data-tooltip="' . __( 'You can disable this resource for all pages, except sections and page types listed below. Specify sections and page types with the enabled resource.', 'gonzales' ) . '"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""></i></div>';
590
  $html .= '<ul class="wbcr-gnz-table__options">';
591
+
592
  $html .= '<li class="wbcr-gnz-table__options-item">';
593
  $html .= "<input type='hidden' name='enabled{$id}[current]' value='' />";
594
  $html .= '<label class="wbcr-gnz-table__checkbox">';
600
  $html .= '<span class="wbcr-gnz-table__checkbox-text">' . __( 'Current URL', 'gonzales' ) . '</span>';
601
  $html .= '</label>';
602
  $html .= '</li>';
603
+
604
+ $post_types = get_post_types( [ 'public' => true ], 'objects', 'and' );
605
  if ( ! empty( $post_types ) ) {
606
  $html .= "<input type='hidden' name='enabled{$id}[post_types]' value='' />";
607
  foreach ( $post_types as $key => $value ) {
619
  $html .= '</li>';
620
  }
621
  }
622
+
623
+ $taxonomies = get_taxonomies( [ 'public' => true ], 'objects', 'and' );
624
+
625
  if ( ! empty( $taxonomies ) ) {
626
  unset( $taxonomies['category'] );
627
  $html .= "<input type='hidden' name='enabled{$id}[taxonomies]' value='' />";
640
  $html .= '</li>';
641
  }
642
  }
643
+
644
  $categories = get_categories();
645
+
646
  if ( ! empty( $categories ) ) {
647
  $html .= "<input type='hidden' name='enabled{$id}[categories]' value='' />";
648
  foreach ( $categories as $key => $cat ) {
660
  $html .= '</li>';
661
  }
662
  }
663
+
664
  $html .= '</ul>';
665
  $html .= '</span>';
666
+
667
  // Custom URL
668
  $control_html = '<div class="wbcr-gnz-table__field wbcr-assets-manager custom"';
669
  if ( ! $is_disabled || empty( $disabled['custom'] ) ) {
687
  $control_html .= '<textarea class="wbcr-gnz-table__textarea" rows="3" name="disabled' . $id . '[regex]" placeholder="^rockstar-[0-9]{2,5}" disabled="disabled"></textarea>';
688
  $control_html .= "</div>";
689
  $html .= apply_filters( 'wbcr_gnz_control_html', $control_html, $id, $is_disabled, $disabled );
690
+
691
  $html .= '</span>';
692
+
693
  if ( isset( $disabled['current'] ) && ! empty( $disabled['current'] ) ) {
694
  $custom_urls = "";
695
+
696
  foreach ( $disabled['current'] as $item_url ) {
697
  if ( $current_url != $item_url ) {
698
  $full_url = site_url() . $item_url;
699
  $custom_urls .= "<span><a href='" . $full_url . "'>" . $full_url . "</a></span>";
700
  }
701
  }
702
+
703
  if ( ! empty( $custom_urls ) ) {
704
  $html .= '<div class="wbcr-gnz-table__also">';
705
  $html .= '<div class="wbcr-gnz-table__label">' . __( 'Also disabled for pages', 'gonzales' ) . ':</div>';
708
  }
709
  }
710
  $html .= '</td>';
711
+
712
  return $html;
713
  }
714
+
715
  public function formSave() {
716
  if ( isset( $_GET['wbcr_assets_manager'] ) && isset( $_POST['wbcr_assets_manager_save'] ) ) {
717
+
718
  if ( ! $this->isUserCan() || ! wp_verify_nonce( filter_input( INPUT_POST, 'wbcr_assets_manager_save' ), 'wbcr_assets_manager_nonce' ) ) {
719
  wp_die( __( 'You don\'t have enough capability to edit this information.', 'gonzales' ), 403 );
720
+
721
  return;
722
  }
723
+
724
  // todo: вынести в метод
725
  if ( is_multisite() && is_network_admin() ) {
726
+ $options = $this->getNetworkOption( 'assets_manager_options', [] );
727
  } else {
728
+ $options = $this->getOption( 'assets_manager_options', [] );
729
  }
730
+
731
  $current_url = esc_url( $this->getCurrentUrl() );
732
+
733
  if ( isset( $_POST['disabled'] ) && ! empty( $_POST['disabled'] ) ) {
734
  foreach ( $_POST['disabled'] as $type => $assets ) {
735
  if ( ! empty( $assets ) ) {
736
  foreach ( $assets as $handle => $where ) {
737
  $handle = sanitize_text_field( $handle );
738
  $where = sanitize_text_field( $where['state'] );
739
+
740
  if ( ! isset( $options['disabled'][ $type ][ $handle ] ) ) {
741
+ $options = is_array( $options ) ? $options : [];
742
+ $options['disabled'][ $type ][ $handle ] = [];
743
  }
744
  $disabled = &$options['disabled'][ $type ][ $handle ];
745
+
746
  if ( ! empty( $where ) && 'disable' == $where ) {
747
  $action = isset( $_POST['wgz_action'][ $type ][ $handle ] ) ? $_POST['wgz_action'][ $type ][ $handle ] : '';
748
+
749
  if ( "everywhere" == $action ) {
750
  $disabled = apply_filters( 'wbcr_gnz_unset_disabled', $disabled, $action );
751
+
752
  $disabled['everywhere'] = 1;
753
  } else if ( "current" == $action ) {
754
  $disabled = apply_filters( 'wbcr_gnz_unset_disabled', $disabled, $action );
755
+
756
  if ( ! isset( $disabled['current'] ) || ! is_array( $disabled['current'] ) ) {
757
+ $disabled['current'] = [];
758
  }
759
+
760
  if ( ! in_array( $current_url, $disabled['current'] ) ) {
761
  array_push( $disabled['current'], $current_url );
762
  }
766
  }
767
  } else {
768
  $disabled = apply_filters( 'wbcr_gnz_unset_disabled', $disabled, 'current' );
769
+
770
  if ( isset( $disabled['current'] ) ) {
771
  $current_key = array_search( $current_url, $disabled['current'] );
772
+
773
  if ( ! empty( $current_key ) || $current_key === 0 ) {
774
  unset( $disabled['current'][ $current_key ] );
775
  if ( empty( $disabled['current'] ) ) {
778
  }
779
  }
780
  }
781
+
782
  if ( empty( $disabled ) ) {
783
  unset( $options['disabled'][ $type ][ $handle ] );
784
  if ( empty( $options['disabled'][ $type ] ) ) {
792
  }
793
  }
794
  }
795
+
796
  if ( isset( $_POST['enabled'] ) && ! empty( $_POST['enabled'] ) ) {
797
  foreach ( $_POST['enabled'] as $type => $assets ) {
798
  if ( ! empty( $assets ) ) {
799
  foreach ( $assets as $handle => $where ) {
800
+
801
  if ( ! isset( $options['enabled'][ $type ][ $handle ] ) ) {
802
+ $options = is_array( $options ) ? $options : [];
803
+ $options['enabled'][ $type ][ $handle ] = [];
804
  }
805
  $enabled = &$options['enabled'][ $type ][ $handle ];
806
+
807
  $action = isset( $_POST['wgz_action'][ $type ][ $handle ] ) ? $_POST['wgz_action'][ $type ][ $handle ] : '';
808
+
809
  if ( "everywhere" == $action && ( ! empty( $where['current'] ) || $where['current'] === "0" ) ) {
810
  if ( ! isset( $enabled['current'] ) || ! is_array( $enabled['current'] ) ) {
811
+ $enabled['current'] = [];
812
  }
813
  if ( ! in_array( $where['current'], $enabled['current'] ) ) {
814
  array_push( $enabled['current'], $where['current'] );
824
  }
825
  }
826
  }
827
+
828
  if ( "everywhere" == $action && ! empty( $where['post_types'] ) ) {
829
+ $enabled['post_types'] = [];
830
  foreach ( $where['post_types'] as $key => $post_type ) {
831
  if ( isset( $enabled['post_types'] ) ) {
832
  if ( ! in_array( $post_type, $enabled['post_types'] ) ) {
837
  } else {
838
  unset( $enabled['post_types'] );
839
  }
840
+
841
  if ( "everywhere" == $action && ! empty( $where['taxonomies'] ) ) {
842
+ $enabled['taxonomies'] = [];
843
  foreach ( $where['taxonomies'] as $key => $taxonomy ) {
844
  if ( isset( $enabled['taxonomies'] ) ) {
845
  if ( ! in_array( $taxonomy, $enabled['taxonomies'] ) ) {
850
  } else {
851
  unset( $enabled['taxonomies'] );
852
  }
853
+
854
  if ( "everywhere" == $action && ! empty( $where['categories'] ) ) {
855
+ $enabled['categories'] = [];
856
  foreach ( $where['categories'] as $key => $category ) {
857
  if ( isset( $enabled['categories'] ) ) {
858
  if ( ! in_array( $category, $enabled['categories'] ) ) {
863
  } else {
864
  unset( $enabled['categories'] );
865
  }
866
+
867
  if ( empty( $enabled ) ) {
868
  unset( $options['enabled'][ $type ][ $handle ] );
869
  if ( empty( $options['enabled'][ $type ] ) ) {
877
  }
878
  }
879
  }
880
+
881
  do_action( 'wbcr_gnz_form_save' );
882
+
883
  if ( is_multisite() && is_network_admin() ) {
884
  $this->updateNetworkOption( 'assets_manager_options', $options );
885
  } else {
886
  $this->updateOption( 'assets_manager_options', $options );
887
  }
888
+
889
  WbcrFactoryClearfy206_Helpers::flushPageCache();
890
  }
891
  }
892
+
893
  /**
894
  * Get disabled from options
895
  *
901
  private function getDisabledFromOptions( $type, $handle ) {
902
  // todo: вынести в метод
903
  if ( is_multisite() && is_network_admin() ) {
904
+ $options = $this->getNetworkOption( 'assets_manager_options', [] );
905
  } else {
906
+ $options = $this->getOption( 'assets_manager_options', [] );
907
  }
908
+
909
  $results = apply_filters( 'wbcr_gnz_get_disabled_from_options', false, $options, $type, $handle );
910
  if ( false !== $results ) {
911
  return $results;
912
  }
913
+
914
  if ( isset( $options['disabled'] ) && isset( $options['disabled'][ $type ] ) && isset( $options['disabled'][ $type ][ $handle ] ) ) {
915
  return $options['disabled'][ $type ][ $handle ];
916
  }
917
+
918
  return null;
919
  }
920
+
921
  /**
922
  * Get enabled from options
923
  *
929
  private function getEnabledFromOptions( $type, $handle ) {
930
  // todo: вынести в метод
931
  if ( is_multisite() && is_network_admin() ) {
932
+ $options = $this->getNetworkOption( 'assets_manager_options', [] );
933
  } else {
934
+ $options = $this->getOption( 'assets_manager_options', [] );
935
  }
936
+
937
  $results = apply_filters( 'wbcr_gnz_get_enabled_from_options', false, $options, $type, $handle );
938
  if ( false !== $results ) {
939
  return $results;
940
  }
941
+
942
  if ( isset( $options['enabled'] ) && isset( $options['enabled'][ $type ] ) && isset( $options['enabled'][ $type ][ $handle ] ) ) {
943
  return $options['enabled'][ $type ][ $handle ];
944
  }
945
+
946
  return null;
947
  }
948
+
949
  function unloadAssets( $src, $handle ) {
950
  if ( isset( $_GET['wbcr_assets_manager'] ) ) {
951
  return $src;
952
  }
953
+
954
  if ( apply_filters( 'wbcr_gnz_check_unload_assets', false ) ) {
955
  return $src;
956
  }
957
+
958
  $type = ( current_filter() == 'script_loader_src' ) ? 'js' : 'css';
959
+
960
  $current_url = esc_url( $this->getCurrentUrl() );
961
+
962
  $disabled = $this->getDisabledFromOptions( $type, $handle );
963
  $enabled = $this->getEnabledFromOptions( $type, $handle );
964
+
965
  if ( ( isset( $disabled['everywhere'] ) && $disabled['everywhere'] == 1 ) || ( isset( $disabled['current'] ) && is_array( $disabled['current'] ) && in_array( $current_url, $disabled['current'] ) ) || apply_filters( 'wbcr_gnz_check_disabled_is_set', false, $disabled, $current_url ) ) {
966
+
967
  if ( isset( $enabled['current'] ) && is_array( $enabled['current'] ) && in_array( $current_url, $enabled['current'] ) ) {
968
  return $src;
969
  }
970
+
971
  if ( apply_filters( 'wbcr_gnz_check_unload_disabled', false, $disabled, $current_url ) ) {
972
  return $src;
973
  }
974
+
975
  if ( isset( $enabled['post_types'] ) && is_singular() && in_array( get_post_type(), $enabled['post_types'] ) ) {
976
  return $src;
977
  }
978
+
979
+ if ( isset( $enabled['taxonomies'] ) ) {
980
+ $query = get_queried_object();
981
+
982
+ if ( ! empty( $query ) && isset( $query->taxonomy ) && in_array( $query->taxonomy, $enabled['taxonomies'] ) ) {
983
+ return $src;
984
+ }
985
  }
986
+
987
  if ( isset( $enabled['categories'] ) && in_array( get_query_var( 'cat' ), $enabled['categories'] ) ) {
988
  return $src;
989
  }
990
+
991
  return false;
992
  }
993
+
994
  return $src;
995
  }
996
+
997
  /**
998
  * Get information regarding used assets
999
  *
1003
  if ( ! isset( $_GET['wbcr_assets_manager'] ) || ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
1004
  return false;
1005
  }
1006
+
1007
+ $denied = [
1008
+ 'js' => [ 'wbcr-assets-manager', 'admin-bar' ],
1009
+ 'css' => [ 'wbcr-assets-manager', 'admin-bar', 'dashicons' ],
1010
+ ];
1011
  $denied = apply_filters( 'wbcr_gnz_denied_assets', $denied );
1012
+
1013
  /**
1014
  * Imitate full untouched list without dequeued assets
1015
  * Appends part of original table. Safe approach.
1016
  */
1017
+ $data_assets = [
1018
  'js' => wp_scripts(),
1019
  'css' => wp_styles(),
1020
+ ];
1021
+
1022
  foreach ( $data_assets as $type => $data ) {
1023
  //$resource = array();
1024
  foreach ( $data->groups as $el => $val ) {
1028
  if ( isset( $data->registered[ $el ]->src ) ) {
1029
  $url = $this->prepareCorrectUrl( $data->registered[ $el ]->src );
1030
  $url_short = str_replace( get_home_url(), '', $url );
1031
+
1032
  if ( false !== strpos( $url, get_theme_root_uri() ) ) {
1033
  $resource_type = 'theme';
1034
  } else if ( false !== strpos( $url, plugins_url() ) ) {
1036
  } else {
1037
  $resource_type = 'misc';
1038
  }
1039
+
1040
  $resource_name = '';
1041
  if ( 'plugins' == $resource_type ) {
1042
  $clean_url = str_replace( WP_PLUGIN_URL . '/', '', $url );
1043
  $url_parts = explode( '/', $clean_url );
1044
  $resource_name = isset( $url_parts[0] ) ? $url_parts[0] : '';
1045
  }
1046
+
1047
+ $this->collection[ $resource_type ][ $resource_name ][ $type ][ $el ] = [
1048
  'url_full' => $url,
1049
  'url_short' => $url_short,
1050
  //'state' => $this->get_visibility($type, $el),
1051
  'size' => $this->getAssetSize( $url ),
1052
  'ver' => $data->registered[ $el ]->ver,
1053
+ 'deps' => ( isset( $data->registered[ $el ]->deps ) ? $data->registered[ $el ]->deps : [] ),
1054
+ ];
1055
  }
1056
  }
1057
  //}
1058
  }
1059
  }
1060
  }
1061
+
1062
  return false;
1063
  }
1064
+
1065
  /**
1066
  * Loads functionality that allows to enable/disable js/css without site reload
1067
  */
1068
  public function appendAsset() {
1069
  if ( $this->isUserCan() && isset( $_GET['wbcr_assets_manager'] ) ) {
1070
+ wp_enqueue_style( 'wbcr-assets-manager', WGZ_PLUGIN_URL . '/assets/css/assets-manager.css', [], $this->plugin->getPluginVersion() );
1071
+ wp_enqueue_script( 'wbcr-assets-manager', WGZ_PLUGIN_URL . '/assets/js/assets-manager.js', [ 'jquery' ], $this->plugin->getPluginVersion(), true );
1072
  }
1073
  }
1074
+
1075
  /**
1076
  * Exception for address starting from "//example.com" instead of
1077
  * "http://example.com". WooCommerce likes such a format
1078
  *
1079
+ * @param string $url Incorrect URL.
1080
  *
1081
  * @return string Correct URL.
1082
  */
1086
  } else {
1087
  $out = $url;
1088
  }
1089
+
1090
  return $out;
1091
  }
1092
+
1093
  /**
1094
  * Get current URL
1095
  *
1102
  } else {
1103
  $out = $url[0];
1104
  }
1105
+
1106
  return $out;
1107
  }
1108
+
1109
  /**
1110
  * Checks how heavy is file
1111
  *
1112
+ * @param string $src URL.
1113
  *
1114
  * @return int Size in KB.
1115
  */
1116
  private function getAssetSize( $src ) {
1117
  $weight = 0;
1118
+
1119
  $home = get_theme_root() . '/../..';
1120
  $src = explode( '?', $src );
1121
+
1122
  if ( ! filter_var( $src[0], FILTER_VALIDATE_URL ) === false && strpos( $src[0], get_home_url() ) === false ) {
1123
  return 0;
1124
  }
1125
+
1126
  $src_relative = $home . str_replace( get_home_url(), '', $this->prepareCorrectUrl( $src[0] ) );
1127
+
1128
  if ( file_exists( $src_relative ) ) {
1129
  $weight = round( filesize( $src_relative ) / 1024, 1 );
1130
  }
1131
+
1132
  return $weight;
1133
  }
1134
+
1135
  /**
1136
  * Unset disabled
1137
  *
1146
  } else if ( "current" == $action ) {
1147
  unset( $disabled['everywhere'] );
1148
  }
1149
+
1150
  return $disabled;
1151
  }
1152
+
1153
  /**
1154
  * Get plugin data from folder name
1155
  *
1158
  * @return array
1159
  */
1160
  private function getPluginData( $name ) {
1161
+ $data = [];
1162
+
1163
  if ( $name ) {
1164
  if ( ! function_exists( 'get_plugins' ) ) {
1165
  // подключим файл с функцией get_plugins()
1176
  }
1177
  }
1178
  }
1179
+
1180
  return $data;
1181
  }
1182
+
1183
  /**
1184
  * Get sided plugin name
1185
  *
1197
 
1198
  return "";*/
1199
  }
1200
+
1201
  /**
1202
  * Get exclude sided plugin files
1203
  *
1204
  * @param string $index
1205
  * @param string $type
1206
+ * @param bool $full
1207
  *
1208
  * @return array
1209
  */
1211
  if ( isset( $this->sided_plugin_files[ $index ][ $type ] ) && ! empty( $this->sided_plugin_files[ $index ][ $type ] ) ) {
1212
  return $this->sided_plugin_files[ $index ][ $type ];
1213
  }
1214
+
1215
+ $this->sided_plugin_files[ $index ][ $type ] = [];
1216
+
1217
  // todo: вынести в метод
1218
  if ( is_multisite() && is_network_admin() ) {
1219
+ $options = $this->getNetworkOption( 'assets_manager_sided_plugins', [] );
1220
  } else {
1221
+ $options = $this->getOption( 'assets_manager_sided_plugins', [] );
1222
  }
1223
+
1224
  $plugin = $this->getSidedPluginName( $index );
1225
+
1226
  if ( $plugin && $options ) {
1227
  if ( isset( $options[ $plugin ][ $type ] ) ) {
1228
  $urls = $options[ $plugin ][ $type ];
1229
+
1230
  if ( is_array( $urls ) ) {
1231
  foreach ( $urls as $url ) {
1232
+
1233
  if ( $full ) {
1234
  $file = ( false !== strpos( $url, site_url() ) ? $url : site_url() . '/' . trim( $url, '/\\' ) );
1235
  } else {
1239
  $file = $url;
1240
  }
1241
  }
1242
+
1243
  $this->sided_plugin_files[ $index ][ $type ][] = $file;
1244
  }
1245
  }
1246
  }
1247
  }
1248
+
1249
  return $this->sided_plugin_files[ $index ][ $type ];
1250
  }
1251
+
1252
  /**
1253
  * Is component active
1254
  *
1258
  */
1259
  private function isComponentActive( $index ) {
1260
  include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
1261
+
1262
  $plugin_path = isset( $this->sided_plugins[ $index ] ) ? $this->sided_plugins[ $index ] : null;
1263
+
1264
  if ( $index == 'wmac' && defined( 'LOADING_ASSETS_MANAGER_AS_ADDON' ) && class_exists( 'WCL_Plugin' ) ) {
1265
  return WCL_Plugin::app()->isActivateComponent( 'minify_and_combine' );
1266
  }
1267
+
1268
  return is_plugin_active( $plugin_path );
1269
  }
1270
+
1271
  /**
1272
  * Get component name
1273
  *
1285
  $data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin_path );
1286
  $name = $data['Name'];
1287
  }
1288
+
1289
  return $name;
1290
  }
1291
+
1292
  /**
1293
  * Get head columns
1294
  *
1302
  if ( $this->isComponentActive( $index ) ) {
1303
  $title = $this->getComponentName( $plugin_path, $index );
1304
  $text = $index == 'wclp' ? __( 'remove version?', 'gonzales' ) : __( 'optimize?', 'gonzales' );
1305
+
1306
  $hint = '';
1307
  if ( $index == 'wclp' ) {
1308
  $hint = __( 'You’ve enabled &#34;Remove query strings&#34; from static resources in the &#34;Clearfy&#34; plugin. This list of settings helps you to exclude the necessary scripts and styles with remaining query strings. Press No to add a file to the excluded list.', 'gonzales' );
1315
  }
1316
  }
1317
  }
1318
+
1319
  return $html;
1320
  }
1321
+
1322
  /**
1323
  * Get active status for sided plugin
1324
  *
1332
  */
1333
  private function getActiveStatusForSidedPlugin( $index, $options, $plugin, $type, $handle ) {
1334
  $active = isset( $options[ $plugin ][ $type ] ) && is_array( $options[ $plugin ][ $type ] ) && in_array( $handle, $options[ $plugin ][ $type ] );
1335
+
1336
  /*if( !$active && !isset($options[$plugin]) ) {
1337
 
1338
  switch( $index ) {
1350
  break;
1351
  }
1352
  }*/
1353
+
1354
  return $active;
1355
  }
1356
+
1357
  /**
1358
  * Get controls columns
1359
  *
1366
  */
1367
  public function getAdditionalControlsColumns( $html, $type, $handle, $plugin_handle ) {
1368
  if ( ! empty( $this->sided_plugins ) ) {
1369
+
1370
  // todo: вынести в метод
1371
  if ( is_multisite() && is_network_admin() ) {
1372
+ $options = $this->getNetworkOption( 'assets_manager_sided_plugins', [] );
1373
  } else {
1374
+ $options = $this->getOption( 'assets_manager_sided_plugins', [] );
1375
  }
1376
+
1377
  foreach ( $this->sided_plugins as $index => $plugin_path ) {
1378
  if ( $this->isComponentActive( $index ) ) {
1379
  $plugin = $this->getSidedPluginName( $index );
1380
+
1381
  $active = $this->getActiveStatusForSidedPlugin( $index, $options, $plugin, $type, $handle );
1382
  $name = "sided_plugins[{$plugin}][{$type}][{$handle}]";
1383
+
1384
  $html .= "<td>";
1385
+
1386
  if ( ! empty( $handle ) && ( 'plugins' != $type && false !== strpos( $handle, '.' . $type ) || 'plugins' == $type ) ) {
1387
  $html .= '<label class="wbcr-gnz-switch">';
1388
  $html .= '<input class="wbcr-gnz-switch__input visually-hidden wbcr-gnz-sided-disable';
1398
  }
1399
  }
1400
  }
1401
+
1402
  return $html;
1403
  }
1404
+
1405
  /**
1406
  * @param $index
1407
  * @param $type
1411
  */
1412
  private function filterExclusions( $index, $type, $exclude ) {
1413
  $files = $this->getSidedPluginFiles( $index, $type );
1414
+
1415
  if ( ! empty( $files ) ) {
1416
  if ( is_array( $exclude ) ) {
1417
  $exclude = array_merge( $exclude, $files );
1420
  $exclude .= ! empty( $exclude ) ? ',' . $dontmove : $dontmove;
1421
  }
1422
  }
1423
+
1424
  return $exclude;
1425
  }
1426
+
1427
  /**
1428
  * aopt filter js exclude
1429
  *
1435
  public function aoptFilterJsExclude( $exclude, $content ) {
1436
  return $this->filterExclusions( 'aopt', 'js', $exclude );
1437
  }
1438
+
1439
  /**
1440
  * aopt filter css exclude
1441
  *
1447
  public function aoptFilterCssExclude( $exclude, $content ) {
1448
  return $this->filterExclusions( 'aopt', 'css', $exclude );
1449
  }
1450
+
1451
  /**
1452
  * wmac filter js exclude
1453
  *
1459
  public function wmacFilterJsExclude( $exclude, $content ) {
1460
  return $this->filterExclusions( 'wmac', 'js', $exclude );
1461
  }
1462
+
1463
  /**
1464
  * wmac filter css exclude
1465
  *
1471
  public function wmacFilterCssExclude( $exclude, $content ) {
1472
  return $this->filterExclusions( 'wmac', 'css', $exclude );
1473
  }
1474
+
1475
  /**
1476
  * Filter js minify exclusions
1477
  *
1484
  */
1485
  private function filterJsMinifyExclusions( $index, $type, $result, $url ) {
1486
  $files = $this->getSidedPluginFiles( $index, $type );
1487
+
1488
  if ( ! empty( $files ) ) {
1489
  foreach ( $files as $file ) {
1490
  if ( false !== strpos( $url, $file ) ) {
1492
  }
1493
  }
1494
  }
1495
+
1496
  return $result;
1497
  }
1498
+
1499
  /**
1500
  * Action wmac_filter_js_minify_excluded
1501
  *
1507
  public function wmacFilterJsMinifyExclude( $result, $url ) {
1508
  return $this->filterJsMinifyExclusions( 'wmac', 'js', $result, $url );
1509
  }
1510
+
1511
  /**
1512
  * Action wmac_filter_css_minify_excluded
1513
  *
1519
  public function wmacFilterCssMinifyExclude( $result, $url ) {
1520
  return $this->filterJsMinifyExclusions( 'wmac', 'css', $result, $url );
1521
  }
1522
+
1523
  /**
1524
  * Manage excluded files
1525
  *
1553
  default:
1554
  return;
1555
  }
1556
+
1557
  // For clearfy need new line
1558
  $delimeter = $index == 'wclp' ? "\n" : ",";
1559
+ $current_exclude_files = ! empty( $exclude_files ) ? array_filter( array_map( 'trim', explode( $delimeter, $exclude_files ) ) ) : [];
1560
+
1561
  $delete_files = array_diff( $sided_exclude_files['before'][ $type ], $sided_exclude_files['after'][ $type ] );
1562
  $new_files = array_diff( $sided_exclude_files['after'][ $type ], $current_exclude_files );
1563
+
1564
  if ( empty( $current_exclude_files ) && ! empty( $new_files ) ) {
1565
  $current_exclude_files = $new_files;
1566
  } else if ( ! empty( $current_exclude_files ) ) {
1567
+ $new_exclude_files = [];
1568
  foreach ( $current_exclude_files as $file ) {
1569
+
1570
  if ( ! in_array( $file, $delete_files ) ) {
1571
  $new_exclude_files[] = $file;
1572
  }
1573
  }
1574
  $current_exclude_files = array_merge( $new_exclude_files, $new_files );
1575
  }
1576
+
1577
  $current_exclude_files = array_filter( array_unique( $current_exclude_files ) );
1578
+
1579
  switch ( $index ) {
1580
  case 'aopt':
1581
  update_option( 'autoptimize_' . $type . '_exclude', implode( ', ', $current_exclude_files ) );
1592
  break;
1593
  }
1594
  }
1595
+
1596
  /**
1597
  * Action form save
1598
  *
1601
  public function actionFormSave( $empty_before = false ) {
1602
  if ( ! empty( $this->sided_plugins ) && ! $empty_before ) {
1603
  foreach ( $this->sided_plugins as $index => $sided_plugin ) {
1604
+ $sided_exclude_files[ $index ]['before'] = [
1605
+ 'js' => [],
1606
+ 'css' => []
1607
+ ];
1608
  // For clearfy need full url
1609
  $full = ( $index == 'wclp' ? true : false );
1610
+
1611
  $sided_exclude_files[ $index ]['before']['js'] += $this->getSidedPluginFiles( $index, 'js', $full );
1612
  $sided_exclude_files[ $index ]['before']['css'] += $this->getSidedPluginFiles( $index, 'css', $full );
1613
  }
1614
  }
1615
+
1616
  if ( isset( $_POST['sided_plugins'] ) && ! empty( $_POST['sided_plugins'] ) ) {
1617
+ $sided_plugins_options = [];
1618
  foreach ( $_POST['sided_plugins'] as $plugin => $types ) {
1619
  foreach ( $types as $type => $urls ) {
1620
  foreach ( $urls as $url => $active ) {
1621
+
1622
  if ( ! empty( $url ) && $active ) {
1623
  $sided_plugins_options[ $plugin ][ $type ][] = $url;
1624
  }
1625
  }
1626
  }
1627
  }
1628
+
1629
  if ( is_multisite() && is_network_admin() ) {
1630
  $this->updateNetworkOption( 'assets_manager_sided_plugins', $sided_plugins_options );
1631
  } else {
1632
  $this->updateOption( 'assets_manager_sided_plugins', $sided_plugins_options );
1633
  }
1634
  }
1635
+
1636
  if ( ! empty( $this->sided_plugins ) ) {
1637
+ $this->sided_plugin_files = [];
1638
  foreach ( $this->sided_plugins as $index => $sided_plugin ) {
1639
+ $sided_exclude_files[ $index ]['after'] = [
1640
+ 'js' => [],
1641
+ 'css' => []
1642
+ ];
1643
  // For clearfy need full url
1644
  $full = ( $index == 'wclp' ? true : false );
1645
+
1646
  $sided_exclude_files[ $index ]['after']['js'] += $this->getSidedPluginFiles( $index, 'js', $full );
1647
  $sided_exclude_files[ $index ]['after']['css'] += $this->getSidedPluginFiles( $index, 'css', $full );
1648
+
1649
  if ( ! empty( $sided_exclude_files[ $index ]['before']['js'] ) || ! empty( $sided_exclude_files[ $index ]['after']['js'] ) ) {
1650
  $this->manageExcludeFiles( $sided_exclude_files[ $index ], $index, 'js' );
1651
  }
1652
+
1653
  if ( ! empty( $sided_exclude_files[ $index ]['before']['css'] ) || ! empty( $sided_exclude_files[ $index ]['after']['css'] ) ) {
1654
  $this->manageExcludeFiles( $sided_exclude_files[ $index ], $index, 'css' );
1655
  }
components/assets-manager/languages/gonzales-es_ES.mo ADDED
Binary file
components/assets-manager/languages/gonzales-es_ES.po ADDED
@@ -0,0 +1,466 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of Plugins - Clearfy in Spanish (Spain)
2
+ # This file is distributed under the same license as the Plugins - Clearfy – WordPress optimization plugin and disable ultimate tweaker - Development (trunk) package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: \n"
6
+ "POT-Creation-Date: 2019-04-28 06:23+0300\n"
7
+ "PO-Revision-Date: 2019-04-28 06:23+0300\n"
8
+ "Last-Translator: \n"
9
+ "Language-Team: \n"
10
+ "Language: es\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
15
+ "X-Generator: Poedit 2.1.1\n"
16
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
17
+ "X-Generator: Poedit 2.1.1\n"
18
+ "X-Poedit-Basepath: ..\n"
19
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
20
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
21
+ "X-Poedit-SourceCharset: UTF-8\n"
22
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
23
+ "X-Poedit-SearchPath-0: .\n"
24
+ "X-Poedit-SearchPathExcluded-0: libs\n"
25
+ "X-Poedit-SearchPathExcluded-1: components\n"
26
+ "X-Poedit-SearchPathExcluded-2: cache\n"
27
+
28
+ #: admin/boot.php:30
29
+ msgid ""
30
+ "We detected that you used the Assets manager plugin. Do you want to import "
31
+ "settings from this plugin to the Clearfy plugin?"
32
+ msgstr ""
33
+ "Configuración de activos detectada. ¿Desea importar esta configuración al "
34
+ "plugin Clearfy?"
35
+
36
+ #: admin/boot.php:31
37
+ msgid "Import options"
38
+ msgstr "Importar opciones"
39
+
40
+ #: admin/boot.php:48
41
+ msgid "Settings has been successfully imported!"
42
+ msgstr "¡Configuración importada exitosamente!"
43
+
44
+ #: admin/boot.php:140 admin/pages/assets-manager.php:96
45
+ msgid "Disable assets manager"
46
+ msgstr "Deshabilitar gestor de activos"
47
+
48
+ #: admin/boot.php:147 admin/pages/assets-manager.php:120
49
+ msgid "Disable assets manager panel"
50
+ msgstr "Deshabilitar el panel de Gestor de Activos"
51
+
52
+ #: admin/boot.php:153 admin/pages/assets-manager.php:129
53
+ msgid "Disable assets manager on front"
54
+ msgstr "Deshabilitar el administrador de activos en el frontend"
55
+
56
+ #: admin/boot.php:159 admin/pages/assets-manager.php:138
57
+ msgid "Disable assets manager on back-end"
58
+ msgstr "Deshabilitar el administrador de activos en el back-end"
59
+
60
+ #: admin/boot.php:165
61
+ msgid "Assets manager options"
62
+ msgstr "Opciiones del Gestor de Activos"
63
+
64
+ #: admin/boot.php:205 includes/class.configurate-assets.php:266
65
+ msgid "Disable plugins (groups of scripts)"
66
+ msgstr "Deshabilitar plugins (grupos de scripts)"
67
+
68
+ #: admin/boot.php:206 includes/class.configurate-assets.php:267
69
+ msgid "Conditions by the link template"
70
+ msgstr "Condiciones para enlace de plantilla."
71
+
72
+ #: admin/boot.php:207 includes/class.configurate-assets.php:268
73
+ msgid "Conditions by the regular expression"
74
+ msgstr "Condiciones para la expresión regular."
75
+
76
+ #: admin/boot.php:208 includes/class.configurate-assets.php:269
77
+ msgid "Safe mode"
78
+ msgstr "Modo seguro"
79
+
80
+ #: admin/boot.php:209 includes/class.configurate-assets.php:270
81
+ msgid "Statistics and optimization results"
82
+ msgstr "Estadísticas y resultados de optimización."
83
+
84
+ #: admin/boot.php:220
85
+ msgid "Get premium"
86
+ msgstr "Obtener premium"
87
+
88
+ #: admin/pages/assets-manager.php:48 admin/pages/assets-manager.php:67
89
+ #: admin/pages/assets-manager.php:75
90
+ msgid "Assets manager"
91
+ msgstr "Gestor de Activos"
92
+
93
+ #: admin/pages/assets-manager.php:67 admin/pages/assets-manager.php:75
94
+ msgid "General"
95
+ msgstr "General"
96
+
97
+ #: admin/pages/assets-manager.php:89
98
+ msgid "Disable unused scripts, styles, and fonts"
99
+ msgstr "Deshabilitar los scripts, estilos y fuentes no utilizados"
100
+
101
+ #: admin/pages/assets-manager.php:89
102
+ msgid ""
103
+ "There is a button in the adminbar called \"Script Manager\". If you click on "
104
+ "it you will see a list of loaded scripts, styles and fonts on the current "
105
+ "page of your site. If you think that one of the assets is superfluous on "
106
+ "this page, you can disable it individually, so that it does not create "
107
+ "unnecessary queries when page loading. Use the script manager very carefull "
108
+ "to non-corrupt your website. We recommend to test this function at a local "
109
+ "server."
110
+ msgstr ""
111
+ "Hay un botón en la barra de administración llamado \"Administrador de "
112
+ "secuencias de comandos\". Si hace clic en él, verá una lista de los scripts, "
113
+ "estilos y fuentes cargados en la página actual de su sitio. Si cree que uno "
114
+ "de los recursos es superfluo en esta página, puede deshabilitarlo "
115
+ "individualmente, para que no cree consultas innecesarias cuando se carga la "
116
+ "página. Utilice el administrador de scripts con mucho cuidado para no dañar "
117
+ "su sitio web. Recomendamos probar esta función en un servidor local."
118
+
119
+ #: admin/pages/assets-manager.php:98
120
+ msgid "Full disable of the module."
121
+ msgstr "Deshabilitación completa del módulo."
122
+
123
+ #: admin/pages/assets-manager.php:122
124
+ msgid ""
125
+ "By default in your admin bar there is a button for control the assets "
126
+ "scripts and styles. With this option, you can turn off the script manager on "
127
+ "front and back-end."
128
+ msgstr ""
129
+ "De forma predeterminada, en la barra de administración hay un botón para "
130
+ "controlar los scripts y estilos de activos. Con esta opción, puede "
131
+ "desactivar el administrador de secuencias de comandos en la parte frontal y "
132
+ "posterior."
133
+
134
+ #: admin/pages/assets-manager.php:131
135
+ msgid "Disables assets manager initialization for frontend."
136
+ msgstr "Desactiva el inicio del administrador de activos para el frontend."
137
+
138
+ #: admin/pages/assets-manager.php:140
139
+ msgid "Disables assets manager initialization for backend."
140
+ msgstr "Desactiva el inicio del administrador de activos para el backend."
141
+
142
+ #: gonzales.php:84
143
+ msgid "Webcraftic assets manager"
144
+ msgstr "Gestor de activos webcraftic"
145
+
146
+ #: includes/class.configurate-assets.php:128
147
+ #: includes/class.configurate-assets.php:147
148
+ msgid "Assets Manager"
149
+ msgstr "Gestor de Activos"
150
+
151
+ #: includes/class.configurate-assets.php:212
152
+ msgid "Total requests"
153
+ msgstr "Total de solicitudes"
154
+
155
+ #: includes/class.configurate-assets.php:213
156
+ msgid "Total size"
157
+ msgstr "Tamaño total"
158
+
159
+ #: includes/class.configurate-assets.php:214
160
+ msgid "Optimized size"
161
+ msgstr "Tamaño optimizado"
162
+
163
+ #: includes/class.configurate-assets.php:215
164
+ msgid "Disabled js"
165
+ msgstr "JS desactivado"
166
+
167
+ #: includes/class.configurate-assets.php:216
168
+ msgid "Disabled css"
169
+ msgstr "CSS desactivado"
170
+
171
+ #: includes/class.configurate-assets.php:218
172
+ msgid ""
173
+ "This is the general statistics to see the optimization result. Available in "
174
+ "the paid version only."
175
+ msgstr ""
176
+ "Esta es la estadística general para ver el resultado de la optimización. "
177
+ "Disponible solo en la versión de pago."
178
+
179
+ #: includes/class.configurate-assets.php:222
180
+ msgid "Reset"
181
+ msgstr "Resetear"
182
+
183
+ #: includes/class.configurate-assets.php:223
184
+ msgid "Save"
185
+ msgstr "Guardar"
186
+
187
+ #: includes/class.configurate-assets.php:224
188
+ msgid ""
189
+ "In test mode, you can experiment with disabling unused scripts safely for "
190
+ "your site. The resources that you disabled will be visible only to you (the "
191
+ "administrator), and all other users will receive an unoptimized version of "
192
+ "the site, until you remove this tick"
193
+ msgstr ""
194
+ "En el modo de prueba, puede experimentar con la desactivación segura de "
195
+ "scripts no utilizados para su sitio. Los recursos que desactivó solo serán "
196
+ "visibles para usted (el administrador), y todos los demás usuarios recibirán "
197
+ "una versión no optimizada del sitio, hasta que elimine esta marca"
198
+
199
+ #: includes/class.configurate-assets.php:225
200
+ msgid "Safe mode <b>PRO</b>"
201
+ msgstr "Modo seguro <b>PRO</b>"
202
+
203
+ #: includes/class.configurate-assets.php:227
204
+ msgid "Close"
205
+ msgstr "Cerrar"
206
+
207
+ #: includes/class.configurate-assets.php:257
208
+ msgid ""
209
+ "Important! Each page of your website has different sets of scripts and "
210
+ "styles files."
211
+ msgstr ""
212
+ "¡Importante! Cada página de su sitio web tiene diferentes conjuntos de "
213
+ "scripts y archivos de estilos."
214
+
215
+ #: includes/class.configurate-assets.php:258
216
+ msgid ""
217
+ "Use this feature to disable unwanted scripts and styles by setting up the "
218
+ "logic for different types of pages. We recommend working in \"Safe mode\" "
219
+ "because disabling any necessary system script file can corrupt the website. "
220
+ "All changes done in Safe mode are available for administrator only. This way "
221
+ "only you, as the administrator, can see the result of optimization. To "
222
+ "enable the changes for other users, uncheck Safe mode."
223
+ msgstr ""
224
+ "Utilice esta función para deshabilitar los scripts y estilos no deseados "
225
+ "configurando la mejor lógica para diferentes tipos de páginas. Recomendamos "
226
+ "trabajar en \"Safe mode\" ya que deshabilitar cualquier archivo importante "
227
+ "del script del sistema podría dañar el sitio web. Todos los cambios "
228
+ "realizados en Modo seguro están disponibles solo para el administrador. De "
229
+ "esta manera solo usted, como administrador, puede ver el resultado de la "
230
+ "optimización. Para habilitar los cambios para otros usuarios, desmarque Modo "
231
+ "seguro."
232
+
233
+ #: includes/class.configurate-assets.php:259
234
+ #, php-format
235
+ msgid ""
236
+ "For more details and user guides, check the plugin’s <a href=\"%s\" target="
237
+ "\"_blank\" rel=\"noreferrer noopener\">documentation</a>."
238
+ msgstr ""
239
+ "Para más detalles y guías de usuario del plugin, consulte la <a href=\"%s\" "
240
+ "target=\"_blank\" rel=\"noreferrer noopener\">documentación</a>."
241
+
242
+ #: includes/class.configurate-assets.php:262
243
+ msgid "Upgrade to Premium"
244
+ msgstr "Actualizar a Premium"
245
+
246
+ #: includes/class.configurate-assets.php:265
247
+ msgid "MORE IN CLEARFY BUSINESS"
248
+ msgstr "MÁS EN CLEARFY BUSINESS"
249
+
250
+ #: includes/class.configurate-assets.php:308
251
+ #: includes/class.configurate-assets.php:336
252
+ msgid "Loaded"
253
+ msgstr "Cargado"
254
+
255
+ #: includes/class.configurate-assets.php:309
256
+ msgid "Plugin"
257
+ msgstr "Plugin"
258
+
259
+ #: includes/class.configurate-assets.php:313
260
+ #: includes/class.configurate-assets.php:342
261
+ msgid "Load resource?"
262
+ msgstr "¿Cargar recurso?"
263
+
264
+ #: includes/class.configurate-assets.php:314
265
+ #: includes/class.configurate-assets.php:343
266
+ msgid "Conditions"
267
+ msgstr "Condiciones"
268
+
269
+ #: includes/class.configurate-assets.php:322
270
+ msgid "Author"
271
+ msgstr "Autor"
272
+
273
+ #: includes/class.configurate-assets.php:323
274
+ #: includes/class.configurate-assets.php:402
275
+ msgid "Version"
276
+ msgstr "Versión"
277
+
278
+ #: includes/class.configurate-assets.php:337
279
+ msgid "Size"
280
+ msgstr "Tamaño"
281
+
282
+ #: includes/class.configurate-assets.php:338
283
+ msgid "Resource"
284
+ msgstr "Recurso"
285
+
286
+ #: includes/class.configurate-assets.php:366
287
+ msgid "In use by"
288
+ msgstr "En uso por"
289
+
290
+ #: includes/class.configurate-assets.php:373
291
+ msgid "Requires"
292
+ msgstr "Requiere"
293
+
294
+ #: includes/class.configurate-assets.php:402
295
+ msgid "--"
296
+ msgstr "--"
297
+
298
+ #: includes/class.configurate-assets.php:559
299
+ #: includes/class.configurate-assets.php:1403
300
+ msgid "No"
301
+ msgstr "No"
302
+
303
+ #: includes/class.configurate-assets.php:559
304
+ #: includes/class.configurate-assets.php:1403
305
+ msgid "Yes"
306
+ msgstr "Sí"
307
+
308
+ #: includes/class.configurate-assets.php:575
309
+ msgid ""
310
+ "Click the switch in the <b>Load resource?</b> column to display the "
311
+ "conditions for loading the resource."
312
+ msgstr ""
313
+ "Haga clic en el switch de la columna <b>¿Cargar recurso?</b> para mostrar "
314
+ "las condiciones para cargar el recurso."
315
+
316
+ #: includes/class.configurate-assets.php:577
317
+ msgid ""
318
+ "Set the plugin logic to apply it to all plugin’s resources. This feature "
319
+ "available at the paid version."
320
+ msgstr ""
321
+ "Configure el \"plugin logic\" para aplicarlo a todos los recursos del "
322
+ "complemento. Esta característica está disponible en la versión de pago."
323
+
324
+ #: includes/class.configurate-assets.php:586
325
+ #: includes/class.configurate-assets.php:610
326
+ msgid "Current URL"
327
+ msgstr "URL actual"
328
+
329
+ #: includes/class.configurate-assets.php:587
330
+ msgid "Everywhere"
331
+ msgstr "Donde sea"
332
+
333
+ #: includes/class.configurate-assets.php:588
334
+ msgid "Custom URL (PRO)"
335
+ msgstr "URL personalizada (PRO)"
336
+
337
+ #: includes/class.configurate-assets.php:589
338
+ msgid "Regular expression (PRO)"
339
+ msgstr "Expresión regular (PRO)"
340
+
341
+ #: includes/class.configurate-assets.php:599
342
+ msgid "Exclude"
343
+ msgstr "Excluir"
344
+
345
+ #: includes/class.configurate-assets.php:599
346
+ msgid ""
347
+ "You can disable this resource for all pages, except sections and page types "
348
+ "listed below. Specify sections and page types with the enabled resource."
349
+ msgstr ""
350
+ "Puede deshabilitar este recurso para todas las páginas, excepto las "
351
+ "secciones y los tipos de página que se enumeran a continuación. Especifique "
352
+ "secciones y tipos de página con el recurso habilitado."
353
+
354
+ #: includes/class.configurate-assets.php:683
355
+ msgid "Example"
356
+ msgstr "Ejemplo"
357
+
358
+ #: includes/class.configurate-assets.php:683
359
+ msgid "Enter URL (set * for mask)"
360
+ msgstr "Ingrese URL (set * for mask)"
361
+
362
+ #: includes/class.configurate-assets.php:683
363
+ msgid ""
364
+ "You can disable the resource only for the pages with the matched to the "
365
+ "template address. For example, if you set the template for the link as "
366
+ "http://yoursite.test/profile/*, then the resource is disabled for the "
367
+ "following pages: http://yoursite.test/profile/12, http://yoursite.test/"
368
+ "profile/43, http://yoursite.test/profile/999. If you don’t use the asterisk "
369
+ "symbol in the template then the plugin will disable the resource only for "
370
+ "the pages with 100% match in the specified link type. This feature is "
371
+ "available at the paid version."
372
+ msgstr ""
373
+ "Puede deshabilitar el recurso solo para las páginas que coincidan con la "
374
+ "dirección de la plantilla. Por ejemplo, si configura la plantilla para el "
375
+ "enlace como http://yoursite.test/profile/*, el recurso se deshabilita para "
376
+ "las siguientes páginas: http://yoursite.test/profile/12, http://yoursite."
377
+ "test/profile/43, http://yoursite.test/profile/999. Si no usa el símbolo de "
378
+ "asterisco en la plantilla, el complemento deshabilitará el recurso solo para "
379
+ "las páginas con una coincidencia del 100% en el tipo de enlace especificado. "
380
+ "Esta característica está disponible en la versión de pago."
381
+
382
+ #: includes/class.configurate-assets.php:686
383
+ msgid "Add field"
384
+ msgstr "Añadir campo"
385
+
386
+ #: includes/class.configurate-assets.php:696
387
+ msgid "Enter regular expression"
388
+ msgstr "Ingrese la expresión regular"
389
+
390
+ #: includes/class.configurate-assets.php:696
391
+ msgid ""
392
+ "Regular expressions can be used by experts. This tool creates flexible "
393
+ "conditions to disable the resource. For example, if you specify this "
394
+ "expression: ^([A-z0-9]+-)?gifts? then the resource will be disabled at the "
395
+ "following pages http://yoursite.test/get-gift/, http://yoursite.test/gift/, "
396
+ "http://yoursite.test/get-gifts/, http://yoursite.test/gifts/. The plugin "
397
+ "ignores the backslash at the beginning of the query string, so you can "
398
+ "dismiss it. Check your regular expressions in here: https://regex101.com, "
399
+ "this will prevent you from the mistakes. This feature is available at the "
400
+ "paid version."
401
+ msgstr ""
402
+ "Las expresiones regulares pueden ser utilizadas por expertos. Esta "
403
+ "herramienta crea condiciones flexibles para deshabilitar el recurso. Por "
404
+ "ejemplo, si especifica esta expresión: ^ ([A-z0-9] + -)?Gifts? significa que "
405
+ "el recurso se deshabilitará en las siguientes páginas http: //yoursite.test/"
406
+ "get-gift/, http: //yoursite.test/gift/, http: //yoursite.test/get-gifts/, "
407
+ "http: / /yoursite.test/gifts/. El plugin ignora la barra diagonal inversa al "
408
+ "principio de la cadena de consulta, por lo que puede descartarla. Verifique "
409
+ "sus expresiones regulares aquí: https://regex101.com, esto evitará que "
410
+ "cometa errores. Esta característica está disponible en la versión de pago."
411
+
412
+ #: includes/class.configurate-assets.php:715
413
+ msgid "Also disabled for pages"
414
+ msgstr "También deshabilitado para páginas"
415
+
416
+ #: includes/class.configurate-assets.php:729
417
+ msgid "You don't have enough capability to edit this information."
418
+ msgstr "No tienes suficiente permisos para editar esta información."
419
+
420
+ #: includes/class.configurate-assets.php:1293
421
+ msgid "Minify and Combine"
422
+ msgstr "Minificar y Combinar"
423
+
424
+ #: includes/class.configurate-assets.php:1314
425
+ msgid "remove version?"
426
+ msgstr "¿Eliminar versión?"
427
+
428
+ #: includes/class.configurate-assets.php:1314
429
+ msgid "optimize?"
430
+ msgstr "¿optimizar?"
431
+
432
+ #: includes/class.configurate-assets.php:1318
433
+ msgid ""
434
+ "You’ve enabled &#34;Remove query strings&#34; from static resources in the "
435
+ "&#34;Clearfy&#34; plugin. This list of settings helps you to exclude the "
436
+ "necessary scripts and styles with remaining query strings. Press No to add a "
437
+ "file to the excluded list."
438
+ msgstr ""
439
+ "Has habilitado &#34;Eliminar cadenas de consulta&#34; de los recursos "
440
+ "estáticos en el &#34;Clearfy&#34; plugin. Esta lista de configuraciones le "
441
+ "ayuda a excluir los scripts y estilos necesarios con las cadenas de consulta "
442
+ "restantes. Presione No para agregar un archivo a la lista excluida."
443
+
444
+ #: includes/class.configurate-assets.php:1320
445
+ msgid ""
446
+ "You’ve enabled the &#34;Optimize js scripts?&#34; and &#34;Optimize CSS "
447
+ "options&#34; in the &#34;Minify & Combine plugin&#34;. These settings "
448
+ "exclude scripts and styles that you don’t want to optimize. Press No to add "
449
+ "a file to the excluded list."
450
+ msgstr ""
451
+ "Has habilitado &#34;Optimizar js scripts?&#34; y &#34;Optimizar CSS "
452
+ "options&#34; en el &#34;plugin Minify & Combine&#34;. Esta configuración "
453
+ "excluye los scripts y los estilos que no desea optimizar. Presione No para "
454
+ "agregar un archivo a la lista excluida."
455
+
456
+ #: includes/class.configurate-assets.php:1322
457
+ msgid ""
458
+ "You’ve enabled the &#34;Optimize js scripts?&#34; and &#34;Optimize CSS "
459
+ "options&#34; in the &#34;Autoptimize&#34;. These settings exclude scripts "
460
+ "and styles that you don’t want to optimize. Press No to add a file to the "
461
+ "excluded list."
462
+ msgstr ""
463
+ "Has habilitado &#34;Optimizar js scripts?&#34; y &#34;Optimizar CSS "
464
+ "options&#34; en el &#34;Autoptimize&#34;. Esta configuración excluye los "
465
+ "scripts y los estilos que no desea optimizar. Presione No para agregar un "
466
+ "archivo a la lista excluida."
components/assets-manager/languages/gonzales-ru_RU.po CHANGED
@@ -1,574 +1,574 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: clearfy\n"
4
- "POT-Creation-Date: 2018-10-16 15:56+0300\n"
5
- "PO-Revision-Date: 2018-10-19 22:37+0300\n"
6
- "Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
7
- "Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
8
- "Language: ru_RU\n"
9
- "MIME-Version: 1.0\n"
10
- "Content-Type: text/plain; charset=UTF-8\n"
11
- "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 2.1.1\n"
13
- "X-Poedit-Basepath: ../..\n"
14
- "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15
- "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
16
- "X-Poedit-SourceCharset: UTF-8\n"
17
- "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
18
- "X-Poedit-SearchPath-0: assets-manager\n"
19
- "X-Poedit-SearchPath-1: assets-manager-premium\n"
20
- "X-Poedit-SearchPathExcluded-0: assets-manager/libs\n"
21
-
22
- #: assets-manager-premium/admin/boot.php:46
23
- msgid ""
24
- "<strong>Assets manager Premium</strong><br>We did not find the installed "
25
- "plugin \"Assets manager\". Please install the plugin \"Assets manager\" "
26
- "first for premium functions!"
27
- msgstr ""
28
- "<strong>Менеджер скриптов премиум</strong><br> Мы не нашли установленный "
29
- "копонент \"Менеджер скриптов\". Пожалуйста, установите копонент \"Менеджер "
30
- "скриптов\" в первую очередь для премиум-функций!"
31
-
32
- #: assets-manager-premium/assets-manager-premium.php:63
33
- msgid "Webcraftic assets manager Premium"
34
- msgstr "Webcraftic менеджер скриптов премиум"
35
-
36
- #: assets-manager-premium/includes/class.configurate-assets.php:92
37
- #: assets-manager/includes/class.configurate-assets.php:204
38
- #: assets-manager/includes/class.configurate-assets.php:208
39
- msgid "Total requests"
40
- msgstr "Всего запросов"
41
-
42
- #: assets-manager-premium/includes/class.configurate-assets.php:93
43
- #: assets-manager/includes/class.configurate-assets.php:205
44
- msgid "Total size"
45
- msgstr "Общий вес"
46
-
47
- #: assets-manager-premium/includes/class.configurate-assets.php:94
48
- #: assets-manager/includes/class.configurate-assets.php:206
49
- msgid "Optimized size"
50
- msgstr "Оптим. вес"
51
-
52
- #: assets-manager-premium/includes/class.configurate-assets.php:95
53
- #: assets-manager/includes/class.configurate-assets.php:212
54
- msgid "Disabled js"
55
- msgstr "Отключено js"
56
-
57
- #: assets-manager-premium/includes/class.configurate-assets.php:96
58
- #: assets-manager/includes/class.configurate-assets.php:213
59
- msgid "Disabled css"
60
- msgstr "Отключено css"
61
-
62
- #: assets-manager-premium/includes/class.configurate-assets.php:119
63
- #: assets-manager/includes/class.configurate-assets.php:266
64
- msgid "Safe mode"
65
- msgstr "Безопасный режим"
66
-
67
- #: assets-manager-premium/includes/class.configurate-assets.php:300
68
- #: assets-manager/includes/class.configurate-assets.php:685
69
- msgid "Example"
70
- msgstr "Пример"
71
-
72
- #: assets-manager-premium/includes/class.configurate-assets.php:300
73
- #: assets-manager/includes/class.configurate-assets.php:685
74
- msgid "Enter URL (set * for mask)"
75
- msgstr "Введите URL (добавьте * для маски)"
76
-
77
- #: assets-manager-premium/includes/class.configurate-assets.php:308
78
- #: assets-manager-premium/includes/class.configurate-assets.php:316
79
- #: assets-manager/includes/class.configurate-assets.php:688
80
- msgid "Add field"
81
- msgstr "Добавить"
82
-
83
- #: assets-manager-premium/includes/class.configurate-assets.php:327
84
- #: assets-manager/includes/class.configurate-assets.php:698
85
- msgid "Enter regular expression"
86
- msgstr "Введите регулярное выражение"
87
-
88
- #: assets-manager-premium/includes/class.configurate-assets.php:532
89
- msgid "Custom URL"
90
- msgstr "Произвольный URL"
91
-
92
- #: assets-manager-premium/includes/class.configurate-assets.php:533
93
- msgid "Regular expression"
94
- msgstr "Регулярное выражение"
95
-
96
- #: assets-manager-premium/includes/class.configurate-assets.php:595
97
- msgid "Set the plugin logic to apply it to all plugin’s resources."
98
- msgstr ""
99
- "Установите логику плагина, чтобы применить его ко всем ресурсам плагина."
100
-
101
- #: assets-manager/admin/boot.php:48
102
- #: assets-manager/admin/pages/assets-manager.php:89
103
- msgid "Disable assets manager"
104
- msgstr "Отключить менеджер скриптов"
105
-
106
- #: assets-manager/admin/boot.php:55
107
- #: assets-manager/admin/pages/assets-manager.php:113
108
- msgid "Disable assets manager panel"
109
- msgstr "Скрыть панель в админбаре"
110
-
111
- #: assets-manager/admin/boot.php:61
112
- #: assets-manager/admin/pages/assets-manager.php:122
113
- msgid "Disable assets manager on front"
114
- msgstr "Отключить менеджер скриптов на внешней стороне сайта"
115
-
116
- #: assets-manager/admin/boot.php:67
117
- #: assets-manager/admin/pages/assets-manager.php:131
118
- msgid "Disable assets manager on back-end"
119
- msgstr "Отключить менеджер скриптов в админпанели"
120
-
121
- #: assets-manager/admin/boot.php:73
122
- msgid "Assets manager options"
123
- msgstr "Настройки менеджера скриптов"
124
-
125
- #: assets-manager/admin/boot.php:86
126
- msgid "Get ultimate plugin free"
127
- msgstr "Получите полную версию плагина бесплатно"
128
-
129
- #: assets-manager/admin/pages/assets-manager.php:48
130
- #: assets-manager/admin/pages/assets-manager.php:67
131
- msgid "Assets manager"
132
- msgstr "Менеджер скриптов"
133
-
134
- #: assets-manager/admin/pages/assets-manager.php:68
135
- msgid "General"
136
- msgstr "Основные"
137
-
138
- #: assets-manager/admin/pages/assets-manager.php:82
139
- msgid "Disable unused scripts, styles, and fonts"
140
- msgstr "Отключите неиспользуемые скрипты, стили и шрифты"
141
-
142
- #: assets-manager/admin/pages/assets-manager.php:82
143
- msgid ""
144
- "There is a button in the adminbar called \"Script Manager\". If you click on "
145
- "it you will see a list of loaded scripts, styles and fonts on the current "
146
- "page of your site. If you think that one of the assets is superfluous on "
147
- "this page, you can disable it individually, so that it does not create "
148
- "unnecessary queries when page loading. Use the script manager very carefull "
149
- "to non-corrupt your website. We recommend to test this function at a local "
150
- "server."
151
- msgstr ""
152
- "В админбаре есть кнопка под названием “Менеджер скриптов”, если на нее "
153
- "нажать вы увидите список загружаемых скриптов, стилей и шрифтов на текущей "
154
- "странице вашего сайта. Если вы считаете, что какой-то из ресурсов лишний на "
155
- "этой странице, вы можете индивидуально его отключить, чтобы он не создавал "
156
- "лишних запросов при загрузке. Используйте менеджер скриптов аккуратно, чтобы "
157
- "не нарушить работу вашего сайта. Мы рекомендуем вам использовать локальный "
158
- "сервер для тестирования этой функции."
159
-
160
- #: assets-manager/admin/pages/assets-manager.php:91
161
- msgid "Full disable of the module."
162
- msgstr "Полностью отключает работу модуля."
163
-
164
- #: assets-manager/admin/pages/assets-manager.php:115
165
- msgid ""
166
- "By default in your admin bar there is a button for control the assets "
167
- "scripts and styles. With this option, you can turn off the script manager on "
168
- "front and back-end."
169
- msgstr ""
170
- "По умолчанию в панели администратора есть кнопка для управления подключамыми "
171
- "скриптами и стилями. Используя эту настроку вы можете скрыть эту панель из "
172
- "админбара, чтобы она не занимала место."
173
-
174
- #: assets-manager/admin/pages/assets-manager.php:124
175
- msgid "Disables assets manager initialization for frontend."
176
- msgstr "Отключает инициализацию менеджера лицензий на внешней стороне сайта."
177
-
178
- #: assets-manager/admin/pages/assets-manager.php:133
179
- msgid "Disables assets manager initialization for backend."
180
- msgstr "Отключает инициализацию менеджера лицензий в админпанели сайта."
181
-
182
- #: assets-manager/gonzales.php:63
183
- msgid "Webcraftic assets manager"
184
- msgstr "Webcraftic менеджер скриптов"
185
-
186
- #: assets-manager/includes/class.configurate-assets.php:121
187
- #: assets-manager/includes/class.configurate-assets.php:141
188
- msgid "Script Manager"
189
- msgstr "Менеджер скриптов"
190
-
191
- #: assets-manager/includes/class.configurate-assets.php:208
192
- msgid "Total weight"
193
- msgstr "Общий вес"
194
-
195
- #: assets-manager/includes/class.configurate-assets.php:208
196
- msgid "Optimized weight"
197
- msgstr "Оптим. вес"
198
-
199
- #: assets-manager/includes/class.configurate-assets.php:215
200
- msgid ""
201
- "This is the general statistics to see the optimization result. Available in "
202
- "the paid version only."
203
- msgstr ""
204
- "Это общая статистика, чтобы увидеть результат оптимизации. Доступно только в "
205
- "платной версии."
206
-
207
- #: assets-manager/includes/class.configurate-assets.php:219
208
- msgid "Reset"
209
- msgstr "Сбросить"
210
-
211
- #: assets-manager/includes/class.configurate-assets.php:220
212
- msgid "Save"
213
- msgstr "Сохранить"
214
-
215
- #: assets-manager/includes/class.configurate-assets.php:221
216
- msgid ""
217
- "In test mode, you can experiment with disabling unused scripts safely for "
218
- "your site. The resources that you disabled will be visible only to you (the "
219
- "administrator), and all other users will receive an unoptimized version of "
220
- "the site, until you remove this tick"
221
- msgstr ""
222
- "В тестовом режиме можно поэкспериментировать с отключением неиспользуемых "
223
- "скриптов безопасно для вашего сайта. Отключенные ресурсы будут видны только "
224
- "вам (администратору), и все остальные пользователи получат "
225
- "неоптимизированную версию сайта, пока вы не снимите галочку с этого элемента."
226
-
227
- #: assets-manager/includes/class.configurate-assets.php:222
228
- msgid "Safe mode <b>PRO</b>"
229
- msgstr "Безопасный режим <b>PRO</b>"
230
-
231
- #: assets-manager/includes/class.configurate-assets.php:224
232
- msgid "Close"
233
- msgstr "Закрыть"
234
-
235
- #: assets-manager/includes/class.configurate-assets.php:254
236
- msgid ""
237
- "Important! Each page of your website has different sets of scripts and "
238
- "styles files."
239
- msgstr ""
240
- "Важно! На каждой странице вашего сайта подключаются разные наборы файлов "
241
- "скриптов и стилей. "
242
-
243
- #: assets-manager/includes/class.configurate-assets.php:255
244
- msgid ""
245
- "Use this feature to disable unwanted scripts and styles by setting up the "
246
- "logic for different types of pages. We recommend working in \"Safe mode\" "
247
- "because disabling any necessary system script file can corrupt the website. "
248
- "All changes done in Safe mode are available for administrator only. This way "
249
- "only you, as the administrator, can see the result of optimization. To "
250
- "enable the changes for other users, uncheck Safe mode."
251
- msgstr ""
252
- "Используйте этот инструмент для отключения неиспользуемых скриптов и стилей, "
253
- "устанавливая логику для разных типов страниц. Мы рекомендуем вам работать в "
254
- "“Безопасном режиме”, так как вы можете нарушить работу сайта, если отключите "
255
- "системные файлы скриптов, без которых невозможна полноценная работа сайта. В "
256
- "безопасном режиме, все ваши изменения будут работать только для "
257
- "администратора, это необходимо для того, чтобы только вы могли увидеть "
258
- "результат оптимизации. Чтобы изменения вступили в силу для всех остальных "
259
- "пользователей, просто снимите галочку “Безопасный режим”. "
260
-
261
- #: assets-manager/includes/class.configurate-assets.php:256
262
- #, php-format
263
- msgid ""
264
- "For more details and user guides, check the plugin’s <a href=\"%s\" target="
265
- "\"_blank\" rel=\"noreferrer noopener\">documentation</a>."
266
- msgstr ""
267
- "Более подробную информацию о работе с плагином можно найти в нашей <a href="
268
- "\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">документации</a>."
269
-
270
- #: assets-manager/includes/class.configurate-assets.php:259
271
- msgid "Upgrade to Premium"
272
- msgstr "Обновить до премиум"
273
-
274
- #: assets-manager/includes/class.configurate-assets.php:262
275
- msgid "MORE IN CLEARFY BUSINESS"
276
- msgstr "БОЛЬШЕ В CLEARFY БИЗНЕС"
277
-
278
- #: assets-manager/includes/class.configurate-assets.php:263
279
- msgid "Disable plugins (groups of scripts)"
280
- msgstr "Отключить плагины (группы скриптов)"
281
-
282
- #: assets-manager/includes/class.configurate-assets.php:264
283
- msgid "Conditions by the link template"
284
- msgstr "Условия по шаблону ссылки"
285
-
286
- #: assets-manager/includes/class.configurate-assets.php:265
287
- msgid "Conditions by the regular expression"
288
- msgstr "Условия по регулярному выражению"
289
-
290
- #: assets-manager/includes/class.configurate-assets.php:267
291
- msgid "Statistics and optimization results"
292
- msgstr "Статистика и результаты оптимизации"
293
-
294
- #: assets-manager/includes/class.configurate-assets.php:304
295
- #: assets-manager/includes/class.configurate-assets.php:332
296
- msgid "Loaded"
297
- msgstr "Загружен"
298
-
299
- #: assets-manager/includes/class.configurate-assets.php:305
300
- msgid "Plugin"
301
- msgstr "Плагин"
302
-
303
- #: assets-manager/includes/class.configurate-assets.php:309
304
- #: assets-manager/includes/class.configurate-assets.php:338
305
- msgid "Load resource?"
306
- msgstr "Загружать ресурс?"
307
-
308
- #: assets-manager/includes/class.configurate-assets.php:310
309
- #: assets-manager/includes/class.configurate-assets.php:339
310
- msgid "Conditions"
311
- msgstr "Условия"
312
-
313
- #: assets-manager/includes/class.configurate-assets.php:318
314
- msgid "Author"
315
- msgstr "Автор"
316
-
317
- #: assets-manager/includes/class.configurate-assets.php:319
318
- #: assets-manager/includes/class.configurate-assets.php:398
319
- msgid "Version"
320
- msgstr "Версия"
321
-
322
- #: assets-manager/includes/class.configurate-assets.php:333
323
- msgid "Size"
324
- msgstr "Размер"
325
-
326
- #: assets-manager/includes/class.configurate-assets.php:334
327
- msgid "Resource"
328
- msgstr "Ресурс"
329
-
330
- #: assets-manager/includes/class.configurate-assets.php:362
331
- msgid "In use by"
332
- msgstr "Используется "
333
-
334
- #: assets-manager/includes/class.configurate-assets.php:369
335
- msgid "Requires"
336
- msgstr "Зависимости"
337
-
338
- #: assets-manager/includes/class.configurate-assets.php:398
339
- msgid "--"
340
- msgstr ""
341
-
342
- #: assets-manager/includes/class.configurate-assets.php:561
343
- #: assets-manager/includes/class.configurate-assets.php:1406
344
- msgid "No"
345
- msgstr "Нет"
346
-
347
- #: assets-manager/includes/class.configurate-assets.php:561
348
- #: assets-manager/includes/class.configurate-assets.php:1406
349
- msgid "Yes"
350
- msgstr "Да"
351
-
352
- #: assets-manager/includes/class.configurate-assets.php:577
353
- msgid ""
354
- "Click the switch in the <b>Load resource?</b> column to display the "
355
- "conditions for loading the resource."
356
- msgstr ""
357
- "Щелкните переключатель в этой колонке <b>Загрузить ресурс?</b>, чтобы "
358
- "отобразить условия для загрузки ресурса."
359
-
360
- #: assets-manager/includes/class.configurate-assets.php:579
361
- msgid ""
362
- "Set the plugin logic to apply it to all plugin’s resources. This feature "
363
- "available at the paid version."
364
- msgstr ""
365
- "Устанавливая логику для плагина, она будет примена для всех его ресурсов. "
366
- "Данная возможность доступна только в платной версии плагина."
367
-
368
- #: assets-manager/includes/class.configurate-assets.php:588
369
- #: assets-manager/includes/class.configurate-assets.php:612
370
- msgid "Current URL"
371
- msgstr "Текущий URL"
372
-
373
- #: assets-manager/includes/class.configurate-assets.php:589
374
- msgid "Everywhere"
375
- msgstr "Повсюду"
376
-
377
- #: assets-manager/includes/class.configurate-assets.php:590
378
- msgid "Custom URL (PRO)"
379
- msgstr "Произвольная ссылка (PRO)"
380
-
381
- #: assets-manager/includes/class.configurate-assets.php:591
382
- msgid "Regular expression (PRO)"
383
- msgstr "Регулярное выражение (PRO)"
384
-
385
- #: assets-manager/includes/class.configurate-assets.php:601
386
- msgid "Exclude"
387
- msgstr "Исключить"
388
-
389
- #: assets-manager/includes/class.configurate-assets.php:601
390
- msgid ""
391
- "You can disable this resource for all pages, except sections and page types "
392
- "listed below. Specify sections and page types with the enabled resource."
393
- msgstr ""
394
- "Вы можете отключить этот ресурс на всех страницах вашего сайта, кроме "
395
- "нижеперечисленных разделов и типов страниц. Отметьте разделы и типы страниц, "
396
- "в которых вы не хотите отключать ресурс"
397
-
398
- #: assets-manager/includes/class.configurate-assets.php:685
399
- msgid ""
400
- "You can disable the resource only for the pages with the matched to the "
401
- "template address. For example, if you set the template for the link as "
402
- "http://yoursite.test/profile/*, then the resource is disabled for the "
403
- "following pages: http://yoursite.test/profile/12, http://yoursite.test/"
404
- "profile/43, http://yoursite.test/profile/999. If you don’t use the asterisk "
405
- "symbol in the template then the plugin will disable the resource only for "
406
- "the pages with 100% match in the specified link type. This feature is "
407
- "available at the paid version."
408
- msgstr ""
409
- "Вы можете отключить этот ресурс только на тех страницах, адрес которых будет "
410
- "соответствовать установленному вами шаблону. К примеру, если вы установите "
411
- "шаблон ссылки http://yoursite.test/profile/*, то ресурс будет отключен на "
412
- "следующих страницах http://yoursite.test/profile/12, http://yoursite.test/"
413
- "profile/43, http://yoursite.test/profile/999. Если вы не будете использовать "
414
- "звездочку в вашем шаблоне, то плагин отключит ресурс, только на странице где "
415
- "будет точное совпадение с установленной вами ссылкой. Эта функция доступна "
416
- "только в платной версии плагина."
417
-
418
- #: assets-manager/includes/class.configurate-assets.php:698
419
- msgid ""
420
- "Regular expressions can be used by experts. This tool creates flexible "
421
- "conditions to disable the resource. For example, if you specify this "
422
- "expression: ^([A-z0-9]+-)?gifts? then the resource will be disabled at the "
423
- "following pages http://yoursite.test/get-gift/, http://yoursite.test/gift/, "
424
- "http://yoursite.test/get-gifts/, http://yoursite.test/gifts/. The plugin "
425
- "ignores the backslash at the beginning of the query string, so you can "
426
- "dismiss it. Check your regular expressions in here: https://regex101.com, "
427
- "this will prevent you from the mistakes. This feature is available at the "
428
- "paid version."
429
- msgstr ""
430
- "Регулярные выражения используются экспертами. С помощью этого инструмента вы "
431
- "можете создать более гибкие условия для отключения ресурса. К примеру, если "
432
- "вы установите такое выражение: ^([A-z0-9]+-)?gifts?, то ресурс будет "
433
- "отключен на страницах http://yoursite.test/get-gift/, http://yoursite.test/"
434
- "gift/, http://yoursite.test/get-gifts/, http://yoursite.test/gifts/. Плагин "
435
- "игнорирует обратный слеш в начале строки запроса, поэтому вы можете его "
436
- "пропустить. Проверяйте свое регулярное выражение с помощью сервиса https://"
437
- "regex101.com, чтобы вы были точно уверены, что в вашем регулярном выражении "
438
- "нет ошибки. Эта функция доступна только в платной версии плагина."
439
-
440
- #: assets-manager/includes/class.configurate-assets.php:718
441
- msgid "Also disabled for pages"
442
- msgstr "Также отключен для страниц"
443
-
444
- #: assets-manager/includes/class.configurate-assets.php:1293
445
- msgid "Minify and Combine"
446
- msgstr "Минификация"
447
-
448
- #: assets-manager/includes/class.configurate-assets.php:1315
449
- msgid "remove version?"
450
- msgstr "Удалить версию?"
451
-
452
- #: assets-manager/includes/class.configurate-assets.php:1315
453
- msgid "optimize?"
454
- msgstr "оптимизировать?"
455
-
456
- #: assets-manager/includes/class.configurate-assets.php:1319
457
- msgid ""
458
- "You’ve enabled &#34;Remove query strings&#34; from static resources in the "
459
- "&#34;Clearfy&#34; plugin. This list of settings helps you to exclude the "
460
- "necessary scripts and styles with remaining query strings. Press No to add a "
461
- "file to the excluded list."
462
- msgstr ""
463
- "Вы включили опцию &#34;Удалить переменные запроса для статических "
464
- "ресурсов&#34; в плагине &#34;Clearfy&#34;, в этой колонке настроек вы можете "
465
- "исключить скрипты и стили, для которых вы хотите оставить переменые запроса. "
466
- "Просто выберите \"Нет\", чтобы добавить файл в исключения.."
467
-
468
- #: assets-manager/includes/class.configurate-assets.php:1321
469
- msgid ""
470
- "You’ve enabled the &#34;Optimize js scripts?&#34; and &#34;Optimize CSS "
471
- "options&#34; in the &#34;Minify & Combine plugin&#34;. These settings "
472
- "exclude scripts and styles that you don’t want to optimize. Press No to add "
473
- "a file to the excluded list."
474
- msgstr ""
475
- "Вы включили опцию &#34;Оптимизировать js скрипты?&#34; и &#34;Оптимизировать "
476
- "css&#34; в плагине &#34;Сжатие и Объединения&#34;. С помощью этой колонки "
477
- "настроек, вы можете исключить скрипты и стили, которые вы не хотите "
478
- "оптимизировать. Чтобы добавить файл в исключения просто нажмите кнопку \"Нет"
479
- "\"."
480
-
481
- #: assets-manager/includes/class.configurate-assets.php:1323
482
- msgid ""
483
- "You’ve enabled the &#34;Optimize js scripts?&#34; and &#34;Optimize CSS "
484
- "options&#34; in the &#34;Autoptimize&#34;. These settings exclude scripts "
485
- "and styles that you don’t want to optimize. Press No to add a file to the "
486
- "excluded list."
487
- msgstr ""
488
- "Вы включили опцию &#34;Оптимизировать js скрипты?&#34; и &#34;Оптимизировать "
489
- "css&#34; в плагине &#34;Autoptimize&#34;. С помощью этой колонки настроек, "
490
- "вы можете исключить скрипты и стили, которые вы не хотите оптимизировать. "
491
- "Чтобы добавить файл в исключения просто нажмите кнопку \"Нет\"."
492
-
493
- #~ msgid ""
494
- #~ "We found that you use the plugin \"Clearfy - disable unused functions\", "
495
- #~ "this plugin already has the same functions as \"Assets manager\", so you "
496
- #~ "can disable the \"Assets manager\" plugin!"
497
- #~ msgstr ""
498
- #~ "Мы обнаружили, что вы используете плагин \"Clearfy - disable unused "
499
- #~ "features\", этот плагин включает функционал \"WP Asset CleanUp\", вы "
500
- #~ "можете деактивировать плагин \"Менеджер скриптов\"!"
501
-
502
- #~ msgid ""
503
- #~ "Below you can disable/enable CSS and JS files on a per page/post basis, "
504
- #~ "as well as by custom post types. We recommend testing this locally or on "
505
- #~ "a staging site first, as you could break the appearance of your live "
506
- #~ "site. If you aren't sure about a certain script, you can try clicking on "
507
- #~ "it, as a lot of authors will mention their plugin or theme in the header "
508
- #~ "of the source code."
509
- #~ msgstr ""
510
- #~ "Ниже вы можете включить/отключить использование CSS и JS файлов в "
511
- #~ "записях, произвольных типах записей или страницах. Мы рекомендуем вам "
512
- #~ "эксперементировать со скриптами на локальном хостинге или тестом сайте, "
513
- #~ "так как вы можете нарушить работу сайта, если отключите системные файлы "
514
- #~ "скриптов, без которых невозможна полноценная работа сайта. Если вы не "
515
- #~ "уверены, для чего используется тот или иной файл, попробуйте нажать на "
516
- #~ "ссылку под его заголовком, в открывшемся файле вы можете увидеть "
517
- #~ "комментарий разработчика с ссылкой на описание плагина. Получив "
518
- #~ "достаточную информацию о функциях плагина, вы сможете более уверенно "
519
- #~ "включать или отключать его стили и скрипты."
520
-
521
- #~ msgid ""
522
- #~ "If for some reason you run into trouble, you can always enable everything "
523
- #~ "again to reset the settings."
524
- #~ msgstr ""
525
- #~ "Если по какой-то причине вы столкнулись с проблемами, вы всегда можете "
526
- #~ "включить все опции, чтобы сбросить настройки."
527
-
528
- #~ msgid "Save settings"
529
- #~ msgstr "Сохранить"
530
-
531
- #~ msgid "Hide panel in adminbar?"
532
- #~ msgstr "Скрыть панель из админбара?"
533
-
534
- #~ msgid "State"
535
- #~ msgstr "Состояние"
536
-
537
- #~ msgid "Script"
538
- #~ msgstr "Скрипт"
539
-
540
- #~ msgid "In use"
541
- #~ msgstr "Используется"
542
-
543
- #~ msgid "Disable"
544
- #~ msgstr "Отключить"
545
-
546
- #~ msgid "Enable"
547
- #~ msgstr "Включить"
548
-
549
- #~ msgid "Enabled"
550
- #~ msgstr "Включить"
551
-
552
- #~ msgid "Disable everwhere to view enable settings."
553
- #~ msgstr ""
554
- #~ "Нужно включить опцию \"повсюду\", чтобы увидеть дополнительные настройки."
555
-
556
- #~ msgid ""
557
- #~ "We found that you use the plugin \"Clearfy - disable unused functions\", "
558
- #~ "this plugin already has the same functions as \"WP Asset CleanUp\", so "
559
- #~ "you can disable the \"WP Asset CleanUp\" plugin!"
560
- #~ msgstr ""
561
- #~ "Мы обнаружили, что вы используете плагин \"Clearfy - disable unused "
562
- #~ "features\", этот плагин включает функционал \"WP Asset CleanUp\", вы "
563
- #~ "можете деактивировать плагин \"WP Asset CleanUp\"!"
564
-
565
- #~ msgid "Webcraftic Assets manager"
566
- #~ msgstr "Webcraftic менеджер скриптов"
567
-
568
- #~ msgid ""
569
- #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
570
- #~ "installed, this plugin already has disable comments functions, so you can "
571
- #~ "deactivate plugin \"WP Asset CleanUp\"!"
572
- #~ msgstr ""
573
- #~ "Мы обнаружили, что вы используете плагин \"Clearfy - disable unused "
574
- #~ "features\", этот плагин"
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: clearfy\n"
4
+ "POT-Creation-Date: 2018-10-16 15:56+0300\n"
5
+ "PO-Revision-Date: 2018-10-19 22:37+0300\n"
6
+ "Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
7
+ "Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
8
+ "Language: ru_RU\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.1.1\n"
13
+ "X-Poedit-Basepath: ../..\n"
14
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
16
+ "X-Poedit-SourceCharset: UTF-8\n"
17
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
18
+ "X-Poedit-SearchPath-0: assets-manager\n"
19
+ "X-Poedit-SearchPath-1: assets-manager-premium\n"
20
+ "X-Poedit-SearchPathExcluded-0: assets-manager/libs\n"
21
+
22
+ #: assets-manager-premium/admin/boot.php:46
23
+ msgid ""
24
+ "<strong>Assets manager Premium</strong><br>We did not find the installed "
25
+ "plugin \"Assets manager\". Please install the plugin \"Assets manager\" "
26
+ "first for premium functions!"
27
+ msgstr ""
28
+ "<strong>Менеджер скриптов премиум</strong><br> Мы не нашли установленный "
29
+ "копонент \"Менеджер скриптов\". Пожалуйста, установите копонент \"Менеджер "
30
+ "скриптов\" в первую очередь для премиум-функций!"
31
+
32
+ #: assets-manager-premium/assets-manager-premium.php:63
33
+ msgid "Webcraftic assets manager Premium"
34
+ msgstr "Webcraftic менеджер скриптов премиум"
35
+
36
+ #: assets-manager-premium/includes/class.configurate-assets.php:92
37
+ #: assets-manager/includes/class.configurate-assets.php:204
38
+ #: assets-manager/includes/class.configurate-assets.php:208
39
+ msgid "Total requests"
40
+ msgstr "Всего запросов"
41
+
42
+ #: assets-manager-premium/includes/class.configurate-assets.php:93
43
+ #: assets-manager/includes/class.configurate-assets.php:205
44
+ msgid "Total size"
45
+ msgstr "Общий вес"
46
+
47
+ #: assets-manager-premium/includes/class.configurate-assets.php:94
48
+ #: assets-manager/includes/class.configurate-assets.php:206
49
+ msgid "Optimized size"
50
+ msgstr "Оптим. вес"
51
+
52
+ #: assets-manager-premium/includes/class.configurate-assets.php:95
53
+ #: assets-manager/includes/class.configurate-assets.php:212
54
+ msgid "Disabled js"
55
+ msgstr "Отключено js"
56
+
57
+ #: assets-manager-premium/includes/class.configurate-assets.php:96
58
+ #: assets-manager/includes/class.configurate-assets.php:213
59
+ msgid "Disabled css"
60
+ msgstr "Отключено css"
61
+
62
+ #: assets-manager-premium/includes/class.configurate-assets.php:119
63
+ #: assets-manager/includes/class.configurate-assets.php:266
64
+ msgid "Safe mode"
65
+ msgstr "Безопасный режим"
66
+
67
+ #: assets-manager-premium/includes/class.configurate-assets.php:300
68
+ #: assets-manager/includes/class.configurate-assets.php:685
69
+ msgid "Example"
70
+ msgstr "Пример"
71
+
72
+ #: assets-manager-premium/includes/class.configurate-assets.php:300
73
+ #: assets-manager/includes/class.configurate-assets.php:685
74
+ msgid "Enter URL (set * for mask)"
75
+ msgstr "Введите URL (добавьте * для маски)"
76
+
77
+ #: assets-manager-premium/includes/class.configurate-assets.php:308
78
+ #: assets-manager-premium/includes/class.configurate-assets.php:316
79
+ #: assets-manager/includes/class.configurate-assets.php:688
80
+ msgid "Add field"
81
+ msgstr "Добавить"
82
+
83
+ #: assets-manager-premium/includes/class.configurate-assets.php:327
84
+ #: assets-manager/includes/class.configurate-assets.php:698
85
+ msgid "Enter regular expression"
86
+ msgstr "Введите регулярное выражение"
87
+
88
+ #: assets-manager-premium/includes/class.configurate-assets.php:532
89
+ msgid "Custom URL"
90
+ msgstr "Произвольный URL"
91
+
92
+ #: assets-manager-premium/includes/class.configurate-assets.php:533
93
+ msgid "Regular expression"
94
+ msgstr "Регулярное выражение"
95
+
96
+ #: assets-manager-premium/includes/class.configurate-assets.php:595
97
+ msgid "Set the plugin logic to apply it to all plugin’s resources."
98
+ msgstr ""
99
+ "Установите логику плагина, чтобы применить его ко всем ресурсам плагина."
100
+
101
+ #: assets-manager/admin/boot.php:48
102
+ #: assets-manager/admin/pages/assets-manager.php:89
103
+ msgid "Disable assets manager"
104
+ msgstr "Отключить менеджер скриптов"
105
+
106
+ #: assets-manager/admin/boot.php:55
107
+ #: assets-manager/admin/pages/assets-manager.php:113
108
+ msgid "Disable assets manager panel"
109
+ msgstr "Скрыть панель в админбаре"
110
+
111
+ #: assets-manager/admin/boot.php:61
112
+ #: assets-manager/admin/pages/assets-manager.php:122
113
+ msgid "Disable assets manager on front"
114
+ msgstr "Отключить менеджер скриптов на внешней стороне сайта"
115
+
116
+ #: assets-manager/admin/boot.php:67
117
+ #: assets-manager/admin/pages/assets-manager.php:131
118
+ msgid "Disable assets manager on back-end"
119
+ msgstr "Отключить менеджер скриптов в админпанели"
120
+
121
+ #: assets-manager/admin/boot.php:73
122
+ msgid "Assets manager options"
123
+ msgstr "Настройки менеджера скриптов"
124
+
125
+ #: assets-manager/admin/boot.php:86
126
+ msgid "Get ultimate plugin free"
127
+ msgstr "Получите полную версию плагина бесплатно"
128
+
129
+ #: assets-manager/admin/pages/assets-manager.php:48
130
+ #: assets-manager/admin/pages/assets-manager.php:67
131
+ msgid "Assets manager"
132
+ msgstr "Менеджер скриптов"
133
+
134
+ #: assets-manager/admin/pages/assets-manager.php:68
135
+ msgid "General"
136
+ msgstr "Основные"
137
+
138
+ #: assets-manager/admin/pages/assets-manager.php:82
139
+ msgid "Disable unused scripts, styles, and fonts"
140
+ msgstr "Отключите неиспользуемые скрипты, стили и шрифты"
141
+
142
+ #: assets-manager/admin/pages/assets-manager.php:82
143
+ msgid ""
144
+ "There is a button in the adminbar called \"Script Manager\". If you click on "
145
+ "it you will see a list of loaded scripts, styles and fonts on the current "
146
+ "page of your site. If you think that one of the assets is superfluous on "
147
+ "this page, you can disable it individually, so that it does not create "
148
+ "unnecessary queries when page loading. Use the script manager very carefull "
149
+ "to non-corrupt your website. We recommend to test this function at a local "
150
+ "server."
151
+ msgstr ""
152
+ "В админбаре есть кнопка под названием “Менеджер скриптов”, если на нее "
153
+ "нажать вы увидите список загружаемых скриптов, стилей и шрифтов на текущей "
154
+ "странице вашего сайта. Если вы считаете, что какой-то из ресурсов лишний на "
155
+ "этой странице, вы можете индивидуально его отключить, чтобы он не создавал "
156
+ "лишних запросов при загрузке. Используйте менеджер скриптов аккуратно, чтобы "
157
+ "не нарушить работу вашего сайта. Мы рекомендуем вам использовать локальный "
158
+ "сервер для тестирования этой функции."
159
+
160
+ #: assets-manager/admin/pages/assets-manager.php:91
161
+ msgid "Full disable of the module."
162
+ msgstr "Полностью отключает работу модуля."
163
+
164
+ #: assets-manager/admin/pages/assets-manager.php:115
165
+ msgid ""
166
+ "By default in your admin bar there is a button for control the assets "
167
+ "scripts and styles. With this option, you can turn off the script manager on "
168
+ "front and back-end."
169
+ msgstr ""
170
+ "По умолчанию в панели администратора есть кнопка для управления подключамыми "
171
+ "скриптами и стилями. Используя эту настроку вы можете скрыть эту панель из "
172
+ "админбара, чтобы она не занимала место."
173
+
174
+ #: assets-manager/admin/pages/assets-manager.php:124
175
+ msgid "Disables assets manager initialization for frontend."
176
+ msgstr "Отключает инициализацию менеджера лицензий на внешней стороне сайта."
177
+
178
+ #: assets-manager/admin/pages/assets-manager.php:133
179
+ msgid "Disables assets manager initialization for backend."
180
+ msgstr "Отключает инициализацию менеджера лицензий в админпанели сайта."
181
+
182
+ #: assets-manager/gonzales.php:63
183
+ msgid "Webcraftic assets manager"
184
+ msgstr "Webcraftic менеджер скриптов"
185
+
186
+ #: assets-manager/includes/class.configurate-assets.php:121
187
+ #: assets-manager/includes/class.configurate-assets.php:141
188
+ msgid "Script Manager"
189
+ msgstr "Менеджер скриптов"
190
+
191
+ #: assets-manager/includes/class.configurate-assets.php:208
192
+ msgid "Total weight"
193
+ msgstr "Общий вес"
194
+
195
+ #: assets-manager/includes/class.configurate-assets.php:208
196
+ msgid "Optimized weight"
197
+ msgstr "Оптим. вес"
198
+
199
+ #: assets-manager/includes/class.configurate-assets.php:215
200
+ msgid ""
201
+ "This is the general statistics to see the optimization result. Available in "
202
+ "the paid version only."
203
+ msgstr ""
204
+ "Это общая статистика, чтобы увидеть результат оптимизации. Доступно только в "
205
+ "платной версии."
206
+
207
+ #: assets-manager/includes/class.configurate-assets.php:219
208
+ msgid "Reset"
209
+ msgstr "Сбросить"
210
+
211
+ #: assets-manager/includes/class.configurate-assets.php:220
212
+ msgid "Save"
213
+ msgstr "Сохранить"
214
+
215
+ #: assets-manager/includes/class.configurate-assets.php:221
216
+ msgid ""
217
+ "In test mode, you can experiment with disabling unused scripts safely for "
218
+ "your site. The resources that you disabled will be visible only to you (the "
219
+ "administrator), and all other users will receive an unoptimized version of "
220
+ "the site, until you remove this tick"
221
+ msgstr ""
222
+ "В тестовом режиме можно поэкспериментировать с отключением неиспользуемых "
223
+ "скриптов безопасно для вашего сайта. Отключенные ресурсы будут видны только "
224
+ "вам (администратору), и все остальные пользователи получат "
225
+ "неоптимизированную версию сайта, пока вы не снимите галочку с этого элемента."
226
+
227
+ #: assets-manager/includes/class.configurate-assets.php:222
228
+ msgid "Safe mode <b>PRO</b>"
229
+ msgstr "Безопасный режим <b>PRO</b>"
230
+
231
+ #: assets-manager/includes/class.configurate-assets.php:224
232
+ msgid "Close"
233
+ msgstr "Закрыть"
234
+
235
+ #: assets-manager/includes/class.configurate-assets.php:254
236
+ msgid ""
237
+ "Important! Each page of your website has different sets of scripts and "
238
+ "styles files."
239
+ msgstr ""
240
+ "Важно! На каждой странице вашего сайта подключаются разные наборы файлов "
241
+ "скриптов и стилей. "
242
+
243
+ #: assets-manager/includes/class.configurate-assets.php:255
244
+ msgid ""
245
+ "Use this feature to disable unwanted scripts and styles by setting up the "
246
+ "logic for different types of pages. We recommend working in \"Safe mode\" "
247
+ "because disabling any necessary system script file can corrupt the website. "
248
+ "All changes done in Safe mode are available for administrator only. This way "
249
+ "only you, as the administrator, can see the result of optimization. To "
250
+ "enable the changes for other users, uncheck Safe mode."
251
+ msgstr ""
252
+ "Используйте этот инструмент для отключения неиспользуемых скриптов и стилей, "
253
+ "устанавливая логику для разных типов страниц. Мы рекомендуем вам работать в "
254
+ "“Безопасном режиме”, так как вы можете нарушить работу сайта, если отключите "
255
+ "системные файлы скриптов, без которых невозможна полноценная работа сайта. В "
256
+ "безопасном режиме, все ваши изменения будут работать только для "
257
+ "администратора, это необходимо для того, чтобы только вы могли увидеть "
258
+ "результат оптимизации. Чтобы изменения вступили в силу для всех остальных "
259
+ "пользователей, просто снимите галочку “Безопасный режим”. "
260
+
261
+ #: assets-manager/includes/class.configurate-assets.php:256
262
+ #, php-format
263
+ msgid ""
264
+ "For more details and user guides, check the plugin’s <a href=\"%s\" target="
265
+ "\"_blank\" rel=\"noreferrer noopener\">documentation</a>."
266
+ msgstr ""
267
+ "Более подробную информацию о работе с плагином можно найти в нашей <a href="
268
+ "\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">документации</a>."
269
+
270
+ #: assets-manager/includes/class.configurate-assets.php:259
271
+ msgid "Upgrade to Premium"
272
+ msgstr "Обновить до премиум"
273
+
274
+ #: assets-manager/includes/class.configurate-assets.php:262
275
+ msgid "MORE IN CLEARFY BUSINESS"
276
+ msgstr "БОЛЬШЕ В CLEARFY БИЗНЕС"
277
+
278
+ #: assets-manager/includes/class.configurate-assets.php:263
279
+ msgid "Disable plugins (groups of scripts)"
280
+ msgstr "Отключить плагины (группы скриптов)"
281
+
282
+ #: assets-manager/includes/class.configurate-assets.php:264
283
+ msgid "Conditions by the link template"
284
+ msgstr "Условия по шаблону ссылки"
285
+
286
+ #: assets-manager/includes/class.configurate-assets.php:265
287
+ msgid "Conditions by the regular expression"
288
+ msgstr "Условия по регулярному выражению"
289
+
290
+ #: assets-manager/includes/class.configurate-assets.php:267
291
+ msgid "Statistics and optimization results"
292
+ msgstr "Статистика и результаты оптимизации"
293
+
294
+ #: assets-manager/includes/class.configurate-assets.php:304
295
+ #: assets-manager/includes/class.configurate-assets.php:332
296
+ msgid "Loaded"
297
+ msgstr "Загружен"
298
+
299
+ #: assets-manager/includes/class.configurate-assets.php:305
300
+ msgid "Plugin"
301
+ msgstr "Плагин"
302
+
303
+ #: assets-manager/includes/class.configurate-assets.php:309
304
+ #: assets-manager/includes/class.configurate-assets.php:338
305
+ msgid "Load resource?"
306
+ msgstr "Загружать ресурс?"
307
+
308
+ #: assets-manager/includes/class.configurate-assets.php:310
309
+ #: assets-manager/includes/class.configurate-assets.php:339
310
+ msgid "Conditions"
311
+ msgstr "Условия"
312
+
313
+ #: assets-manager/includes/class.configurate-assets.php:318
314
+ msgid "Author"
315
+ msgstr "Автор"
316
+
317
+ #: assets-manager/includes/class.configurate-assets.php:319
318
+ #: assets-manager/includes/class.configurate-assets.php:398
319
+ msgid "Version"
320
+ msgstr "Версия"
321
+
322
+ #: assets-manager/includes/class.configurate-assets.php:333
323
+ msgid "Size"
324
+ msgstr "Размер"
325
+
326
+ #: assets-manager/includes/class.configurate-assets.php:334
327
+ msgid "Resource"
328
+ msgstr "Ресурс"
329
+
330
+ #: assets-manager/includes/class.configurate-assets.php:362
331
+ msgid "In use by"
332
+ msgstr "Используется "
333
+
334
+ #: assets-manager/includes/class.configurate-assets.php:369
335
+ msgid "Requires"
336
+ msgstr "Зависимости"
337
+
338
+ #: assets-manager/includes/class.configurate-assets.php:398
339
+ msgid "--"
340
+ msgstr ""
341
+
342
+ #: assets-manager/includes/class.configurate-assets.php:561
343
+ #: assets-manager/includes/class.configurate-assets.php:1406
344
+ msgid "No"
345
+ msgstr "Нет"
346
+
347
+ #: assets-manager/includes/class.configurate-assets.php:561
348
+ #: assets-manager/includes/class.configurate-assets.php:1406
349
+ msgid "Yes"
350
+ msgstr "Да"
351
+
352
+ #: assets-manager/includes/class.configurate-assets.php:577
353
+ msgid ""
354
+ "Click the switch in the <b>Load resource?</b> column to display the "
355
+ "conditions for loading the resource."
356
+ msgstr ""
357
+ "Щелкните переключатель в этой колонке <b>Загрузить ресурс?</b>, чтобы "
358
+ "отобразить условия для загрузки ресурса."
359
+
360
+ #: assets-manager/includes/class.configurate-assets.php:579
361
+ msgid ""
362
+ "Set the plugin logic to apply it to all plugin’s resources. This feature "
363
+ "available at the paid version."
364
+ msgstr ""
365
+ "Устанавливая логику для плагина, она будет примена для всех его ресурсов. "
366
+ "Данная возможность доступна только в платной версии плагина."
367
+
368
+ #: assets-manager/includes/class.configurate-assets.php:588
369
+ #: assets-manager/includes/class.configurate-assets.php:612
370
+ msgid "Current URL"
371
+ msgstr "Текущий URL"
372
+
373
+ #: assets-manager/includes/class.configurate-assets.php:589
374
+ msgid "Everywhere"
375
+ msgstr "Повсюду"
376
+
377
+ #: assets-manager/includes/class.configurate-assets.php:590
378
+ msgid "Custom URL (PRO)"
379
+ msgstr "Произвольная ссылка (PRO)"
380
+
381
+ #: assets-manager/includes/class.configurate-assets.php:591
382
+ msgid "Regular expression (PRO)"
383
+ msgstr "Регулярное выражение (PRO)"
384
+
385
+ #: assets-manager/includes/class.configurate-assets.php:601
386
+ msgid "Exclude"
387
+ msgstr "Исключить"
388
+
389
+ #: assets-manager/includes/class.configurate-assets.php:601
390
+ msgid ""
391
+ "You can disable this resource for all pages, except sections and page types "
392
+ "listed below. Specify sections and page types with the enabled resource."
393
+ msgstr ""
394
+ "Вы можете отключить этот ресурс на всех страницах вашего сайта, кроме "
395
+ "нижеперечисленных разделов и типов страниц. Отметьте разделы и типы страниц, "
396
+ "в которых вы не хотите отключать ресурс"
397
+
398
+ #: assets-manager/includes/class.configurate-assets.php:685
399
+ msgid ""
400
+ "You can disable the resource only for the pages with the matched to the "
401
+ "template address. For example, if you set the template for the link as "
402
+ "http://yoursite.test/profile/*, then the resource is disabled for the "
403
+ "following pages: http://yoursite.test/profile/12, http://yoursite.test/"
404
+ "profile/43, http://yoursite.test/profile/999. If you don’t use the asterisk "
405
+ "symbol in the template then the plugin will disable the resource only for "
406
+ "the pages with 100% match in the specified link type. This feature is "
407
+ "available at the paid version."
408
+ msgstr ""
409
+ "Вы можете отключить этот ресурс только на тех страницах, адрес которых будет "
410
+ "соответствовать установленному вами шаблону. К примеру, если вы установите "
411
+ "шаблон ссылки http://yoursite.test/profile/*, то ресурс будет отключен на "
412
+ "следующих страницах http://yoursite.test/profile/12, http://yoursite.test/"
413
+ "profile/43, http://yoursite.test/profile/999. Если вы не будете использовать "
414
+ "звездочку в вашем шаблоне, то плагин отключит ресурс, только на странице где "
415
+ "будет точное совпадение с установленной вами ссылкой. Эта функция доступна "
416
+ "только в платной версии плагина."
417
+
418
+ #: assets-manager/includes/class.configurate-assets.php:698
419
+ msgid ""
420
+ "Regular expressions can be used by experts. This tool creates flexible "
421
+ "conditions to disable the resource. For example, if you specify this "
422
+ "expression: ^([A-z0-9]+-)?gifts? then the resource will be disabled at the "
423
+ "following pages http://yoursite.test/get-gift/, http://yoursite.test/gift/, "
424
+ "http://yoursite.test/get-gifts/, http://yoursite.test/gifts/. The plugin "
425
+ "ignores the backslash at the beginning of the query string, so you can "
426
+ "dismiss it. Check your regular expressions in here: https://regex101.com, "
427
+ "this will prevent you from the mistakes. This feature is available at the "
428
+ "paid version."
429
+ msgstr ""
430
+ "Регулярные выражения используются экспертами. С помощью этого инструмента вы "
431
+ "можете создать более гибкие условия для отключения ресурса. К примеру, если "
432
+ "вы установите такое выражение: ^([A-z0-9]+-)?gifts?, то ресурс будет "
433
+ "отключен на страницах http://yoursite.test/get-gift/, http://yoursite.test/"
434
+ "gift/, http://yoursite.test/get-gifts/, http://yoursite.test/gifts/. Плагин "
435
+ "игнорирует обратный слеш в начале строки запроса, поэтому вы можете его "
436
+ "пропустить. Проверяйте свое регулярное выражение с помощью сервиса https://"
437
+ "regex101.com, чтобы вы были точно уверены, что в вашем регулярном выражении "
438
+ "нет ошибки. Эта функция доступна только в платной версии плагина."
439
+
440
+ #: assets-manager/includes/class.configurate-assets.php:718
441
+ msgid "Also disabled for pages"
442
+ msgstr "Также отключен для страниц"
443
+
444
+ #: assets-manager/includes/class.configurate-assets.php:1293
445
+ msgid "Minify and Combine"
446
+ msgstr "Минификация"
447
+
448
+ #: assets-manager/includes/class.configurate-assets.php:1315
449
+ msgid "remove version?"
450
+ msgstr "Удалить версию?"
451
+
452
+ #: assets-manager/includes/class.configurate-assets.php:1315
453
+ msgid "optimize?"
454
+ msgstr "оптимизировать?"
455
+
456
+ #: assets-manager/includes/class.configurate-assets.php:1319
457
+ msgid ""
458
+ "You’ve enabled &#34;Remove query strings&#34; from static resources in the "
459
+ "&#34;Clearfy&#34; plugin. This list of settings helps you to exclude the "
460
+ "necessary scripts and styles with remaining query strings. Press No to add a "
461
+ "file to the excluded list."
462
+ msgstr ""
463
+ "Вы включили опцию &#34;Удалить переменные запроса для статических "
464
+ "ресурсов&#34; в плагине &#34;Clearfy&#34;, в этой колонке настроек вы можете "
465
+ "исключить скрипты и стили, для которых вы хотите оставить переменые запроса. "
466
+ "Просто выберите \"Нет\", чтобы добавить файл в исключения.."
467
+
468
+ #: assets-manager/includes/class.configurate-assets.php:1321
469
+ msgid ""
470
+ "You’ve enabled the &#34;Optimize js scripts?&#34; and &#34;Optimize CSS "
471
+ "options&#34; in the &#34;Minify & Combine plugin&#34;. These settings "
472
+ "exclude scripts and styles that you don’t want to optimize. Press No to add "
473
+ "a file to the excluded list."
474
+ msgstr ""
475
+ "Вы включили опцию &#34;Оптимизировать js скрипты?&#34; и &#34;Оптимизировать "
476
+ "css&#34; в плагине &#34;Сжатие и Объединения&#34;. С помощью этой колонки "
477
+ "настроек, вы можете исключить скрипты и стили, которые вы не хотите "
478
+ "оптимизировать. Чтобы добавить файл в исключения просто нажмите кнопку \"Нет"
479
+ "\"."
480
+
481
+ #: assets-manager/includes/class.configurate-assets.php:1323
482
+ msgid ""
483
+ "You’ve enabled the &#34;Optimize js scripts?&#34; and &#34;Optimize CSS "
484
+ "options&#34; in the &#34;Autoptimize&#34;. These settings exclude scripts "
485
+ "and styles that you don’t want to optimize. Press No to add a file to the "
486
+ "excluded list."
487
+ msgstr ""
488
+ "Вы включили опцию &#34;Оптимизировать js скрипты?&#34; и &#34;Оптимизировать "
489
+ "css&#34; в плагине &#34;Autoptimize&#34;. С помощью этой колонки настроек, "
490
+ "вы можете исключить скрипты и стили, которые вы не хотите оптимизировать. "
491
+ "Чтобы добавить файл в исключения просто нажмите кнопку \"Нет\"."
492
+
493
+ #~ msgid ""
494
+ #~ "We found that you use the plugin \"Clearfy - disable unused functions\", "
495
+ #~ "this plugin already has the same functions as \"Assets manager\", so you "
496
+ #~ "can disable the \"Assets manager\" plugin!"
497
+ #~ msgstr ""
498
+ #~ "Мы обнаружили, что вы используете плагин \"Clearfy - disable unused "
499
+ #~ "features\", этот плагин включает функционал \"WP Asset CleanUp\", вы "
500
+ #~ "можете деактивировать плагин \"Менеджер скриптов\"!"
501
+
502
+ #~ msgid ""
503
+ #~ "Below you can disable/enable CSS and JS files on a per page/post basis, "
504
+ #~ "as well as by custom post types. We recommend testing this locally or on "
505
+ #~ "a staging site first, as you could break the appearance of your live "
506
+ #~ "site. If you aren't sure about a certain script, you can try clicking on "
507
+ #~ "it, as a lot of authors will mention their plugin or theme in the header "
508
+ #~ "of the source code."
509
+ #~ msgstr ""
510
+ #~ "Ниже вы можете включить/отключить использование CSS и JS файлов в "
511
+ #~ "записях, произвольных типах записей или страницах. Мы рекомендуем вам "
512
+ #~ "эксперементировать со скриптами на локальном хостинге или тестом сайте, "
513
+ #~ "так как вы можете нарушить работу сайта, если отключите системные файлы "
514
+ #~ "скриптов, без которых невозможна полноценная работа сайта. Если вы не "
515
+ #~ "уверены, для чего используется тот или иной файл, попробуйте нажать на "
516
+ #~ "ссылку под его заголовком, в открывшемся файле вы можете увидеть "
517
+ #~ "комментарий разработчика с ссылкой на описание плагина. Получив "
518
+ #~ "достаточную информацию о функциях плагина, вы сможете более уверенно "
519
+ #~ "включать или отключать его стили и скрипты."
520
+
521
+ #~ msgid ""
522
+ #~ "If for some reason you run into trouble, you can always enable everything "
523
+ #~ "again to reset the settings."
524
+ #~ msgstr ""
525
+ #~ "Если по какой-то причине вы столкнулись с проблемами, вы всегда можете "
526
+ #~ "включить все опции, чтобы сбросить настройки."
527
+
528
+ #~ msgid "Save settings"
529
+ #~ msgstr "Сохранить"
530
+
531
+ #~ msgid "Hide panel in adminbar?"
532
+ #~ msgstr "Скрыть панель из админбара?"
533
+
534
+ #~ msgid "State"
535
+ #~ msgstr "Состояние"
536
+
537
+ #~ msgid "Script"
538
+ #~ msgstr "Скрипт"
539
+
540
+ #~ msgid "In use"
541
+ #~ msgstr "Используется"
542
+
543
+ #~ msgid "Disable"
544
+ #~ msgstr "Отключить"
545
+
546
+ #~ msgid "Enable"
547
+ #~ msgstr "Включить"
548
+
549
+ #~ msgid "Enabled"
550
+ #~ msgstr "Включить"
551
+
552
+ #~ msgid "Disable everwhere to view enable settings."
553
+ #~ msgstr ""
554
+ #~ "Нужно включить опцию \"повсюду\", чтобы увидеть дополнительные настройки."
555
+
556
+ #~ msgid ""
557
+ #~ "We found that you use the plugin \"Clearfy - disable unused functions\", "
558
+ #~ "this plugin already has the same functions as \"WP Asset CleanUp\", so "
559
+ #~ "you can disable the \"WP Asset CleanUp\" plugin!"
560
+ #~ msgstr ""
561
+ #~ "Мы обнаружили, что вы используете плагин \"Clearfy - disable unused "
562
+ #~ "features\", этот плагин включает функционал \"WP Asset CleanUp\", вы "
563
+ #~ "можете деактивировать плагин \"WP Asset CleanUp\"!"
564
+
565
+ #~ msgid "Webcraftic Assets manager"
566
+ #~ msgstr "Webcraftic менеджер скриптов"
567
+
568
+ #~ msgid ""
569
+ #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
570
+ #~ "installed, this plugin already has disable comments functions, so you can "
571
+ #~ "deactivate plugin \"WP Asset CleanUp\"!"
572
+ #~ msgstr ""
573
+ #~ "Мы обнаружили, что вы используете плагин \"Clearfy - disable unused "
574
+ #~ "features\", этот плагин"
components/comments-plus/comments-plus.php CHANGED
@@ -1,73 +1,80 @@
1
  <?php
2
- /**
3
- * Plugin Name: Webcraftic Disable Comments
4
- * Plugin URI: https://wordpress.org/plugins/comments-plus/
5
- * Description: Allows administrators to globally disable comments on their site. Comments can be disabled for individual record types.
6
- * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
- * Version: 1.0.9
8
- * Text Domain: comments-plus
9
- * Domain Path: /languages/
10
- * Author URI: https://clearfy.pro
11
- * Framework Version: FACTORY_409_VERSION
12
- */
13
 
14
- // Exit if accessed directly
15
- if( !defined('ABSPATH') ) {
16
- exit;
17
- }
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
- define('WCM_PLUGIN_VERSION', '1.0.9');
20
 
21
- define('WCM_PLUGIN_DIR', dirname(__FILE__));
22
- define('WCM_PLUGIN_BASE', plugin_basename(__FILE__));
23
- define('WCM_PLUGIN_URL', plugins_url(null, __FILE__));
24
 
25
-
 
 
 
26
 
27
- if( !defined('LOADING_COMMENTS_PLUS_AS_ADDON') ) {
28
- require_once(WCM_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php');
29
- require_once(WCM_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php');
30
- }
 
 
 
 
31
 
32
- $plugin_info = array(
33
- 'prefix' => 'wbcr_comments_plus_', // wbcr_cmp
34
- 'plugin_name' => 'wbcr_comments_plus',
35
- 'plugin_title' => __('Webcraftic Disable comments', 'comments-plus'),
36
- 'plugin_version' => WCM_PLUGIN_VERSION,
37
- 'plugin_build' => 'free',
38
- //'updates' => WCM_PLUGIN_DIR . '/updates/'
39
- );
 
 
 
 
 
 
40
 
41
- /**
42
- * Проверяет совместимость с Wordpress, php и другими плагинами.
43
- */
44
- $compatibility = new Wbcr_FactoryClearfy_Compatibility(array_merge($plugin_info, array(
45
- 'plugin_already_activate' => defined('WCM_PLUGIN_ACTIVE'),
46
- 'plugin_as_component' => defined('LOADING_COMMENTS_PLUS_AS_ADDON'),
47
- 'plugin_dir' => WCM_PLUGIN_DIR,
48
- 'plugin_base' => WCM_PLUGIN_BASE,
49
- 'plugin_url' => WCM_PLUGIN_URL,
50
- 'required_php_version' => '5.3',
51
- 'required_wp_version' => '4.2.0',
52
- 'required_clearfy_check_component' => true
53
- )));
54
 
55
- /**
56
- * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
57
- * а пользователь получит предупреждение.
58
- */
59
- if( !$compatibility->check() ) {
60
- return;
61
- }
62
 
63
- define('WCM_PLUGIN_ACTIVE', true);
 
 
64
 
65
- if( !defined('LOADING_COMMENTS_PLUS_AS_ADDON') ) {
66
- require_once(WCM_PLUGIN_DIR . '/libs/factory/core/boot.php');
67
- }
68
 
69
- require_once(WCM_PLUGIN_DIR . '/includes/class.plugin.php');
70
-
71
- if( !defined('LOADING_COMMENTS_PLUS_AS_ADDON') ) {
72
- new WCM_Plugin(__FILE__, $plugin_info);
73
- }
1
  <?php
2
+ /**
3
+ * Plugin Name: Webcraftic Disable Comments
4
+ * Plugin URI: https://wordpress.org/plugins/comments-plus/
5
+ * Description: Allows administrators to globally disable comments on their site. Comments can be disabled for individual record types.
6
+ * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
+ * Version: 1.0.9
8
+ * Text Domain: comments-plus
9
+ * Domain Path: /languages/
10
+ * Author URI: https://clearfy.pro
11
+ * Framework Version: FACTORY_409_VERSION
12
+ */
13
 
14
+ // Exit if accessed directly
15
+ if ( ! defined( 'ABSPATH' ) ) {
16
+ exit;
17
+ }
18
+ if ( ! defined( 'WCM_PLUGIN_VERSION' ) ) {
19
+ define( 'WCM_PLUGIN_VERSION', '1.0.9' );
20
+ }
21
+ if ( ! defined( 'WCM_PLUGIN_DIR' ) ) {
22
+ define( 'WCM_PLUGIN_DIR', dirname( __FILE__ ) );
23
+ }
24
+ if ( ! defined( 'WCM_PLUGIN_BASE' ) ) {
25
+ define( 'WCM_PLUGIN_BASE', plugin_basename( __FILE__ ) );
26
+ }
27
+ if ( ! defined( 'WCM_PLUGIN_URL' ) ) {
28
+ define( 'WCM_PLUGIN_URL', plugins_url( null, __FILE__ ) );
29
+ }
30
 
 
31
 
 
 
 
32
 
33
+ if ( ! defined( 'LOADING_COMMENTS_PLUS_AS_ADDON' ) ) {
34
+ require_once( WCM_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php' );
35
+ require_once( WCM_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php' );
36
+ }
37
 
38
+ $plugin_info = array(
39
+ 'prefix' => 'wbcr_comments_plus_', // wbcr_cmp
40
+ 'plugin_name' => 'wbcr_comments_plus',
41
+ 'plugin_title' => __( 'Webcraftic Disable comments', 'comments-plus' ),
42
+ 'plugin_version' => WCM_PLUGIN_VERSION,
43
+ 'plugin_build' => 'free',
44
+ //'updates' => WCM_PLUGIN_DIR . '/updates/'
45
+ );
46
 
47
+ /**
48
+ * Проверяет совместимость с Wordpress, php и другими плагинами.
49
+ */
50
+ $compatibility = new Wbcr_FactoryClearfy_Compatibility( array_merge( $plugin_info, array(
51
+ 'factory_version' => 'FACTORY_409_VERSION',
52
+ 'plugin_already_activate' => defined( 'WCM_PLUGIN_ACTIVE' ),
53
+ 'plugin_as_component' => defined( 'LOADING_COMMENTS_PLUS_AS_ADDON' ),
54
+ 'plugin_dir' => WCM_PLUGIN_DIR,
55
+ 'plugin_base' => WCM_PLUGIN_BASE,
56
+ 'plugin_url' => WCM_PLUGIN_URL,
57
+ 'required_php_version' => '5.3',
58
+ 'required_wp_version' => '4.2.0',
59
+ 'required_clearfy_check_component' => true
60
+ ) ) );
61
 
62
+ /**
63
+ * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
64
+ * а пользователь получит предупреждение.
65
+ */
66
+ if ( ! $compatibility->check() ) {
67
+ return;
68
+ }
 
 
 
 
 
 
69
 
70
+ define( 'WCM_PLUGIN_ACTIVE', true );
 
 
 
 
 
 
71
 
72
+ if ( ! defined( 'LOADING_COMMENTS_PLUS_AS_ADDON' ) ) {
73
+ require_once( WCM_PLUGIN_DIR . '/libs/factory/core/boot.php' );
74
+ }
75
 
76
+ require_once( WCM_PLUGIN_DIR . '/includes/class.plugin.php' );
 
 
77
 
78
+ if ( ! defined( 'LOADING_COMMENTS_PLUS_AS_ADDON' ) ) {
79
+ new WCM_Plugin( __FILE__, $plugin_info );
80
+ }
 
 
components/comments-plus/languages/comments-plus-es_ES.mo ADDED
Binary file
components/comments-plus/languages/comments-plus-es_ES.po ADDED
@@ -0,0 +1,369 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of Plugins - Clearfy in Spanish (Spain)
2
+ # This file is distributed under the same license as the Plugins - Clearfy – WordPress optimization plugin and disable ultimate tweaker - Development (trunk) package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: \n"
6
+ "POT-Creation-Date: 2019-04-28 06:24+0300\n"
7
+ "PO-Revision-Date: 2019-04-28 06:24+0300\n"
8
+ "Last-Translator: \n"
9
+ "Language-Team: \n"
10
+ "Language: es\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
15
+ "X-Generator: Poedit 2.1.1\n"
16
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
17
+ "X-Generator: Poedit 2.1.1\n"
18
+ "X-Poedit-Basepath: ..\n"
19
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
20
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
21
+ "X-Poedit-SourceCharset: UTF-8\n"
22
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
23
+ "X-Poedit-SearchPath-0: .\n"
24
+ "X-Poedit-SearchPathExcluded-0: libs\n"
25
+ "X-Poedit-SearchPathExcluded-1: components\n"
26
+ "X-Poedit-SearchPathExcluded-2: cache\n"
27
+
28
+ #: admin/boot.php:72
29
+ msgid "Disable comments on the entire site"
30
+ msgstr "Deshabilitar comentarios en todo el sitio"
31
+
32
+ #: admin/boot.php:78 admin/pages/comments.php:127
33
+ msgid "Select post types"
34
+ msgstr "Seleccionar tipos publicaciones"
35
+
36
+ #: admin/boot.php:83 admin/pages/comments.php:138
37
+ msgid "Custom post types"
38
+ msgstr "Custom post types"
39
+
40
+ #: admin/boot.php:88 admin/pages/comments.php:149
41
+ msgid "Use persistent mode"
42
+ msgstr "Usa el modo persistente"
43
+
44
+ #: admin/boot.php:93 admin/pages/comments.php:176
45
+ msgid "Replace external links in comments on the JavaScript code"
46
+ msgstr "Reemplazar enlaces externos decomentarios en el código JavaScript"
47
+
48
+ #: admin/boot.php:98 admin/pages/comments.php:185
49
+ msgid "Replace external links from comment authors on the JavaScript code"
50
+ msgstr ""
51
+ "Reemplace los enlaces externos de los autores en comentarios del código "
52
+ "JavaScript"
53
+
54
+ #: admin/boot.php:103 admin/pages/comments.php:167
55
+ msgid "Remove field \"site\" in comment form"
56
+ msgstr "Eliminar campo \"sitio \" en formulario de comentario"
57
+
58
+ #: admin/boot.php:115
59
+ msgid "One click disable all comments"
60
+ msgstr "Un clic deshabilita todos los comentarios"
61
+
62
+ #: admin/boot.php:136
63
+ msgid "Get ultimate plugin free"
64
+ msgstr "Obtener el ultimate plugin gratis"
65
+
66
+ #: admin/pages/comments.php:37 admin/pages/comments.php:91
67
+ msgid "Disable comments"
68
+ msgstr "Desactivar Comentarios"
69
+
70
+ #: admin/pages/comments.php:38
71
+ msgid "Manage site comments"
72
+ msgstr "Administrar los comentarios del sitio"
73
+
74
+ #: admin/pages/comments.php:51
75
+ msgid "Comments"
76
+ msgstr "Comentarios"
77
+
78
+ #: admin/pages/comments.php:51
79
+ msgid "General"
80
+ msgstr "General"
81
+
82
+ #: admin/pages/comments.php:66
83
+ msgid "Global disabling of comments"
84
+ msgstr "Deshabilitación global de comentarios."
85
+
86
+ #: admin/pages/comments.php:66
87
+ msgid ""
88
+ "What is the difference between these and native WordPress functions? "
89
+ "WordPress disables comments only for new posts! Using the functions below, "
90
+ "you can disable comments globally, even for old posts, and you can choose "
91
+ "which post types comments to disable. The plugin also disables the comment "
92
+ "functionality itself, which creates a certain load on the site."
93
+ msgstr ""
94
+ "¿Cuál es la diferencia entre estas y las funciones nativas de WordPress? "
95
+ "¡WordPress deshabilita comentarios solo para nuevas publicaciones! Al usar "
96
+ "las funciones a continuación, puede deshabilitar los comentarios "
97
+ "globalmente, incluso para las publicaciones anteriores, y puede elegir qué "
98
+ "tipo de comentarios deshabilitar. El plugin también desactiva la "
99
+ "funcionalidad de comentarios, lo que crea una cierta carga en el sitio."
100
+
101
+ #: admin/pages/comments.php:93
102
+ msgid "Not disable"
103
+ msgstr "No deshabilitar"
104
+
105
+ #: admin/pages/comments.php:96
106
+ msgid "Everywhere"
107
+ msgstr "Donde sea"
108
+
109
+ #: admin/pages/comments.php:97
110
+ #, php-format
111
+ msgid ""
112
+ "You can delete all comments in the database by clicking on this link (<a "
113
+ "href=\"%s\">cleaning comments in database</a>)."
114
+ msgstr ""
115
+ "Puede eliminar los comentarios en la base de datos haciendo clic en este "
116
+ "enlace (<a href=\"%s\">limpiando comentarios en la base de datos</a>)."
117
+
118
+ #: admin/pages/comments.php:101
119
+ msgid "On certain post types"
120
+ msgstr "Para ciertos tipos de correos"
121
+
122
+ #: admin/pages/comments.php:102
123
+ #, php-format
124
+ msgid ""
125
+ "You can delete all comments for the selected post types. Select the post "
126
+ "types below and save the settings. After that, click the link (<a href=\"%s"
127
+ "\">delete all comments for the selected post types in database</a>)."
128
+ msgstr ""
129
+ "Puede eliminar los comentarios para los tipos de publicación seleccionados. "
130
+ "Seleccione los tipos de publicación y guarde la configuración. Después, haga "
131
+ "clic en el enlace (<a href=\"%s\">eliminar todos los comentarios de los "
132
+ "tipos de publicaciones seleccionados en la base de datos</a>)."
133
+
134
+ #: admin/pages/comments.php:106
135
+ msgid ""
136
+ "Everywhere - Warning: This option is global and will affect your entire "
137
+ "site. Use it only if you want to disable comments everywhere. A complete "
138
+ "description of what this option does is available here"
139
+ msgstr ""
140
+ "Donde sea - Advertencia: Esta opción es global y afectará a todo su sitio. "
141
+ "Úselo solo si desea deshabilitar comentarios en todas partes. Una "
142
+ "descripción completa de lo que hace esta opción está disponible aquí."
143
+
144
+ #: admin/pages/comments.php:106
145
+ msgid ""
146
+ "On certain post types - Disabling comments will also disable trackbacks and "
147
+ "pingbacks. All comment-related fields will also be hidden from the edit/"
148
+ "quick-edit screens of the affected posts. These settings cannot be "
149
+ "overridden for individual posts."
150
+ msgstr ""
151
+ "Para ciertas publicaciones, al deshabilitar los comentarios, se deshabilita "
152
+ "los trackbacks y los pingbacks. Los campos relacionados con comentarios se "
153
+ "ocultarán de las pantallas de edición/edición-rápida de las publicaciones "
154
+ "afectadas. Estas configuraciones no se pueden anular para publicaciones "
155
+ "individuales."
156
+
157
+ #: admin/pages/comments.php:130
158
+ msgid "Select the post types for which comments will be disabled"
159
+ msgstr ""
160
+ "Seleccione los tipos de publicación para los cuales se deshabilitarán los "
161
+ "comentarios."
162
+
163
+ #: admin/pages/comments.php:141
164
+ msgid ""
165
+ "Only the built-in post types appear above. If you want to disable comments "
166
+ "on other custom post types on the entire network, you can supply a comma-"
167
+ "separated list of post types below (use the slug that identifies the post "
168
+ "type)."
169
+ msgstr ""
170
+ "Solo los tipos de post types incorporados aparecen arriba. Si desea "
171
+ "deshabilitar los comentarios sobre otros tipos de post types personalizadas "
172
+ "en toda la red, puede proporcionar una lista separada por comas de los tipos "
173
+ "de post types a continuación (use la barra que identifica el tipo de "
174
+ "publicación)."
175
+
176
+ #: admin/pages/comments.php:151
177
+ msgid ""
178
+ "This will make persistent changes to your database &mdash; comments will "
179
+ "remain closed even if you later disable the plugin! You should not use it if "
180
+ "you only want to disable comments temporarily."
181
+ msgstr ""
182
+ "Esto hará cambios persistentes en su base de datos &mdash; Los comentarios "
183
+ "permanecerán cerrados incluso si luego deshabilitas el plugin. No lo use si "
184
+ "solo desea deshabilitar los comentarios temporalmente."
185
+
186
+ #: admin/pages/comments.php:161
187
+ msgid "General settings for comments"
188
+ msgstr "Configuraciones generales para comentarios"
189
+
190
+ #: admin/pages/comments.php:161
191
+ msgid "These settings will help you improve SEO and reduce the amount of spam."
192
+ msgstr ""
193
+ "Estas configuraciones te ayudarán a mejorar el SEO y reducir la cantidad de "
194
+ "spam."
195
+
196
+ #: admin/pages/comments.php:169
197
+ msgid ""
198
+ "Tired of spam in the comments? Do visitors leave \"blank\" comments for the "
199
+ "sake of a link to their site?"
200
+ msgstr ""
201
+ "¿Cansado de spam en los comentarios? ¿Los visitantes dejan \"en blanco\" "
202
+ "los comentarios por un enlace a su sitio?"
203
+
204
+ #: admin/pages/comments.php:169
205
+ msgid "Removes the \"Site\" field from the comment form."
206
+ msgstr "Elimina el campo \"Sitio \" del formulario de comentarios."
207
+
208
+ #: admin/pages/comments.php:169
209
+ msgid ""
210
+ "Works with the standard comment form, if the form is manually written in "
211
+ "your theme-it probably will not work!"
212
+ msgstr ""
213
+ "Funciona con el formulario de comentarios estándar, si el formulario está "
214
+ "escrito manualmente en su tema, ¡probablemente no funcionará!"
215
+
216
+ #: admin/pages/comments.php:178
217
+ msgid ""
218
+ "Superfluous external links from comments, which can be typed from a dozen "
219
+ "and more for one article, do not bring anything good for promotion."
220
+ msgstr ""
221
+ "Los enlaces externos superfluos en los comentarios y en cantidades mayores "
222
+ "de 12 no aportan nada bueno para el SEO o algunas promociones."
223
+
224
+ #: admin/pages/comments.php:178
225
+ #, php-format
226
+ msgid "Replaces the links of this kind of %s, on links of this kind %s"
227
+ msgstr "Reemplaza los enlaces del tipo %s, en enlaces de este tipo %s"
228
+
229
+ #: admin/pages/comments.php:187
230
+ msgid ""
231
+ "Up to 90 percent of comments in the blog can be left for the sake of an "
232
+ "external link. Even nofollow from page weight loss here does not help."
233
+ msgstr ""
234
+ "Hasta un 90 por ciento de los comentarios del Blog pueden ser usados para "
235
+ "enlaces externos, incluso, usar la etiqueta \"nofollow\" no ayudará. "
236
+
237
+ #: admin/pages/comments.php:187
238
+ msgid ""
239
+ "Replaces the links of the authors of comments on the JavaScript code, it is "
240
+ "impossible to distinguish it from usual links."
241
+ msgstr ""
242
+ "Reemplaza los enlaces de los autores de los comentarios sobre el código "
243
+ "JavaScript, es imposible distinguirlo de los enlaces habituales."
244
+
245
+ #: admin/pages/comments.php:187
246
+ msgid "In some Wordpress topics this may not work."
247
+ msgstr "En algunos tópicos de Wordpress, ésto podría no trabajar"
248
+
249
+ #: admin/pages/delete-comments.php:41
250
+ msgid "Comments cleaner"
251
+ msgstr "Limpieza de comentarios"
252
+
253
+ #: admin/pages/delete-comments.php:62
254
+ msgid "All comments have been deleted."
255
+ msgstr "Todos los comentarios han sido eliminados."
256
+
257
+ #: admin/pages/delete-comments.php:71
258
+ msgid ""
259
+ "An error occurred while trying to delete comments. Internal error occured. "
260
+ "Please try again later."
261
+ msgstr ""
262
+ "Se ha producido un error al intentar eliminar comentarios. Se produjo un "
263
+ "error interno. Por favor, inténtelo de nuevo más tarde."
264
+
265
+ #: admin/pages/delete-comments.php:211
266
+ msgid ""
267
+ "Are you sure you want to delete comments from the database without restoring?"
268
+ msgstr ""
269
+ "¿Está seguro de que desea eliminar los comentarios de la base de datos sin "
270
+ "restaurar?"
271
+
272
+ #: admin/pages/delete-comments.php:226
273
+ msgid "Delete "
274
+ msgstr "Borrar"
275
+
276
+ #: admin/pages/delete-comments.php:232
277
+ msgid "Comments clearing tools"
278
+ msgstr "Herramientas de limpieza de comentarios"
279
+
280
+ #: admin/pages/delete-comments.php:235
281
+ msgid ""
282
+ "These functions can be useful for global disabling comments or bulk cleaning "
283
+ "spam comments."
284
+ msgstr ""
285
+ "Estas funciones pueden ser útiles para deshabilitar los comentarios globales "
286
+ "o limpiar de forma masiva los comentarios de spam."
287
+
288
+ #: admin/pages/delete-comments.php:240
289
+ msgid "Remove all comments"
290
+ msgstr "Eliminar todos los comentarios"
291
+
292
+ #: admin/pages/delete-comments.php:242
293
+ msgid "You can delete all comments in your database with one click."
294
+ msgstr "Borrar todos los comentarios en la basa de datos con un click"
295
+
296
+ #: admin/pages/delete-comments.php:244
297
+ msgid "Choose post types"
298
+ msgstr "Elegir tipos de publicaciones"
299
+
300
+ #: admin/pages/delete-comments.php:249
301
+ msgid "Select all"
302
+ msgstr "Seleccionar todo"
303
+
304
+ #: admin/pages/delete-comments.php:266
305
+ #, php-format
306
+ msgid "Delete Woocommerce order notices? (%d)"
307
+ msgstr "¿Desea eliminar los avisos de pedidos de Woocommerce? (%d)"
308
+
309
+ #: admin/pages/delete-comments.php:272
310
+ #, php-format
311
+ msgid "Delete (%s)"
312
+ msgstr "Borrar (%s)"
313
+
314
+ #: admin/pages/delete-comments.php:279
315
+ msgid "Remove spam comments"
316
+ msgstr "Eliminar comentarios spam"
317
+
318
+ #: admin/pages/delete-comments.php:281
319
+ msgid "You can remove only spam comments from the database with one click."
320
+ msgstr ""
321
+ "Puede eliminar solo los comentarios spam de la base de datos con un solo "
322
+ "clic."
323
+
324
+ #: admin/pages/delete-comments.php:283 admin/pages/delete-comments.php:290
325
+ #: admin/pages/delete-comments.php:297
326
+ #, php-format
327
+ msgid "Delete (%d)"
328
+ msgstr "Borrar (%d)"
329
+
330
+ #: admin/pages/delete-comments.php:286
331
+ msgid "Remove unapproved comments"
332
+ msgstr "Eliminar comentarios no aprobados"
333
+
334
+ #: admin/pages/delete-comments.php:288
335
+ msgid ""
336
+ "You can remove only unapproved comments from the database with one click."
337
+ msgstr ""
338
+ "Puede eliminar solo los comentarios no aprobados de la base de datos con un "
339
+ "solo click."
340
+
341
+ #: admin/pages/delete-comments.php:293
342
+ msgid "Remove trashed comments"
343
+ msgstr "Eliminar comentarios en la papelera"
344
+
345
+ #: admin/pages/delete-comments.php:295
346
+ msgid "You can remove only trashed comments from the database with one click."
347
+ msgstr ""
348
+ "Puede borrar solo los comentarios eliminados de la base de datos con un solo "
349
+ "click."
350
+
351
+ #: comments-plus.php:70
352
+ msgid "Webcraftic Disable comments"
353
+ msgstr "Deshabilitar comentarios Webcraftic "
354
+
355
+ #: includes/classes/class.configurate-comments.php:180
356
+ #: includes/classes/class.configurate-comments.php:236
357
+ msgid "Comments are closed."
358
+ msgstr "Cerrados los comentarios"
359
+
360
+ #: includes/classes/class.configurate-comments.php:224
361
+ #, php-format
362
+ msgid ""
363
+ "Note: The <em>%s</em> plugin is currently active, and comments are "
364
+ "completely disabled on: %s. Many of the settings below will not be "
365
+ "applicable for those post types."
366
+ msgstr ""
367
+ "Nota: el plugin <em>%s</em> está activo y los comentarios están "
368
+ "completamente deshabilitados en: %s. Muchas de las configuraciones a "
369
+ "continuación no serán aplicables para esos tipos de publicaciones."
components/comments-plus/languages/comments-plus-ru_RU.po CHANGED
@@ -1,427 +1,427 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: clearfy\n"
4
- "POT-Creation-Date: 2018-10-16 22:46+0300\n"
5
- "PO-Revision-Date: 2018-10-16 23:23+0300\n"
6
- "Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
7
- "Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
8
- "Language: ru_RU\n"
9
- "MIME-Version: 1.0\n"
10
- "Content-Type: text/plain; charset=UTF-8\n"
11
- "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 2.1.1\n"
13
- "X-Poedit-Basepath: ..\n"
14
- "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15
- "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
16
- "X-Poedit-SourceCharset: UTF-8\n"
17
- "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
18
- "X-Poedit-SearchPath-0: .\n"
19
- "X-Poedit-SearchPathExcluded-0: libs\n"
20
-
21
- #: admin/boot.php:18
22
- msgid "Disable comments on the entire site"
23
- msgstr "Отключить комментарии на всем сайте"
24
-
25
- #: admin/boot.php:24 admin/pages/comments.php:127
26
- msgid "Select post types"
27
- msgstr "Выбрать тип записи"
28
-
29
- #: admin/boot.php:29 admin/pages/comments.php:167
30
- msgid "Replace external links in comments on the JavaScript code"
31
- msgstr "Заменить внешние ссылки в комментариях на JavaScript код"
32
-
33
- #: admin/boot.php:34 admin/pages/comments.php:176
34
- msgid "Replace external links from comment authors on the JavaScript code"
35
- msgstr "Заменить внешние ссылки от авторов комментариев на код JavaScript"
36
-
37
- #: admin/boot.php:39
38
- msgid "Disable X-Pingback"
39
- msgstr "Убрать ссылку на X-Pingback и возможность спамить pingback-ами"
40
-
41
- #: admin/boot.php:44 admin/pages/comments.php:158
42
- msgid "Remove field \"site\" in comment form"
43
- msgstr "Удаляет поле \"Сайт\" в форме комментариев"
44
-
45
- #: admin/boot.php:56
46
- msgid "One click disable all comments"
47
- msgstr "Отключить все комментарии в один клик"
48
-
49
- #: admin/boot.php:77
50
- msgid "Get ultimate plugin free"
51
- msgstr "Получите полную версию плагина бесплатно"
52
-
53
- #: admin/pages/comments.php:38 admin/pages/comments.php:92
54
- msgid "Disable comments"
55
- msgstr "Отключить комментарии"
56
-
57
- #: admin/pages/comments.php:39
58
- msgid "Manage site comments"
59
- msgstr "Упр. комментариями"
60
-
61
- #: admin/pages/comments.php:52
62
- msgid "Comments"
63
- msgstr "Комментарии"
64
-
65
- #: admin/pages/comments.php:52
66
- msgid "General"
67
- msgstr "Основные"
68
-
69
- #: admin/pages/comments.php:67
70
- msgid "Global disabling of comments"
71
- msgstr "Глобальное отключение комментариев"
72
-
73
- #: admin/pages/comments.php:67
74
- msgid ""
75
- "What is the difference between these and native WordPress functions? "
76
- "WordPress disables comments only for new posts! Using the functions below, "
77
- "you can disable comments globally, even for old posts, and you can choose "
78
- "which post types comments to disable. The plugin also disables the comment "
79
- "functionality itself, which creates a certain load on the site."
80
- msgstr ""
81
- "Чем отличается эти функции от нативных функций Wordpress? Wordpress "
82
- "отключает комментарии только для новых записей! С помощью функций ниже, вы "
83
- "можете отключить комментарии глобально, даже для старых записей, причем вы "
84
- "можете выбрать для каких типов записей нужно отключить комментарии. Плагин "
85
- "также отключает сам функционал комментариев, который создает определенную "
86
- "нагрузку на сайт."
87
-
88
- #: admin/pages/comments.php:94
89
- msgid "Not disable"
90
- msgstr "Не отключать"
91
-
92
- #: admin/pages/comments.php:97
93
- msgid "Everywhere"
94
- msgstr "Повсюду"
95
-
96
- #: admin/pages/comments.php:98
97
- #, php-format
98
- msgid ""
99
- "You can delete all comments in the database by clicking on this link (<a "
100
- "href=\"%s\">cleaning comments in database</a>)."
101
- msgstr ""
102
- "Вы можете удалить все комментарии в базе данных, нажав на эту ссылку ( <a "
103
- "href=\"%s\">очистка комментариев в базе данных</a> )."
104
-
105
- #: admin/pages/comments.php:102
106
- msgid "On certain post types"
107
- msgstr "Только выбранные типы записей"
108
-
109
- #: admin/pages/comments.php:103
110
- #, php-format
111
- msgid ""
112
- "You can delete all comments for the selected post types. Select the post "
113
- "types below and save the settings. After that, click the link (<a href=\"%s"
114
- "\">delete all comments for the selected post types in database</a>)."
115
- msgstr ""
116
- "Вы можете удалить все комментарии для выбранных типов записей. Выберите типы "
117
- "записей ниже и сохраните настройки. После этого нажмите ссылку ( <a href=\"%s"
118
- "\">удалите все комментарии для выбранных типов записей в базе данных</a> )."
119
-
120
- #: admin/pages/comments.php:107
121
- msgid ""
122
- "Everywhere - Warning: This option is global and will affect your entire "
123
- "site. Use it only if you want to disable comments everywhere. A complete "
124
- "description of what this option does is available here"
125
- msgstr ""
126
- "Повсюду - предупреждение: этот параметр является глобальным и повлияет на "
127
- "весь ваш сайт. Используйте его только в том случае, если вы хотите отключить "
128
- "комментарии повсюду. "
129
-
130
- #: admin/pages/comments.php:107
131
- msgid ""
132
- "On certain post types - Disabling comments will also disable trackbacks and "
133
- "pingbacks. All comment-related fields will also be hidden from the edit/"
134
- "quick-edit screens of the affected posts. These settings cannot be "
135
- "overridden for individual posts."
136
- msgstr ""
137
- "В некоторых типах сообщений - отключение комментариев также отключает "
138
- "трекбэки и pingback. Все поля, связанные с комментариями, также будут скрыты "
139
- "от экранов редактирования / быстрого редактирования затронутых сообщений. "
140
- "Эти настройки нельзя переопределять для отдельных сообщений."
141
-
142
- #: admin/pages/comments.php:130
143
- msgid "Select the post types for which comments will be disabled"
144
- msgstr "Выберите типы записей, для которых комментарии будут отключены."
145
-
146
- #: admin/pages/comments.php:138
147
- msgid "Custom post types"
148
- msgstr "Произвольные типы записей"
149
-
150
- #: admin/pages/comments.php:141
151
- msgid ""
152
- "Only the built-in post types appear above. If you want to disable comments "
153
- "on other custom post types on the entire network, you can supply a comma-"
154
- "separated list of post types below (use the slug that identifies the post "
155
- "type)."
156
- msgstr ""
157
- "Только встроенные типы записей отображаются выше. Если вы хотите отключить "
158
- "комментарии к другим пользовательским типам записей во всей сети, вы можете "
159
- "предоставить список типов сообщений, разделенных запятыми (используйте имя, "
160
- "которое идентифицирует тип записей)."
161
-
162
- #: admin/pages/comments.php:152
163
- msgid "General settings for comments"
164
- msgstr "Общие настройки комментариев"
165
-
166
- #: admin/pages/comments.php:152
167
- msgid "These settings will help you improve SEO and reduce the amount of spam."
168
- msgstr "Эти настройки помогут вам улучшить SEO и уменьшить количество спама."
169
-
170
- #: admin/pages/comments.php:160
171
- msgid ""
172
- "Tired of spam in the comments? Do visitors leave \"blank\" comments for the "
173
- "sake of a link to their site?"
174
- msgstr ""
175
- "Надоел спам в комментариях? Посетители оставляют «пустые» комментарии ради "
176
- "ссылки на свой сайт?"
177
-
178
- #: admin/pages/comments.php:160
179
- msgid "Removes the \"Site\" field from the comment form."
180
- msgstr "Убирает поле «Сайт» из формы комментирования."
181
-
182
- #: admin/pages/comments.php:160
183
- msgid ""
184
- "Works with the standard comment form, if the form is manually written in "
185
- "your theme-it probably will not work!"
186
- msgstr ""
187
- "Работает со стандартной формой комментирования, если в Вашей теме форма "
188
- "прописана вручную - скорей всего не сработает!"
189
-
190
- #: admin/pages/comments.php:169
191
- msgid ""
192
- "Superfluous external links from comments, which can be typed from a dozen "
193
- "and more for one article, do not bring anything good for promotion."
194
- msgstr ""
195
- "Внешние ссылки в комментариях, которых может быть десятки или больше на "
196
- "одной странице, могут ухудшить продвижение вашего сайта."
197
-
198
- #: admin/pages/comments.php:169
199
- #, php-format
200
- msgid "Replaces the links of this kind of %s, on links of this kind %s"
201
- msgstr ""
202
- "Заменяет ссылки %s, на span тег и устанавливает переход с помощью JavaScript "
203
- "%s"
204
-
205
- #: admin/pages/comments.php:178
206
- msgid ""
207
- "Up to 90 percent of comments in the blog can be left for the sake of an "
208
- "external link. Even nofollow from page weight loss here does not help."
209
- msgstr ""
210
- "До 90 процентов комментариев в блоге оставляют ради внешней ссылки. Не "
211
- "поможет даже nofollow от потери веса страницы."
212
-
213
- #: admin/pages/comments.php:178
214
- msgid ""
215
- "Replaces the links of the authors of comments on the JavaScript code, it is "
216
- "impossible to distinguish it from usual links."
217
- msgstr ""
218
- "Заменяет ссылки авторов комментариев на JavaScript код, его невозможно "
219
- "отличить от обычной ссылки."
220
-
221
- #: admin/pages/comments.php:178
222
- msgid "In some Wordpress topics this may not work."
223
- msgstr "В некоторых темах Wordpress это может не сработать."
224
-
225
- #: admin/pages/comments.php:185
226
- msgid "Disable XML-RPC"
227
- msgstr "Отключить XML-RPC"
228
-
229
- #: admin/pages/comments.php:187
230
- msgid ""
231
- "A pingback is basically an automated comment that gets created when another "
232
- "blog links to you. A self-pingback is created when you link to an article "
233
- "within your own blog. Pingbacks are essentially nothing more than spam and "
234
- "simply waste resources."
235
- msgstr ""
236
- "Pingback по-существу автоматизированных комментарий, который создается, "
237
- "когда другой блог ссылается на вас. Self-pingback создается, когда вы "
238
- "оставили ссылку на статью в своем блоге. Pingbacks по существу являются не "
239
- "более чем спам и пустая трата ресурсов вашего сайта."
240
-
241
- #: admin/pages/comments.php:187
242
- msgid "Removes the server responses a reference to the xmlrpc file."
243
- msgstr "Удаляет ссылку на xmlrpc-файл и ответ сервера."
244
-
245
- #: admin/pages/delete-comments.php:41
246
- msgid "Comments cleaner"
247
- msgstr "Очистка комментариев"
248
-
249
- #: admin/pages/delete-comments.php:62
250
- msgid "All comments have been deleted."
251
- msgstr "Все комментарии были удалены."
252
-
253
- #: admin/pages/delete-comments.php:71
254
- msgid ""
255
- "An error occurred while trying to delete comments. Internal error occured. "
256
- "Please try again later."
257
- msgstr ""
258
- "При попытке удалить комментарии произошла ошибка. Пожалуйста, повторите "
259
- "попытку позже."
260
-
261
- #: admin/pages/delete-comments.php:211
262
- msgid ""
263
- "Are you sure you want to delete comments from the database without restoring?"
264
- msgstr ""
265
- "Вы уверены, что вы хотите удалить комментарии из базы данных без "
266
- "восстановления?"
267
-
268
- #: admin/pages/delete-comments.php:226
269
- msgid "Delete "
270
- msgstr "Удалить"
271
-
272
- #: admin/pages/delete-comments.php:232
273
- msgid "Comments clearing tools"
274
- msgstr "Комментарии очищающие инструменты"
275
-
276
- #: admin/pages/delete-comments.php:235
277
- msgid ""
278
- "These functions can be useful for global disabling comments or bulk cleaning "
279
- "spam comments."
280
- msgstr ""
281
- "Эти функции могут быть полезны для глобальных отключений комментариев или "
282
- "массовой очистки спама комментариев."
283
-
284
- #: admin/pages/delete-comments.php:240
285
- msgid "Remove all comments"
286
- msgstr "Удалить все комментарии"
287
-
288
- #: admin/pages/delete-comments.php:242
289
- msgid "You can delete all comments in your database with one click."
290
- msgstr "Вы можете удалить все комментарии в базе данных с одним щелчком мыши."
291
-
292
- #: admin/pages/delete-comments.php:244
293
- msgid "Choose post types"
294
- msgstr "Выберите типы записей"
295
-
296
- #: admin/pages/delete-comments.php:249
297
- msgid "Select all"
298
- msgstr "Выбрать все"
299
-
300
- #: admin/pages/delete-comments.php:266
301
- #, php-format
302
- msgid "Delete Woocommerce order notices? (%d)"
303
- msgstr "Удалять заметки от заказов Woocommerce? (%d)"
304
-
305
- #: admin/pages/delete-comments.php:272
306
- #, php-format
307
- msgid "Delete (%s)"
308
- msgstr "Удалить (%s)"
309
-
310
- #: admin/pages/delete-comments.php:279
311
- msgid "Remove spam comments"
312
- msgstr "Удалить спам комментарии"
313
-
314
- #: admin/pages/delete-comments.php:281
315
- msgid "You can remove only spam comments from the database with one click."
316
- msgstr ""
317
- "Вы можете одним нажатием удалить только спам комментарии из базы данных."
318
-
319
- #: admin/pages/delete-comments.php:283 admin/pages/delete-comments.php:290
320
- #: admin/pages/delete-comments.php:297
321
- #, php-format
322
- msgid "Delete (%d)"
323
- msgstr "Удалить (%d)"
324
-
325
- #: admin/pages/delete-comments.php:286
326
- msgid "Remove unapproved comments"
327
- msgstr "Удалить неподтвержденные комментарии"
328
-
329
- #: admin/pages/delete-comments.php:288
330
- msgid ""
331
- "You can remove only unapproved comments from the database with one click."
332
- msgstr ""
333
- "Вы можете одним нажатием удалить только не подтвержденные комментарии из "
334
- "базы данных."
335
-
336
- #: admin/pages/delete-comments.php:293
337
- msgid "Remove trashed comments"
338
- msgstr "Удалить комментарии из корзины"
339
-
340
- #: admin/pages/delete-comments.php:295
341
- msgid "You can remove only trashed comments from the database with one click."
342
- msgstr "Вы можете одним нажатием удалить только комментарии из корзины."
343
-
344
- #: comments-plus.php:63
345
- msgid "Webcraftic Disable comments"
346
- msgstr "Webcraftic отключить комментарии"
347
-
348
- #: includes/classes/class.configurate-comments.php:204
349
- #: includes/classes/class.configurate-comments.php:256
350
- msgid "Comments are closed."
351
- msgstr "Комментарии Закрыты."
352
-
353
- #: includes/classes/class.configurate-comments.php:244
354
- #, php-format
355
- msgid ""
356
- "Note: The <em>%s</em> plugin is currently active, and comments are "
357
- "completely disabled on: %s. Many of the settings below will not be "
358
- "applicable for those post types."
359
- msgstr ""
360
- "Примечание. Плагин <em>%s</em> в настоящий момент активен, и комментарии "
361
- "полностью отключены: %s. Многие из приведенных ниже настроек не будут "
362
- "применяться для этих типов сообщений."
363
-
364
- #~ msgid ""
365
- #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
366
- #~ "installed, this plugin already has disable comments functions, so you can "
367
- #~ "deactivate plugin \"Disable comments\"!"
368
- #~ msgstr ""
369
- #~ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить "
370
- #~ "неиспользуемые функции», этот плагин уже имеет функции отключения "
371
- #~ "комментариев, поэтому вы можете отключить плагин «Отключить комментарии»!"
372
-
373
- #~ msgid "Recommended"
374
- #~ msgstr "Рекомендовано"
375
-
376
- #~ msgid "You are not allowed to view this page."
377
- #~ msgstr "Вам не разрешено просматривать эту страницу."
378
-
379
- #~ msgid "You do not have the selected post types!"
380
- #~ msgstr "Вы не выбрали еще ни одного типа записей!"
381
-
382
- #~ msgid "No comments available for deletion."
383
- #~ msgstr "Нет комментариев для удаления."
384
-
385
- #~ msgid ""
386
- #~ "Are you sure that you desire to delete all comments from the database?"
387
- #~ msgstr "Вы уверены, что хотите удалить все комментарии из базы данных?"
388
-
389
- #~ msgid ""
390
- #~ "Deleting comments will remove existing comment entries in the database "
391
- #~ "and cannot be reverted without a database backup."
392
- #~ msgstr ""
393
- #~ "При удалении комментариев удаляются существующие записи комментариев в "
394
- #~ "базе данных, они не могут быть восстановлены без резервного копирования "
395
- #~ "базы данных."
396
-
397
- #~ msgid "You have %s comments"
398
- #~ msgstr "У вас есть %s комментариев"
399
-
400
- #~ msgid "Yes, I'm sure"
401
- #~ msgstr "Да, я уверен"
402
-
403
- #~ msgid "No, return back"
404
- #~ msgstr "Нет, вернуться"
405
-
406
- #~ msgid ""
407
- #~ "Are you sure that you desire to delete all comments from the database for "
408
- #~ "the selected post types (%s)?"
409
- #~ msgstr ""
410
- #~ "Вы уверены, что хотите удалить все комментарии из базы данных для "
411
- #~ "выбранных типов записей (%s)?"
412
-
413
- #~ msgid "Webcraftic comments tweaks"
414
- #~ msgstr "Webcraftic инструменты комментариев"
415
-
416
- #~ msgid ""
417
- #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
418
- #~ "installed, this plugin already has disable comments functions, so you can "
419
- #~ "deactivate plugin \"Comments tweaks\"!"
420
- #~ msgstr ""
421
- #~ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить "
422
- #~ "неиспользуемые функции», этот плагин уже имеет функции отключения "
423
- #~ "комментариев, поэтому вы можете отключить плагин «Инструменты "
424
- #~ "комментариев»!"
425
-
426
- #~ msgid "Disable all comments"
427
- #~ msgstr "Отключить все комментарии"
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: clearfy\n"
4
+ "POT-Creation-Date: 2018-10-16 22:46+0300\n"
5
+ "PO-Revision-Date: 2018-10-16 23:23+0300\n"
6
+ "Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
7
+ "Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
8
+ "Language: ru_RU\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.1.1\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
16
+ "X-Poedit-SourceCharset: UTF-8\n"
17
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
18
+ "X-Poedit-SearchPath-0: .\n"
19
+ "X-Poedit-SearchPathExcluded-0: libs\n"
20
+
21
+ #: admin/boot.php:18
22
+ msgid "Disable comments on the entire site"
23
+ msgstr "Отключить комментарии на всем сайте"
24
+
25
+ #: admin/boot.php:24 admin/pages/comments.php:127
26
+ msgid "Select post types"
27
+ msgstr "Выбрать тип записи"
28
+
29
+ #: admin/boot.php:29 admin/pages/comments.php:167
30
+ msgid "Replace external links in comments on the JavaScript code"
31
+ msgstr "Заменить внешние ссылки в комментариях на JavaScript код"
32
+
33
+ #: admin/boot.php:34 admin/pages/comments.php:176
34
+ msgid "Replace external links from comment authors on the JavaScript code"
35
+ msgstr "Заменить внешние ссылки от авторов комментариев на код JavaScript"
36
+
37
+ #: admin/boot.php:39
38
+ msgid "Disable X-Pingback"
39
+ msgstr "Убрать ссылку на X-Pingback и возможность спамить pingback-ами"
40
+
41
+ #: admin/boot.php:44 admin/pages/comments.php:158
42
+ msgid "Remove field \"site\" in comment form"
43
+ msgstr "Удаляет поле \"Сайт\" в форме комментариев"
44
+
45
+ #: admin/boot.php:56
46
+ msgid "One click disable all comments"
47
+ msgstr "Отключить все комментарии в один клик"
48
+
49
+ #: admin/boot.php:77
50
+ msgid "Get ultimate plugin free"
51
+ msgstr "Получите полную версию плагина бесплатно"
52
+
53
+ #: admin/pages/comments.php:38 admin/pages/comments.php:92
54
+ msgid "Disable comments"
55
+ msgstr "Отключить комментарии"
56
+
57
+ #: admin/pages/comments.php:39
58
+ msgid "Manage site comments"
59
+ msgstr "Упр. комментариями"
60
+
61
+ #: admin/pages/comments.php:52
62
+ msgid "Comments"
63
+ msgstr "Комментарии"
64
+
65
+ #: admin/pages/comments.php:52
66
+ msgid "General"
67
+ msgstr "Основные"
68
+
69
+ #: admin/pages/comments.php:67
70
+ msgid "Global disabling of comments"
71
+ msgstr "Глобальное отключение комментариев"
72
+
73
+ #: admin/pages/comments.php:67
74
+ msgid ""
75
+ "What is the difference between these and native WordPress functions? "
76
+ "WordPress disables comments only for new posts! Using the functions below, "
77
+ "you can disable comments globally, even for old posts, and you can choose "
78
+ "which post types comments to disable. The plugin also disables the comment "
79
+ "functionality itself, which creates a certain load on the site."
80
+ msgstr ""
81
+ "Чем отличается эти функции от нативных функций Wordpress? Wordpress "
82
+ "отключает комментарии только для новых записей! С помощью функций ниже, вы "
83
+ "можете отключить комментарии глобально, даже для старых записей, причем вы "
84
+ "можете выбрать для каких типов записей нужно отключить комментарии. Плагин "
85
+ "также отключает сам функционал комментариев, который создает определенную "
86
+ "нагрузку на сайт."
87
+
88
+ #: admin/pages/comments.php:94
89
+ msgid "Not disable"
90
+ msgstr "Не отключать"
91
+
92
+ #: admin/pages/comments.php:97
93
+ msgid "Everywhere"
94
+ msgstr "Повсюду"
95
+
96
+ #: admin/pages/comments.php:98
97
+ #, php-format
98
+ msgid ""
99
+ "You can delete all comments in the database by clicking on this link (<a "
100
+ "href=\"%s\">cleaning comments in database</a>)."
101
+ msgstr ""
102
+ "Вы можете удалить все комментарии в базе данных, нажав на эту ссылку ( <a "
103
+ "href=\"%s\">очистка комментариев в базе данных</a> )."
104
+
105
+ #: admin/pages/comments.php:102
106
+ msgid "On certain post types"
107
+ msgstr "Только выбранные типы записей"
108
+
109
+ #: admin/pages/comments.php:103
110
+ #, php-format
111
+ msgid ""
112
+ "You can delete all comments for the selected post types. Select the post "
113
+ "types below and save the settings. After that, click the link (<a href=\"%s"
114
+ "\">delete all comments for the selected post types in database</a>)."
115
+ msgstr ""
116
+ "Вы можете удалить все комментарии для выбранных типов записей. Выберите типы "
117
+ "записей ниже и сохраните настройки. После этого нажмите ссылку ( <a href=\"%s"
118
+ "\">удалите все комментарии для выбранных типов записей в базе данных</a> )."
119
+
120
+ #: admin/pages/comments.php:107
121
+ msgid ""
122
+ "Everywhere - Warning: This option is global and will affect your entire "
123
+ "site. Use it only if you want to disable comments everywhere. A complete "
124
+ "description of what this option does is available here"
125
+ msgstr ""
126
+ "Повсюду - предупреждение: этот параметр является глобальным и повлияет на "
127
+ "весь ваш сайт. Используйте его только в том случае, если вы хотите отключить "
128
+ "комментарии повсюду. "
129
+
130
+ #: admin/pages/comments.php:107
131
+ msgid ""
132
+ "On certain post types - Disabling comments will also disable trackbacks and "
133
+ "pingbacks. All comment-related fields will also be hidden from the edit/"
134
+ "quick-edit screens of the affected posts. These settings cannot be "
135
+ "overridden for individual posts."
136
+ msgstr ""
137
+ "В некоторых типах сообщений - отключение комментариев также отключает "
138
+ "трекбэки и pingback. Все поля, связанные с комментариями, также будут скрыты "
139
+ "от экранов редактирования / быстрого редактирования затронутых сообщений. "
140
+ "Эти настройки нельзя переопределять для отдельных сообщений."
141
+
142
+ #: admin/pages/comments.php:130
143
+ msgid "Select the post types for which comments will be disabled"
144
+ msgstr "Выберите типы записей, для которых комментарии будут отключены."
145
+
146
+ #: admin/pages/comments.php:138
147
+ msgid "Custom post types"
148
+ msgstr "Произвольные типы записей"
149
+
150
+ #: admin/pages/comments.php:141
151
+ msgid ""
152
+ "Only the built-in post types appear above. If you want to disable comments "
153
+ "on other custom post types on the entire network, you can supply a comma-"
154
+ "separated list of post types below (use the slug that identifies the post "
155
+ "type)."
156
+ msgstr ""
157
+ "Только встроенные типы записей отображаются выше. Если вы хотите отключить "
158
+ "комментарии к другим пользовательским типам записей во всей сети, вы можете "
159
+ "предоставить список типов сообщений, разделенных запятыми (используйте имя, "
160
+ "которое идентифицирует тип записей)."
161
+
162
+ #: admin/pages/comments.php:152
163
+ msgid "General settings for comments"
164
+ msgstr "Общие настройки комментариев"
165
+
166
+ #: admin/pages/comments.php:152
167
+ msgid "These settings will help you improve SEO and reduce the amount of spam."
168
+ msgstr "Эти настройки помогут вам улучшить SEO и уменьшить количество спама."
169
+
170
+ #: admin/pages/comments.php:160
171
+ msgid ""
172
+ "Tired of spam in the comments? Do visitors leave \"blank\" comments for the "
173
+ "sake of a link to their site?"
174
+ msgstr ""
175
+ "Надоел спам в комментариях? Посетители оставляют «пустые» комментарии ради "
176
+ "ссылки на свой сайт?"
177
+
178
+ #: admin/pages/comments.php:160
179
+ msgid "Removes the \"Site\" field from the comment form."
180
+ msgstr "Убирает поле «Сайт» из формы комментирования."
181
+
182
+ #: admin/pages/comments.php:160
183
+ msgid ""
184
+ "Works with the standard comment form, if the form is manually written in "
185
+ "your theme-it probably will not work!"
186
+ msgstr ""
187
+ "Работает со стандартной формой комментирования, если в Вашей теме форма "
188
+ "прописана вручную - скорей всего не сработает!"
189
+
190
+ #: admin/pages/comments.php:169
191
+ msgid ""
192
+ "Superfluous external links from comments, which can be typed from a dozen "
193
+ "and more for one article, do not bring anything good for promotion."
194
+ msgstr ""
195
+ "Внешние ссылки в комментариях, которых может быть десятки или больше на "
196
+ "одной странице, могут ухудшить продвижение вашего сайта."
197
+
198
+ #: admin/pages/comments.php:169
199
+ #, php-format
200
+ msgid "Replaces the links of this kind of %s, on links of this kind %s"
201
+ msgstr ""
202
+ "Заменяет ссылки %s, на span тег и устанавливает переход с помощью JavaScript "
203
+ "%s"
204
+
205
+ #: admin/pages/comments.php:178
206
+ msgid ""
207
+ "Up to 90 percent of comments in the blog can be left for the sake of an "
208
+ "external link. Even nofollow from page weight loss here does not help."
209
+ msgstr ""
210
+ "До 90 процентов комментариев в блоге оставляют ради внешней ссылки. Не "
211
+ "поможет даже nofollow от потери веса страницы."
212
+
213
+ #: admin/pages/comments.php:178
214
+ msgid ""
215
+ "Replaces the links of the authors of comments on the JavaScript code, it is "
216
+ "impossible to distinguish it from usual links."
217
+ msgstr ""
218
+ "Заменяет ссылки авторов комментариев на JavaScript код, его невозможно "
219
+ "отличить от обычной ссылки."
220
+
221
+ #: admin/pages/comments.php:178
222
+ msgid "In some Wordpress topics this may not work."
223
+ msgstr "В некоторых темах Wordpress это может не сработать."
224
+
225
+ #: admin/pages/comments.php:185
226
+ msgid "Disable XML-RPC"
227
+ msgstr "Отключить XML-RPC"
228
+
229
+ #: admin/pages/comments.php:187
230
+ msgid ""
231
+ "A pingback is basically an automated comment that gets created when another "
232
+ "blog links to you. A self-pingback is created when you link to an article "
233
+ "within your own blog. Pingbacks are essentially nothing more than spam and "
234
+ "simply waste resources."
235
+ msgstr ""
236
+ "Pingback по-существу автоматизированных комментарий, который создается, "
237
+ "когда другой блог ссылается на вас. Self-pingback создается, когда вы "
238
+ "оставили ссылку на статью в своем блоге. Pingbacks по существу являются не "
239
+ "более чем спам и пустая трата ресурсов вашего сайта."
240
+
241
+ #: admin/pages/comments.php:187
242
+ msgid "Removes the server responses a reference to the xmlrpc file."
243
+ msgstr "Удаляет ссылку на xmlrpc-файл и ответ сервера."
244
+
245
+ #: admin/pages/delete-comments.php:41
246
+ msgid "Comments cleaner"
247
+ msgstr "Очистка комментариев"
248
+
249
+ #: admin/pages/delete-comments.php:62
250
+ msgid "All comments have been deleted."
251
+ msgstr "Все комментарии были удалены."
252
+
253
+ #: admin/pages/delete-comments.php:71
254
+ msgid ""
255
+ "An error occurred while trying to delete comments. Internal error occured. "
256
+ "Please try again later."
257
+ msgstr ""
258
+ "При попытке удалить комментарии произошла ошибка. Пожалуйста, повторите "
259
+ "попытку позже."
260
+
261
+ #: admin/pages/delete-comments.php:211
262
+ msgid ""
263
+ "Are you sure you want to delete comments from the database without restoring?"
264
+ msgstr ""
265
+ "Вы уверены, что вы хотите удалить комментарии из базы данных без "
266
+ "восстановления?"
267
+
268
+ #: admin/pages/delete-comments.php:226
269
+ msgid "Delete "
270
+ msgstr "Удалить"
271
+
272
+ #: admin/pages/delete-comments.php:232
273
+ msgid "Comments clearing tools"
274
+ msgstr "Комментарии очищающие инструменты"
275
+
276
+ #: admin/pages/delete-comments.php:235
277
+ msgid ""
278
+ "These functions can be useful for global disabling comments or bulk cleaning "
279
+ "spam comments."
280
+ msgstr ""
281
+ "Эти функции могут быть полезны для глобальных отключений комментариев или "
282
+ "массовой очистки спама комментариев."
283
+
284
+ #: admin/pages/delete-comments.php:240
285
+ msgid "Remove all comments"
286
+ msgstr "Удалить все комментарии"
287
+
288
+ #: admin/pages/delete-comments.php:242
289
+ msgid "You can delete all comments in your database with one click."
290
+ msgstr "Вы можете удалить все комментарии в базе данных с одним щелчком мыши."
291
+
292
+ #: admin/pages/delete-comments.php:244
293
+ msgid "Choose post types"
294
+ msgstr "Выберите типы записей"
295
+
296
+ #: admin/pages/delete-comments.php:249
297
+ msgid "Select all"
298
+ msgstr "Выбрать все"
299
+
300
+ #: admin/pages/delete-comments.php:266
301
+ #, php-format
302
+ msgid "Delete Woocommerce order notices? (%d)"
303
+ msgstr "Удалять заметки от заказов Woocommerce? (%d)"
304
+
305
+ #: admin/pages/delete-comments.php:272
306
+ #, php-format
307
+ msgid "Delete (%s)"
308
+ msgstr "Удалить (%s)"
309
+
310
+ #: admin/pages/delete-comments.php:279
311
+ msgid "Remove spam comments"
312
+ msgstr "Удалить спам комментарии"
313
+
314
+ #: admin/pages/delete-comments.php:281
315
+ msgid "You can remove only spam comments from the database with one click."
316
+ msgstr ""
317
+ "Вы можете одним нажатием удалить только спам комментарии из базы данных."
318
+
319
+ #: admin/pages/delete-comments.php:283 admin/pages/delete-comments.php:290
320
+ #: admin/pages/delete-comments.php:297
321
+ #, php-format
322
+ msgid "Delete (%d)"
323
+ msgstr "Удалить (%d)"
324
+
325
+ #: admin/pages/delete-comments.php:286
326
+ msgid "Remove unapproved comments"
327
+ msgstr "Удалить неподтвержденные комментарии"
328
+
329
+ #: admin/pages/delete-comments.php:288
330
+ msgid ""
331
+ "You can remove only unapproved comments from the database with one click."
332
+ msgstr ""
333
+ "Вы можете одним нажатием удалить только не подтвержденные комментарии из "
334
+ "базы данных."
335
+
336
+ #: admin/pages/delete-comments.php:293
337
+ msgid "Remove trashed comments"
338
+ msgstr "Удалить комментарии из корзины"
339
+
340
+ #: admin/pages/delete-comments.php:295
341
+ msgid "You can remove only trashed comments from the database with one click."
342
+ msgstr "Вы можете одним нажатием удалить только комментарии из корзины."
343
+
344
+ #: comments-plus.php:63
345
+ msgid "Webcraftic Disable comments"
346
+ msgstr "Webcraftic отключить комментарии"
347
+
348
+ #: includes/classes/class.configurate-comments.php:204
349
+ #: includes/classes/class.configurate-comments.php:256
350
+ msgid "Comments are closed."
351
+ msgstr "Комментарии Закрыты."
352
+
353
+ #: includes/classes/class.configurate-comments.php:244
354
+ #, php-format
355
+ msgid ""
356
+ "Note: The <em>%s</em> plugin is currently active, and comments are "
357
+ "completely disabled on: %s. Many of the settings below will not be "
358
+ "applicable for those post types."
359
+ msgstr ""
360
+ "Примечание. Плагин <em>%s</em> в настоящий момент активен, и комментарии "
361
+ "полностью отключены: %s. Многие из приведенных ниже настроек не будут "
362
+ "применяться для этих типов сообщений."
363
+
364
+ #~ msgid ""
365
+ #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
366
+ #~ "installed, this plugin already has disable comments functions, so you can "
367
+ #~ "deactivate plugin \"Disable comments\"!"
368
+ #~ msgstr ""
369
+ #~ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить "
370
+ #~ "неиспользуемые функции», этот плагин уже имеет функции отключения "
371
+ #~ "комментариев, поэтому вы можете отключить плагин «Отключить комментарии»!"
372
+
373
+ #~ msgid "Recommended"
374
+ #~ msgstr "Рекомендовано"
375
+
376
+ #~ msgid "You are not allowed to view this page."
377
+ #~ msgstr "Вам не разрешено просматривать эту страницу."
378
+
379
+ #~ msgid "You do not have the selected post types!"
380
+ #~ msgstr "Вы не выбрали еще ни одного типа записей!"
381
+
382
+ #~ msgid "No comments available for deletion."
383
+ #~ msgstr "Нет комментариев для удаления."
384
+
385
+ #~ msgid ""
386
+ #~ "Are you sure that you desire to delete all comments from the database?"
387
+ #~ msgstr "Вы уверены, что хотите удалить все комментарии из базы данных?"
388
+
389
+ #~ msgid ""
390
+ #~ "Deleting comments will remove existing comment entries in the database "
391
+ #~ "and cannot be reverted without a database backup."
392
+ #~ msgstr ""
393
+ #~ "При удалении комментариев удаляются существующие записи комментариев в "
394
+ #~ "базе данных, они не могут быть восстановлены без резервного копирования "
395
+ #~ "базы данных."
396
+
397
+ #~ msgid "You have %s comments"
398
+ #~ msgstr "У вас есть %s комментариев"
399
+
400
+ #~ msgid "Yes, I'm sure"
401
+ #~ msgstr "Да, я уверен"
402
+
403
+ #~ msgid "No, return back"
404
+ #~ msgstr "Нет, вернуться"
405
+
406
+ #~ msgid ""
407
+ #~ "Are you sure that you desire to delete all comments from the database for "
408
+ #~ "the selected post types (%s)?"
409
+ #~ msgstr ""
410
+ #~ "Вы уверены, что хотите удалить все комментарии из базы данных для "
411
+ #~ "выбранных типов записей (%s)?"
412
+
413
+ #~ msgid "Webcraftic comments tweaks"
414
+ #~ msgstr "Webcraftic инструменты комментариев"
415
+
416
+ #~ msgid ""
417
+ #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
418
+ #~ "installed, this plugin already has disable comments functions, so you can "
419
+ #~ "deactivate plugin \"Comments tweaks\"!"
420
+ #~ msgstr ""
421
+ #~ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить "
422
+ #~ "неиспользуемые функции», этот плагин уже имеет функции отключения "
423
+ #~ "комментариев, поэтому вы можете отключить плагин «Инструменты "
424
+ #~ "комментариев»!"
425
+
426
+ #~ msgid "Disable all comments"
427
+ #~ msgstr "Отключить все комментарии"
components/cyrlitera/cyrlitera.php CHANGED
@@ -1,74 +1,96 @@
1
  <?php
2
- /**
3
- * Plugin Name: Webcraftic Cyrlitera – transliteration of links and file names
4
- * Plugin URI: https://wordpress.org/plugins/cyrlitera/
5
- * Description: The plugin converts Cyrillic, Georgian links, filenames into Latin. It is necessary for correct work of WordPress plugins and improve links readability.
6
- * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
- * Version: 1.0.6
8
- * Text Domain: cyrlitera
9
- * Domain Path: /languages/
10
- * Author URI: http://clearfy.pro
11
- * Framework Version: FACTORY_409_VERSION
12
- */
13
 
14
- // Exit if accessed directly
15
- if( !defined('ABSPATH') ) {
16
- exit;
17
- }
18
 
19
- define('WCTR_PLUGIN_VERSION', '1.0.6');
 
 
20
 
21
- define('WCTR_PLUGIN_DIR', dirname(__FILE__));
22
- define('WCTR_PLUGIN_BASE', plugin_basename(__FILE__));
23
- define('WCTR_PLUGIN_URL', plugins_url(null, __FILE__));
 
 
 
 
24
 
25
-
 
 
 
26
 
27
- if( !defined('LOADING_CYRLITERA_AS_ADDON') ) {
28
- require_once(WCTR_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php');
29
- require_once(WCTR_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php');
30
- }
 
 
 
 
 
31
 
32
- $plugin_info = array(
33
- 'prefix' => 'wbcr_cyrlitera_',
34
- 'plugin_name' => 'wbcr_cyrlitera',
35
- 'plugin_title' => __('Webcraftic Cyrlitera', 'cyrlitera'),
36
- 'plugin_version' => WCTR_PLUGIN_VERSION,
37
- 'plugin_build' => 'free',
38
- 'updates' => WCTR_PLUGIN_DIR . '/updates/'
39
- );
40
 
41
- /**
42
- * Проверяет совместимость с Wordpress, php и другими плагинами.
43
- */
44
- $compatibility = new Wbcr_FactoryClearfy_Compatibility(array_merge($plugin_info, array(
45
- 'plugin_already_activate' => defined('WCTR_PLUGIN_ACTIVE'),
46
- 'plugin_as_component' => defined('LOADING_CYRLITERA_AS_ADDON'),
47
- 'plugin_dir' => WCTR_PLUGIN_DIR,
48
- 'plugin_base' => WCTR_PLUGIN_BASE,
49
- 'plugin_url' => WCTR_PLUGIN_URL,
50
- 'required_php_version' => '5.3',
51
- 'required_wp_version' => '4.2.0',
52
- 'required_clearfy_check_component' => true
53
- )));
54
 
55
- /**
56
- * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
57
- * а пользователь получит предупреждение.
58
- */
59
- if( !$compatibility->check() ) {
60
- return;
61
- }
62
 
63
- define('WCTR_PLUGIN_ACTIVE', true);
 
 
 
 
 
 
 
64
 
65
- if( !defined('LOADING_CYRLITERA_AS_ADDON') ) {
66
- require_once(WCTR_PLUGIN_DIR . '/libs/factory/core/boot.php');
67
- }
 
 
 
 
 
 
 
 
 
 
 
68
 
69
- require_once(WCTR_PLUGIN_DIR . '/includes/class.helpers.php');
70
- require_once(WCTR_PLUGIN_DIR . '/includes/class.plugin.php');
 
 
 
 
 
71
 
72
- if( !defined('LOADING_CYRLITERA_AS_ADDON') ) {
73
- new WCTR_Plugin(__FILE__, $plugin_info);
74
- }
 
 
 
 
 
 
 
 
 
1
  <?php
2
+ /**
3
+ * Plugin Name: Webcraftic Cyrlitera – transliteration of links and file names
4
+ * Plugin URI: https://wordpress.org/plugins/cyrlitera/
5
+ * Description: The plugin converts Cyrillic, Georgian links, filenames into Latin. It is necessary for correct work of WordPress plugins and improve links readability.
6
+ * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
+ * Version: 1.1.7
8
+ * Text Domain: cyrlitera
9
+ * Domain Path: /languages/
10
+ * Author URI: http://clearfy.pro
11
+ * Framework Version: FACTORY_409_VERSION
12
+ */
13
 
14
+ // Exit if accessed directly
15
+ if ( ! defined( 'ABSPATH' ) ) {
16
+ exit;
17
+ }
18
 
19
+ if ( ! defined( 'WCTR_PLUGIN_VERSION' ) ) {
20
+ define( 'WCTR_PLUGIN_VERSION', '1.0.6' );
21
+ }
22
 
23
+ // Fix for ithemes sync. When the ithemes sync plugin accepts the request, set the WP_ADMIN constant,
24
+ // after which the plugin Clearfy begins to create errors, and how the logic of its work is broken.
25
+ // Solution to simply terminate the plugin if there is a request from ithemes sync
26
+ // --------------------------------------
27
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'ithemes_sync_request' ) {
28
+ return;
29
+ }
30
 
31
+ if ( isset( $_GET['ithemes-sync-request'] ) && ! empty( $_GET['ithemes-sync-request'] ) ) {
32
+ return;
33
+ }
34
+ // ----------------------------------------
35
 
36
+ if ( ! defined( 'WCTR_PLUGIN_DIR' ) ) {
37
+ define( 'WCTR_PLUGIN_DIR', dirname( __FILE__ ) );
38
+ }
39
+ if ( ! defined( 'WCTR_PLUGIN_BASE' ) ) {
40
+ define( 'WCTR_PLUGIN_BASE', plugin_basename( __FILE__ ) );
41
+ }
42
+ if ( ! defined( 'WCTR_PLUGIN_URL' ) ) {
43
+ define( 'WCTR_PLUGIN_URL', plugins_url( null, __FILE__ ) );
44
+ }
45
 
 
 
 
 
 
 
 
 
46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
 
48
+ if ( ! defined( 'LOADING_CYRLITERA_AS_ADDON' ) ) {
49
+ require_once( WCTR_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php' );
50
+ require_once( WCTR_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php' );
51
+ }
 
 
 
52
 
53
+ $plugin_info = array(
54
+ 'prefix' => 'wbcr_cyrlitera_',
55
+ 'plugin_name' => 'wbcr_cyrlitera',
56
+ 'plugin_title' => __( 'Webcraftic Cyrlitera', 'cyrlitera' ),
57
+ 'plugin_version' => WCTR_PLUGIN_VERSION,
58
+ 'plugin_build' => 'free',
59
+ 'updates' => WCTR_PLUGIN_DIR . '/updates/'
60
+ );
61
 
62
+ /**
63
+ * Проверяет совместимость с Wordpress, php и другими плагинами.
64
+ */
65
+ $compatibility = new Wbcr_FactoryClearfy_Compatibility( array_merge( $plugin_info, array(
66
+ 'factory_version' => 'FACTORY_409_VERSION',
67
+ 'plugin_already_activate' => defined( 'WCTR_PLUGIN_ACTIVE' ),
68
+ 'plugin_as_component' => defined( 'LOADING_CYRLITERA_AS_ADDON' ),
69
+ 'plugin_dir' => WCTR_PLUGIN_DIR,
70
+ 'plugin_base' => WCTR_PLUGIN_BASE,
71
+ 'plugin_url' => WCTR_PLUGIN_URL,
72
+ 'required_php_version' => '5.3',
73
+ 'required_wp_version' => '4.2.0',
74
+ 'required_clearfy_check_component' => true
75
+ ) ) );
76
 
77
+ /**
78
+ * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
79
+ * а пользователь получит предупреждение.
80
+ */
81
+ if ( ! $compatibility->check() ) {
82
+ return;
83
+ }
84
 
85
+ define( 'WCTR_PLUGIN_ACTIVE', true );
86
+
87
+ if ( ! defined( 'LOADING_CYRLITERA_AS_ADDON' ) ) {
88
+ require_once( WCTR_PLUGIN_DIR . '/libs/factory/core/boot.php' );
89
+ }
90
+
91
+ require_once( WCTR_PLUGIN_DIR . '/includes/class.helpers.php' );
92
+ require_once( WCTR_PLUGIN_DIR . '/includes/class.plugin.php' );
93
+
94
+ if ( ! defined( 'LOADING_CYRLITERA_AS_ADDON' ) ) {
95
+ new WCTR_Plugin( __FILE__, $plugin_info );
96
+ }
components/cyrlitera/includes/class.helpers.php CHANGED
@@ -1,609 +1,636 @@
1
  <?php
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  /**
4
- * Helpers functions
5
- * @author Webcraftic <wordpress.webraftic@gmail.com>
6
- * @copyright (c) 2017 Webraftic Ltd
7
- * @version 1.0
8
  */
9
-
10
- // Exit if accessed directly
11
- if( !defined('ABSPATH') ) {
12
- exit;
13
- }
14
-
15
- class WCTR_Helper {
16
-
17
- public static function transliterate($title, $ignore_special_symbols = false)
18
- {
19
- $origin_title = $title;
20
- $iso9_table = self::getSymbolsPack();
21
-
22
- $title = urldecode($title);
23
- $title = strtr($title, $iso9_table);
24
-
25
- if( function_exists('iconv') ) {
26
- $title = iconv('UTF-8', 'UTF-8//TRANSLIT//IGNORE', $title);
27
- }
28
-
29
- if( !$ignore_special_symbols ) {
30
- $title = preg_replace("/[^A-Za-z0-9'_\-\.]/", '-', $title);
31
- $title = preg_replace('/\-+/', '-', $title);
32
- $title = preg_replace('/^-+/', '', $title);
33
- $title = preg_replace('/-+$/', '', $title);
34
  }
35
-
36
- return apply_filters('wbcr_cyrlitera_transliterate', $title, $origin_title, $iso9_table);
37
  }
38
-
39
- /**
40
- * @param string $title обработанный заголовок
41
- * @return mixed|void
42
- */
43
- public static function sanitizeTitle($title)
44
- {
45
- global $wpdb;
46
-
47
- $origin_title = $title;
48
-
49
- $is_term = false;
50
- $backtrace = debug_backtrace();
51
- foreach($backtrace as $backtrace_entry) {
52
- if( $backtrace_entry['function'] == 'wp_insert_term' ) {
53
- $is_term = true;
54
- break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  }
 
56
  }
57
-
58
- foreach ($backtrace as $backtrace_entry) {
59
- if($backtrace_entry['function'] == 'query_posts' and isset($backtrace_entry['class']) and $backtrace_entry['class'] == 'WP'){
60
- return $origin_title;
61
- }
62
- }
63
-
64
- $term = $is_term ? $wpdb->get_var($wpdb->prepare("SELECT slug FROM {$wpdb->terms} WHERE name = '%s'", $title)) : '';
65
-
66
- if( empty($term) ) {
67
- $title = self::transliterate($title);
68
- } else {
69
- $title = $term;
70
- }
71
-
72
- return apply_filters('wbcr_cyrlitera_sanitize_title', $title, $origin_title);
73
  }
74
-
75
- /**
76
- * @return array
77
- */
78
- public static function getSymbolsPack()
79
- {
80
- $loc = get_locale();
81
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  $ret = array(
83
- // russian
84
- 'А' => 'A',
85
- 'а' => 'a',
86
- 'Б' => 'B',
87
- 'б' => 'b',
88
- 'В' => 'V',
89
- 'в' => 'v',
90
- 'Г' => 'G',
91
- 'г' => 'g',
92
- 'Д' => 'D',
93
- 'д' => 'd',
94
- 'Е' => 'E',
95
- 'е' => 'e',
96
- 'Ё' => 'Jo',
97
- 'ё' => 'jo',
98
- 'Ж' => 'Zh',
99
- 'ж' => 'zh',
100
- 'З' => 'Z',
101
- 'з' => 'z',
102
- 'И' => 'I',
103
- 'и' => 'i',
104
- 'Й' => 'J',
105
- 'й' => 'j',
106
- 'К' => 'K',
107
- 'к' => 'k',
108
- 'Л' => 'L',
109
- 'л' => 'l',
110
- 'М' => 'M',
111
- 'м' => 'm',
112
- 'Н' => 'N',
113
- 'н' => 'n',
114
- 'О' => 'O',
115
- 'о' => 'o',
116
- 'П' => 'P',
117
- 'п' => 'p',
118
- 'Р' => 'R',
119
- 'р' => 'r',
120
- 'С' => 'S',
121
- 'с' => 's',
122
- 'Т' => 'T',
123
- 'т' => 't',
124
- 'У' => 'U',
125
- 'у' => 'u',
126
- 'Ф' => 'F',
127
- 'ф' => 'f',
128
- 'Х' => 'H',
129
- 'х' => 'h',
130
- 'Ц' => 'C',
131
- 'ц' => 'c',
132
- 'Ч' => 'Ch',
133
- 'ч' => 'ch',
134
- 'Ш' => 'Sh',
135
- 'ш' => 'sh',
136
- 'Щ' => 'Shh',
137
- 'щ' => 'shh',
138
- 'Ъ' => '',
139
- 'ъ' => '',
140
- 'Ы' => 'Y',
141
- 'ы' => 'y',
142
- 'Ь' => '',
143
- 'ь' => '',
144
- 'Э' => 'Je',
145
- 'э' => 'je',
146
- 'Ю' => 'Ju',
147
- 'ю' => 'ju',
148
- 'Я' => 'Ja',
149
- 'я' => 'ja',
150
- // global
151
- 'Ґ' => 'G',
152
- 'ґ' => 'g',
153
- 'Є' => 'Ie',
154
- 'є' => 'ie',
155
- 'І' => 'I',
156
- 'і' => 'i',
157
- 'Ї' => 'I',
158
- 'ї' => 'i',
159
- 'Ї' => 'i',
160
- 'ї' => 'i',
161
- 'Ё' => 'Jo',
162
- 'ё' => 'jo',
163
- 'й' => 'i',
164
- 'Й' => 'I'
165
  );
166
-
167
- // ukrainian
168
- if( $loc == 'uk' ) {
169
- $ret = array_merge($ret, array(
170
- 'Г' => 'H',
171
- 'г' => 'h',
172
- 'И' => 'Y',
173
- 'и' => 'y',
174
- 'Х' => 'Kh',
175
- 'х' => 'kh',
176
- 'Ц' => 'Ts',
177
- 'ц' => 'ts',
178
- 'Щ' => 'Shch',
179
- 'щ' => 'shch',
180
- 'Ю' => 'Iu',
181
- 'ю' => 'iu',
182
- 'Я' => 'Ia',
183
- 'я' => 'ia',
184
-
185
- ));
186
- //bulgarian
187
- } elseif( $loc == 'bg' || $loc == 'bg_BG' ) {
188
- $ret = array_merge($ret, array(
189
- 'Щ' => 'Sht',
190
- 'щ' => 'sht',
191
- 'Ъ' => 'a',
192
- 'ъ' => 'a'
193
- ));
194
- }
195
-
196
- if( $loc == 'ka_GE' ) {
197
- $ret = array(
198
- '' => 'a',
199
- '' => 'b',
200
- '' => 'g',
201
- '' => 'd',
202
- '' => 'e',
203
- '' => 'v',
204
- '' => 'z',
205
- '' => 'th',
206
- '' => 'i',
207
- '' => 'k',
208
- '' => 'l',
209
- '' => 'm',
210
- '' => 'n',
211
- '' => 'o',
212
- '' => 'p',
213
- '' => 'zh',
214
- '' => 'r',
215
- '' => 's',
216
- '' => 't',
217
- '' => 'u',
218
- '' => 'ph',
219
- '' => 'q',
220
- '' => 'gh',
221
- '' => 'qh',
222
- '' => 'sh',
223
- '' => 'ch',
224
- '' => 'ts',
225
- '' => 'dz',
226
- '' => 'ts',
227
- '' => 'tch',
228
- '' => 'kh',
229
- '' => 'j',
230
- '' => 'h'
231
- );
232
- }
233
-
234
-
235
- // Armenian
236
- if( $loc == 'hy'){
237
- $ret = array_merge($ret, array(
238
- 'Ա' => 'A',
239
- 'ա' => 'a',
240
- 'Բ' => 'B',
241
- 'բ' => 'b',
242
- 'Գ' => 'G',
243
- 'գ' => 'g',
244
- 'Դ' => 'D',
245
- 'դ' => 'd',
246
- ' Ե' => ' Ye',
247
- 'Ե' => 'E',
248
- ' ե' => ' ye',
249
- 'ե' => 'e',
250
- 'Զ' => 'Z',
251
- 'զ' => 'z',
252
- 'Է' => 'E',
253
- 'է' => 'e',
254
- 'Ը' => 'Y',
255
- 'ը' => 'y',
256
- 'Թ' => 'T',
257
- 'թ' => 't',
258
- 'Ժ' => 'Zh',
259
- 'ժ' => 'zh',
260
- 'Ի' => 'I',
261
- 'ի' => 'i',
262
- 'Լ' => 'L',
263
- 'լ' => 'l',
264
- 'Խ' => 'KH',
265
- 'խ' => 'kh',
266
- 'Ծ' => 'TS',
267
- 'ծ' => 'ts',
268
- 'Կ' => 'K',
269
- 'կ' => 'K',
270
- 'Հ' => 'H',
271
- 'հ' => 'h',
272
- 'Ձ' => 'DZ',
273
- 'ձ' => 'dz',
274
- 'Ղ' => 'GH',
275
- 'ղ' => 'gh',
276
- 'Ճ' => 'J',
277
- 'Ճ' => 'j',
278
- 'Մ' => 'M',
279
- 'մ' => 'm',
280
- 'Յ' => 'Y',
281
- 'յ' => 'y',
282
- 'Ն' => 'N',
283
- 'ն' => 'n',
284
- 'Շ' => 'SH',
285
- 'շ' => 'sh',
286
- ' Ո' => 'VO',
287
- 'Ո' => 'VO',
288
- ' ո' => ' vo',
289
- 'ո' => 'o',
290
- 'Չ' => 'Ch',
291
- 'չ' => 'ch',
292
- 'Պ' => 'P',
293
- 'պ' => 'p',
294
- 'Ջ' => 'J',
295
- 'ջ' => 'j',
296
- 'Ռ' => 'R',
297
- 'ռ' => 'r',
298
- 'Ս' => 'S',
299
- 'ս' => 's',
300
- 'Վ' => 'V',
301
- 'վ' => 'v',
302
- 'Տ' => 'T',
303
- 'տ' => 't',
304
- 'Ր' => 'R',
305
- 'ր' => 'r',
306
- 'Ց' => 'C',
307
- 'ց' => 'c',
308
- 'Ու' => 'U',
309
- 'ու' => 'u',
310
- 'Փ' => 'P',
311
- 'փ' => 'p',
312
- 'Ք' => 'Q',
313
- 'ք' => 'q',
314
- 'Եվ' => 'EV',
315
- 'և' => 'ev',
316
- 'Օ' => 'O',
317
- 'օ' => 'o',
318
- 'Ֆ' => 'F',
319
- 'ֆ' => 'f'
320
- ));
321
- }
322
-
323
- // Serbian
324
- if($loc == 'sr_RS'){
325
- $ret = array_merge($ret, array(
326
- "Ђ" => "DJ",
327
- "Ж" => "Z",
328
- "З" => "Z",
329
- "Љ" => "LJ",
330
- "Њ" => "NJ",
331
- "Ш" => "S",
332
- "Ћ" => "C",
333
- "Ц" => "C",
334
- "Ч" => "C",
335
- "Џ" => "DZ",
336
- "ђ" => "dj",
337
- "ж" => "z",
338
- "з" => "z",
339
- "и" => "i",
340
- "љ" => "lj",
341
- "њ" => "nj",
342
- "ш" => "s",
343
- "ћ" => "c",
344
- "ч" => "c",
345
- "џ" => "dz",
346
- "Ња" => "Nja",
347
- "Ње" => "Nje",
348
- "Њи" => "Nji",
349
- "Њо" => "Njo",
350
- "Њу" => "Nju",
351
- "Ља" => "Lja",
352
- "Ље" => "Lje",
353
- "Љи" => "Lji",
354
- "Љо" => "Ljo",
355
- "Љу" => "Lju",
356
- "Џа" => "Dza",
357
- "Џе" => "Dze",
358
- "Џи" => "Dzi",
359
- "Џо" => "Dzo",
360
- "Џу" => "Dzu"
361
- ));
362
- }
363
-
364
-
365
- $custom_rules = WCTR_Plugin::app()->getPopulateOption('custom_symbols_pack');
366
-
367
- if( !empty($custom_rules) ) {
368
- $split_rules = explode(',', $custom_rules);
369
- $split_rules = array_map('trim', $split_rules);
370
-
371
- foreach($split_rules as $rule) {
372
- $split_symbols = explode('=', $rule);
373
-
374
- if( sizeof($split_symbols) === 2 ) {
375
- if( empty($split_symbols[0]) ) {
376
- continue;
377
- }
378
-
379
- $ret[$split_symbols[0]] = $split_symbols[1];
380
  }
 
 
381
  }
382
  }
383
-
384
- return apply_filters('wbcr_cyrlitera_default_symbols_pack', $ret);
385
  }
386
-
387
- /**
388
- * Делает откат изменений после выполнения метода convertExistingSlugs,
389
- * этот метод не восстановливает вновь конвертированные слаги.
390
- */
391
- public static function rollbackUrlChanges()
392
- {
393
- global $wpdb;
394
-
395
- $posts = $wpdb->get_results("SELECT p.ID, p.post_name, m.meta_value as old_post_name FROM {$wpdb->posts} p
 
 
396
  LEFT JOIN {$wpdb->postmeta} m
397
  ON p.ID = m.post_id
398
  WHERE p.post_status
399
- IN ('publish', 'future', 'private') AND m.meta_key='wbcr_wp_old_slug' AND m.meta_value IS NOT NULL");
400
-
401
- foreach((array)$posts as $post) {
402
- if( $post->post_name != $post->old_post_name ) {
403
- $wpdb->update($wpdb->posts, array('post_name' => $post->old_post_name), array('ID' => $post->ID), array('%s'), array('%d'));
404
- delete_post_meta($post->ID, 'wbcr_wp_old_slug');
405
- }
406
  }
407
-
408
- $terms = $wpdb->get_results("SELECT t.term_id, t.slug, o.option_value as old_term_slug FROM {$wpdb->terms} t
 
409
  LEFT JOIN {$wpdb->options} o
410
  ON o.option_name=concat('wbcr_wp_term_',t.term_id, '_old_slug')
411
- WHERE o.option_value IS NOT NULL");
412
-
413
- foreach((array)$terms as $term) {
414
- if( $term->slug != $term->old_term_slug ) {
415
- $wpdb->update($wpdb->terms, array('slug' => $term->old_term_slug), array('term_id' => $term->term_id), array('%s'), array('%d'));
416
- delete_option('wbcr_wp_term_' . $term->term_id . '_old_slug');
417
- }
418
  }
419
-
420
- // BuddyPress group slug
421
- // ! slug maybe urlencoded
422
- if(is_plugin_active('buddypress/bp-loader.php')){
423
- $groups = $wpdb->get_results("SELECT t.id, t.name, t.slug, o.option_value as old_term_slug FROM {$wpdb->prefix}bp_groups t
 
424
  LEFT JOIN {$wpdb->options} o
425
  ON o.option_name=concat('wbcr_bp_groups_',t.id, '_old_slug')
426
- WHERE o.option_value IS NOT NULL");
427
- foreach ((array)$groups as $group) {
428
- if( $group->slug != $group->old_term_slug ){
429
- $wpdb->update("{$wpdb->prefix}bp_groups", array('slug' => $group->old_term_slug), array('id' => $group->id), array('%s'), array('%d'));
430
- delete_option('wbcr_bp_groups_'.$group->id.'_old_slug');
431
- }
432
- }
433
- }
434
-
435
-
436
- // Asgaros Forum
437
- if(is_plugin_active('asgaros-forum/asgaros-forum.php')){
438
- $forums = $wpdb->get_results("SELECT t.id, t.name, t.slug, o.option_value as old_term_slug FROM {$wpdb->prefix}forum_forums t
439
  LEFT JOIN {$wpdb->options} o
440
  ON o.option_name=concat('wbcr_asgaros_forums_',t.id, '_old_slug')
441
- WHERE o.option_value IS NOT NULL");
442
- foreach( (array) $forums as $forum){
443
- if( $forum->slug != $forum->old_term_slug ){
444
- $wpdb->update("{$wpdb->prefix}forum_forums", array('slug' => $forum->old_term_slug), array('id' => $forum->id), array('%s'), array('%d'));
445
- delete_option('wbcr_asgaros_forums_'.$forum->id.'_old_slug');
446
- }
447
- }
448
-
449
- //topic
450
- $topics = $wpdb->get_results("SELECT t.id, t.name, t.slug, o.option_value as old_term_slug FROM {$wpdb->prefix}forum_topics t
451
  LEFT JOIN {$wpdb->options} o
452
  ON o.option_name=concat('wbcr_asgaros_topics_',t.id, '_old_slug')
453
- WHERE o.option_value IS NOT NULL");
454
- foreach ( (array) $topics as $topic){
455
- if( $topic->slug != $topic->old_term_slug ){
456
- $wpdb->update("{$wpdb->prefix}forum_topics", array('slug' => $topic->old_term_slug), array('id' => $topic->id), array('%s'), array('%d'));
457
- delete_option('wbcr_asgaros_topics_'.$topic->id.'_old_slug');
458
- }
459
- }
460
-
461
- }
462
-
463
- // WP Foro
464
- if(is_plugin_active('wpforo/wpforo.php')) {
465
- // forums
466
- $forums = $wpdb->get_results("SELECT t.forumid, t.title, t.slug, o.option_value as old_term_slug FROM {$wpdb->prefix}wpforo_forums t
467
  LEFT JOIN {$wpdb->options} o
468
  ON o.option_name=concat('wbcr_wpforo_forums_',t.forumid, '_old_slug')
469
- WHERE o.option_value IS NOT NULL");
470
-
471
- foreach ( (array) $forums as $forum){
472
- if( $forum->slug != $forum->old_term_slug ){
473
- $wpdb->update("{$wpdb->prefix}wpforo_forums", array('slug' => $forum->old_term_slug), array('forumid' => $forum->forumid), array('%s'), array('%d'));
474
- delete_option('wbcr_wpforo_forums_'.$topic->id.'_old_slug');
475
- }
476
- }
477
-
478
- // topics
479
- $topics = $wpdb->get_results("SELECT t.topicid, t.title, t.slug, o.option_value as old_term_slug FROM {$wpdb->prefix}wpforo_topics t
480
  LEFT JOIN {$wpdb->options} o
481
  ON o.option_name=concat('wbcr_wpforo_topics_',t.topicid, '_old_slug')
482
- WHERE o.option_value IS NOT NULL");
483
-
484
- foreach ( (array) $topics as $topic){
485
- if( $topic->slug != $topic->old_term_slug ){
486
- $wpdb->update("{$wpdb->prefix}wpforo_topics", array('slug' => $topic->old_term_slug), array('topicid' => $topic->topicid), array('%s'), array('%d'));
487
- delete_option('wbcr_wpforo_topics_'.$topic->id.'_old_slug');
488
- }
489
- }
490
-
491
- // clear cache
492
- WPF()->phrase->clear_cache();
493
- WPF()->member->clear_db_cache();
494
- wpforo_clean_cache();
495
- }
496
-
497
-
498
  }
499
-
500
- /**
501
- * Массово конвертирует слаги для страниц, записей, терминов и т.д.
502
- * Делает бекап старого слага, чтобы можно было восстановить его. А также использовать в других плагинах.
503
- */
504
- public static function convertExistingSlugs()
505
- {
506
- global $wpdb;
507
-
508
- $posts = $wpdb->get_results("SELECT ID, post_name FROM {$wpdb->posts}
509
- WHERE post_name REGEXP('[^_A-Za-z0-9\-]+') AND post_status IN ('publish', 'future', 'private')");
510
-
511
- foreach((array)$posts as $post) {
512
- $sanitized_name = WCTR_Helper::sanitizeTitle(urldecode($post->post_name));
513
-
514
- if( $post->post_name != $sanitized_name ) {
515
- add_post_meta($post->ID, 'wbcr_wp_old_slug', $post->post_name);
516
-
517
- $wpdb->update($wpdb->posts, array('post_name' => $sanitized_name), array('ID' => $post->ID), array('%s'), array('%d'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
518
  }
519
  }
520
-
521
- $terms = $wpdb->get_results("SELECT term_id, slug FROM {$wpdb->terms} WHERE slug REGEXP('[^_A-Za-z0-9\-]+')");
522
-
523
- foreach((array)$terms as $term) {
524
- $sanitized_slug = WCTR_Helper::sanitizeTitle(urldecode($term->slug));
525
-
526
- if( $term->slug != $sanitized_slug ) {
527
- update_option('wbcr_wp_term_' . $term->term_id . '_old_slug', $term->slug, false);
528
- $wpdb->update($wpdb->terms, array('slug' => $sanitized_slug), array('term_id' => $term->term_id), array('%s'), array('%d'));
 
 
 
 
529
  }
530
  }
531
-
532
- // BuddyPress group slug
533
- // ! slug maybe urlencoded
534
- if(is_plugin_active('buddypress/bp-loader.php')){
535
-
536
- $groups = $wpdb->get_results("SELECT `id`, `name`, `slug` FROM {$wpdb->prefix}bp_groups WHERE slug REGEXP('%|[^_A-Za-z0-9\-]+')");
537
- if(is_array($groups)){
538
- foreach ($groups as $group){
539
- $sanitized_slug = WCTR_Helper::sanitizeTitle(urldecode($group->slug));
540
- if($group->slug != $sanitized_slug){
541
- update_option('wbcr_bp_groups_'.$group->id.'_old_slug', $group->slug, false);
542
- $wpdb->update($wpdb->prefix.'bp_groups', array('slug' => $sanitized_slug), array('id' => $group->id), array('%s'), array('%d'));
543
- }
544
- }
545
- }
546
- }
547
-
548
- // Asgaros Forum
549
- if(is_plugin_active('asgaros-forum/asgaros-forum.php')){
550
- // forum slug
551
- $groups = $wpdb->get_results("SELECT `id`, `name`, `slug` FROM {$wpdb->prefix}forum_forums WHERE slug REGEXP('%|[^_A-Za-z0-9\-]+')");
552
- if(is_array($groups)){
553
- foreach ($groups as $group){
554
- $sanitized_slug = WCTR_Helper::sanitizeTitle(urldecode($group->slug));
555
- if($group->slug != $sanitized_slug){
556
- update_option('wbcr_asgaros_forums_'.$group->id.'_old_slug', $group->slug, false);
557
- $wpdb->update($wpdb->prefix.'forum_forums', array('slug' => $sanitized_slug), array('id' => $group->id), array('%s'), array('%d'));
558
- }
559
- }
560
- }
561
- // topic slug
562
- $groups = $wpdb->get_results("SELECT `id`, `name`, `slug` FROM {$wpdb->prefix}forum_topics WHERE slug REGEXP('%|[^_A-Za-z0-9\-]+')");
563
- if(is_array($groups)){
564
- foreach ($groups as $group){
565
- $sanitized_slug = WCTR_Helper::sanitizeTitle(urldecode($group->slug));
566
- if($group->slug != $sanitized_slug){
567
- update_option('wbcr_asgaros_topics_'.$group->id.'_old_slug', $group->slug, false);
568
- $wpdb->update($wpdb->prefix.'forum_topics', array('slug' => $sanitized_slug), array('id' => $group->id), array('%s'), array('%d'));
569
- }
570
- }
571
- }
572
-
573
- }
574
-
575
- // WP Foro
576
- if(is_plugin_active('wpforo/wpforo.php')){
577
- // forum slug
578
- $forums = $wpdb->get_results("SELECT `forumid`, `title`, `slug` FROM {$wpdb->prefix}wpforo_forums WHERE slug REGEXP('%|[^_A-Za-z0-9\-]+')");
579
- if(is_array($forums)){
580
- foreach ($forums as $forum){
581
- $sanitized_slug = WCTR_Helper::sanitizeTitle(urldecode($forum->slug));
582
- if($forum->slug != $sanitized_slug){
583
- update_option('wbcr_wpforo_forums_'.$forum->forumid.'_old_slug', $forum->slug, false);
584
- $wpdb->update($wpdb->prefix.'wpforo_forums', array('slug' => $sanitized_slug), array('forumid' => $forum->forumid), array('%s'), array('%d'));
585
- }
586
- }
587
- }
588
-
589
- // topic slug
590
- $topics = $wpdb->get_results("SELECT `topicid`, `title`, `slug` FROM {$wpdb->prefix}wpforo_topics WHERE slug REGEXP('%|[^_A-Za-z0-9\-]+')");
591
- if(is_array($topics)){
592
- foreach ($topics as $topic) {
593
- $sanitized_slug = WCTR_Helper::sanitizeTitle(urldecode($topic->slug));
594
- if($topic->slug != $sanitized_slug){
595
- update_option('wbcr_wpforo_topics_'.$topic->topicid.'_old_slug', $topic->slug, false);
596
- $wpdb->update($wpdb->prefix.'wpforo_topics', array('slug' => $sanitized_slug), array('topicid' => $topic->topicid), array('%s'), array('%d'));
597
- }
598
- }
599
- }
600
-
601
- // clear cache
602
- WPF()->phrase->clear_cache();
603
- WPF()->member->clear_db_cache();
604
- wpforo_clean_cache();
605
- }
606
-
607
-
608
- }
609
  }
 
1
  <?php
2
 
3
+ /**
4
+ * Helpers functions
5
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
6
+ * @copyright (c) 2017 Webraftic Ltd
7
+ * @version 1.0
8
+ */
9
+
10
+ // Exit if accessed directly
11
+ if ( ! defined( 'ABSPATH' ) ) {
12
+ exit;
13
+ }
14
+
15
+ class WCTR_Helper {
16
+
17
+ public static function transliterate( $title, $ignore_special_symbols = false ) {
18
+ $origin_title = $title;
19
+ $iso9_table = self::getSymbolsPack();
20
+
21
+ $title = urldecode( $title );
22
+ $title = strtr( $title, $iso9_table );
23
+
24
+ if ( function_exists( 'iconv' ) ) {
25
+ $title = iconv( 'UTF-8', 'UTF-8//TRANSLIT//IGNORE', $title );
26
+ }
27
+
28
+ if ( ! $ignore_special_symbols ) {
29
+ $title = preg_replace( "/[^A-Za-z0-9'_\-\.]/", '-', $title );
30
+ $title = preg_replace( '/\-+/', '-', $title );
31
+ $title = preg_replace( '/^-+/', '', $title );
32
+ $title = preg_replace( '/-+$/', '', $title );
33
+ }
34
+
35
+ return apply_filters( 'wbcr_cyrlitera_transliterate', $title, $origin_title, $iso9_table );
36
+ }
37
+
38
  /**
39
+ * @param string $title обработанный заголовок
40
+ *
41
+ * @return mixed|string
 
42
  */
43
+ public static function sanitizeTitle( $title ) {
44
+ global $wpdb;
45
+
46
+ $origin_title = $title;
47
+
48
+ $is_term = false;
49
+ $backtrace = debug_backtrace();
50
+ foreach ( $backtrace as $backtrace_entry ) {
51
+ if ( $backtrace_entry['function'] == 'wp_insert_term' ) {
52
+ $is_term = true;
53
+ break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  }
 
 
55
  }
56
+
57
+ foreach ( $backtrace as $backtrace_entry ) {
58
+ if ( isset( $backtrace_entry['function'] ) && isset( $backtrace_entry['class'] ) ) {
59
+
60
+ # WOOCOMMERCE FIXES
61
+ # We need to cancel the transliteration of attributes for variable products,
62
+ # as this brings harm to users.
63
+ #------------------------------------
64
+ /*if ( class_exists( 'WooCommerce' ) ) {
65
+ $is_woo_variations = in_array( $backtrace_entry['function'], array(
66
+ 'set_attributes',
67
+ 'output',
68
+ 'load_variations',
69
+ 'prepare_set_attributes',
70
+ 'save_attributes',
71
+ 'add_variation',
72
+ 'save_variations',
73
+ 'read_variation_attributes'
74
+ ) ) && in_array( $backtrace_entry['class'], array(
75
+ 'WC_AJAX',
76
+ 'WC_Product',
77
+ 'WC_Meta_Box_Product_Data',
78
+ 'WC_Product_Variable_Data_Store_CPT'
79
+ ) );
80
+
81
+ if ( $is_woo_variations ) {
82
+ return $origin_title;
83
+ }
84
+ }*/
85
+ #------------------------------------
86
+
87
+ # FRONTEND FIXES
88
+ #------------------------------------
89
+ if ( ! is_admin() ) {
90
+ $is_query = in_array( $backtrace_entry['function'], array(
91
+ 'query_posts',
92
+ 'get_terms'
93
+ ) ) && in_array( $backtrace_entry['class'], array( 'WP', 'WP_Term_Query' ) );
94
+
95
+ if ( $is_query ) {
96
+ return $origin_title;
97
+ }
98
  }
99
+ #------------------------------------
100
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  }
102
+
103
+ $term = $is_term ? $wpdb->get_var( $wpdb->prepare( "SELECT slug FROM {$wpdb->terms} WHERE name = '%s'", $title ) ) : '';
104
+
105
+ if ( empty( $term ) ) {
106
+ $title = self::transliterate( $title );
107
+ } else {
108
+ $title = $term;
109
+ }
110
+
111
+ return apply_filters( 'wbcr_cyrlitera_sanitize_title', $title, $origin_title );
112
+ }
113
+
114
+ /**
115
+ * @return array
116
+ */
117
+ public static function getSymbolsPack() {
118
+ $loc = get_locale();
119
+
120
+ $ret = array(
121
+ // russian
122
+ 'А' => 'A',
123
+ 'а' => 'a',
124
+ 'Б' => 'B',
125
+ 'б' => 'b',
126
+ 'В' => 'V',
127
+ 'в' => 'v',
128
+ 'Г' => 'G',
129
+ 'г' => 'g',
130
+ 'Д' => 'D',
131
+ 'д' => 'd',
132
+ 'Е' => 'E',
133
+ 'е' => 'e',
134
+ 'Ё' => 'Jo',
135
+ 'ё' => 'jo',
136
+ 'Ж' => 'Zh',
137
+ 'ж' => 'zh',
138
+ 'З' => 'Z',
139
+ 'з' => 'z',
140
+ 'И' => 'I',
141
+ 'и' => 'i',
142
+ 'Й' => 'J',
143
+ 'й' => 'j',
144
+ 'К' => 'K',
145
+ 'к' => 'k',
146
+ 'Л' => 'L',
147
+ 'л' => 'l',
148
+ 'М' => 'M',
149
+ 'м' => 'm',
150
+ 'Н' => 'N',
151
+ 'н' => 'n',
152
+ 'О' => 'O',
153
+ 'о' => 'o',
154
+ 'П' => 'P',
155
+ 'п' => 'p',
156
+ 'Р' => 'R',
157
+ 'р' => 'r',
158
+ 'С' => 'S',
159
+ 'с' => 's',
160
+ 'Т' => 'T',
161
+ 'т' => 't',
162
+ 'У' => 'U',
163
+ 'у' => 'u',
164
+ 'Ф' => 'F',
165
+ 'ф' => 'f',
166
+ 'Х' => 'H',
167
+ 'х' => 'h',
168
+ 'Ц' => 'C',
169
+ 'ц' => 'c',
170
+ 'Ч' => 'Ch',
171
+ 'ч' => 'ch',
172
+ 'Ш' => 'Sh',
173
+ 'ш' => 'sh',
174
+ 'Щ' => 'Shh',
175
+ 'щ' => 'shh',
176
+ 'Ъ' => '',
177
+ 'ъ' => '',
178
+ 'Ы' => 'Y',
179
+ 'ы' => 'y',
180
+ 'Ь' => '',
181
+ 'ь' => '',
182
+ 'Э' => 'Je',
183
+ 'э' => 'je',
184
+ 'Ю' => 'Ju',
185
+ 'ю' => 'ju',
186
+ 'Я' => 'Ja',
187
+ 'я' => 'ja',
188
+ // global
189
+ 'Ґ' => 'G',
190
+ 'ґ' => 'g',
191
+ 'Є' => 'Ie',
192
+ 'є' => 'ie',
193
+ 'І' => 'I',
194
+ 'і' => 'i',
195
+ 'Ї' => 'I',
196
+ 'ї' => 'i',
197
+ 'Ї' => 'i',
198
+ 'ї' => 'i',
199
+ 'Ё' => 'Jo',
200
+ 'ё' => 'jo',
201
+ 'й' => 'i',
202
+ 'Й' => 'I'
203
+ );
204
+
205
+ // ukrainian
206
+ if ( $loc == 'uk' ) {
207
+ $ret = array_merge( $ret, array(
208
+ 'Г' => 'H',
209
+ 'г' => 'h',
210
+ 'И' => 'Y',
211
+ 'и' => 'y',
212
+ 'Х' => 'Kh',
213
+ 'х' => 'kh',
214
+ 'Ц' => 'Ts',
215
+ 'ц' => 'ts',
216
+ 'Щ' => 'Shch',
217
+ 'щ' => 'shch',
218
+ 'Ю' => 'Iu',
219
+ 'ю' => 'iu',
220
+ 'Я' => 'Ia',
221
+ 'я' => 'ia',
222
+
223
+ ) );
224
+ //bulgarian
225
+ } elseif ( $loc == 'bg' || $loc == 'bg_BG' ) {
226
+ $ret = array_merge( $ret, array(
227
+ 'Щ' => 'Sht',
228
+ 'щ' => 'sht',
229
+ 'Ъ' => 'a',
230
+ 'ъ' => 'a'
231
+ ) );
232
+ }
233
+
234
+ if ( $loc == 'ka_GE' ) {
235
  $ret = array(
236
+ 'ა' => 'a',
237
+ '' => 'b',
238
+ '' => 'g',
239
+ '' => 'd',
240
+ '' => 'e',
241
+ '' => 'v',
242
+ '' => 'z',
243
+ '' => 'th',
244
+ '' => 'i',
245
+ '' => 'k',
246
+ '' => 'l',
247
+ '' => 'm',
248
+ '' => 'n',
249
+ '' => 'o',
250
+ '' => 'p',
251
+ '' => 'zh',
252
+ '' => 'r',
253
+ '' => 's',
254
+ '' => 't',
255
+ '' => 'u',
256
+ '' => 'ph',
257
+ '' => 'q',
258
+ '' => 'gh',
259
+ '' => 'qh',
260
+ '' => 'sh',
261
+ '' => 'ch',
262
+ '' => 'ts',
263
+ '' => 'dz',
264
+ '' => 'ts',
265
+ '' => 'tch',
266
+ '' => 'kh',
267
+ '' => 'j',
268
+ '' => 'h'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
269
  );
270
+ }
271
+
272
+ // Armenian
273
+ if ( $loc == 'hy' ) {
274
+ $ret = array_merge( $ret, array(
275
+ 'Ա' => 'A',
276
+ 'ա' => 'a',
277
+ 'Բ' => 'B',
278
+ 'բ' => 'b',
279
+ 'Գ' => 'G',
280
+ 'գ' => 'g',
281
+ 'Դ' => 'D',
282
+ 'դ' => 'd',
283
+ ' Ե' => ' Ye',
284
+ 'Ե' => 'E',
285
+ ' ե' => ' ye',
286
+ 'ե' => 'e',
287
+ 'Զ' => 'Z',
288
+ 'զ' => 'z',
289
+ 'Է' => 'E',
290
+ 'է' => 'e',
291
+ 'Ը' => 'Y',
292
+ 'ը' => 'y',
293
+ 'Թ' => 'T',
294
+ 'թ' => 't',
295
+ 'Ժ' => 'Zh',
296
+ 'ժ' => 'zh',
297
+ 'Ի' => 'I',
298
+ 'ի' => 'i',
299
+ 'Լ' => 'L',
300
+ 'լ' => 'l',
301
+ 'Խ' => 'KH',
302
+ 'խ' => 'kh',
303
+ 'Ծ' => 'TS',
304
+ 'ծ' => 'ts',
305
+ 'Կ' => 'K',
306
+ 'կ' => 'K',
307
+ 'Հ' => 'H',
308
+ 'հ' => 'h',
309
+ 'Ձ' => 'DZ',
310
+ 'ձ' => 'dz',
311
+ 'Ղ' => 'GH',
312
+ 'ղ' => 'gh',
313
+ 'Ճ' => 'J',
314
+ 'Ճ' => 'j',
315
+ 'Մ' => 'M',
316
+ 'մ' => 'm',
317
+ 'Յ' => 'Y',
318
+ 'յ' => 'y',
319
+ 'Ն' => 'N',
320
+ 'ն' => 'n',
321
+ 'Շ' => 'SH',
322
+ 'շ' => 'sh',
323
+ ' Ո' => 'VO',
324
+ 'Ո' => 'VO',
325
+ ' ո' => ' vo',
326
+ 'ո' => 'o',
327
+ 'Չ' => 'Ch',
328
+ 'չ' => 'ch',
329
+ 'Պ' => 'P',
330
+ 'պ' => 'p',
331
+ 'Ջ' => 'J',
332
+ 'ջ' => 'j',
333
+ 'Ռ' => 'R',
334
+ 'ռ' => 'r',
335
+ 'Ս' => 'S',
336
+ 'ս' => 's',
337
+ 'Վ' => 'V',
338
+ 'վ' => 'v',
339
+ 'Տ' => 'T',
340
+ 'տ' => 't',
341
+ 'Ր' => 'R',
342
+ 'ր' => 'r',
343
+ 'Ց' => 'C',
344
+ 'ց' => 'c',
345
+ 'Ու' => 'U',
346
+ 'ու' => 'u',
347
+ 'Փ' => 'P',
348
+ 'փ' => 'p',
349
+ 'Ք' => 'Q',
350
+ 'ք' => 'q',
351
+ 'Եվ' => 'EV',
352
+ 'և' => 'ev',
353
+ 'Օ' => 'O',
354
+ 'օ' => 'o',
355
+ 'Ֆ' => 'F',
356
+ 'ֆ' => 'f'
357
+ ) );
358
+ }
359
+
360
+ // Serbian
361
+ if ( $loc == 'sr_RS' ) {
362
+ $ret = array_merge( $ret, array(
363
+ "Ђ" => "DJ",
364
+ "Ж" => "Z",
365
+ "З" => "Z",
366
+ "Љ" => "LJ",
367
+ "Њ" => "NJ",
368
+ "Ш" => "S",
369
+ "Ћ" => "C",
370
+ "Ц" => "C",
371
+ "Ч" => "C",
372
+ "Џ" => "DZ",
373
+ "ђ" => "dj",
374
+ "ж" => "z",
375
+ "з" => "z",
376
+ "и" => "i",
377
+ "љ" => "lj",
378
+ "њ" => "nj",
379
+ "ш" => "s",
380
+ "ћ" => "c",
381
+ "ч" => "c",
382
+ "џ" => "dz",
383
+ "Ња" => "Nja",
384
+ "Ње" => "Nje",
385
+ "Њи" => "Nji",
386
+ "Њо" => "Njo",
387
+ "Њу" => "Nju",
388
+ "Ља" => "Lja",
389
+ "Ље" => "Lje",
390
+ "Љи" => "Lji",
391
+ "Љо" => "Ljo",
392
+ "Љу" => "Lju",
393
+ "Џа" => "Dza",
394
+ "Џе" => "Dze",
395
+ "Џи" => "Dzi",
396
+ "Џо" => "Dzo",
397
+ "Џу" => "Dzu"
398
+ ) );
399
+ }
400
+
401
+ $custom_rules = WCTR_Plugin::app()->getPopulateOption( 'custom_symbols_pack' );
402
+
403
+ if ( ! empty( $custom_rules ) ) {
404
+ $split_rules = explode( ',', $custom_rules );
405
+ $split_rules = array_map( 'trim', $split_rules );
406
+
407
+ foreach ( $split_rules as $rule ) {
408
+ $split_symbols = explode( '=', $rule );
409
+
410
+ if ( sizeof( $split_symbols ) === 2 ) {
411
+ if ( empty( $split_symbols[0] ) ) {
412
+ continue;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
413
  }
414
+
415
+ $ret[ $split_symbols[0] ] = $split_symbols[1];
416
  }
417
  }
 
 
418
  }
419
+
420
+ return apply_filters( 'wbcr_cyrlitera_default_symbols_pack', $ret );
421
+ }
422
+
423
+ /**
424
+ * Делает откат изменений после выполнения метода convertExistingSlugs,
425
+ * этот метод не восстановливает вновь конвертированные слаги.
426
+ */
427
+ public static function rollbackUrlChanges() {
428
+ global $wpdb;
429
+
430
+ $posts = $wpdb->get_results( "SELECT p.ID, p.post_name, m.meta_value as old_post_name FROM {$wpdb->posts} p
431
  LEFT JOIN {$wpdb->postmeta} m
432
  ON p.ID = m.post_id
433
  WHERE p.post_status
434
+ IN ('publish', 'future', 'private') AND m.meta_key='wbcr_wp_old_slug' AND m.meta_value IS NOT NULL" );
435
+
436
+ foreach ( (array) $posts as $post ) {
437
+ if ( $post->post_name != $post->old_post_name ) {
438
+ $wpdb->update( $wpdb->posts, array( 'post_name' => $post->old_post_name ), array( 'ID' => $post->ID ), array( '%s' ), array( '%d' ) );
439
+ delete_post_meta( $post->ID, 'wbcr_wp_old_slug' );
 
440
  }
441
+ }
442
+
443
+ $terms = $wpdb->get_results( "SELECT t.term_id, t.slug, o.option_value as old_term_slug FROM {$wpdb->terms} t
444
  LEFT JOIN {$wpdb->options} o
445
  ON o.option_name=concat('wbcr_wp_term_',t.term_id, '_old_slug')
446
+ WHERE o.option_value IS NOT NULL" );
447
+
448
+ foreach ( (array) $terms as $term ) {
449
+ if ( $term->slug != $term->old_term_slug ) {
450
+ $wpdb->update( $wpdb->terms, array( 'slug' => $term->old_term_slug ), array( 'term_id' => $term->term_id ), array( '%s' ), array( '%d' ) );
451
+ delete_option( 'wbcr_wp_term_' . $term->term_id . '_old_slug' );
 
452
  }
453
+ }
454
+
455
+ // BuddyPress group slug
456
+ // ! slug maybe urlencoded
457
+ if ( is_plugin_active( 'buddypress/bp-loader.php' ) ) {
458
+ $groups = $wpdb->get_results( "SELECT t.id, t.name, t.slug, o.option_value as old_term_slug FROM {$wpdb->prefix}bp_groups t
459
  LEFT JOIN {$wpdb->options} o
460
  ON o.option_name=concat('wbcr_bp_groups_',t.id, '_old_slug')
461
+ WHERE o.option_value IS NOT NULL" );
462
+ foreach ( (array) $groups as $group ) {
463
+ if ( $group->slug != $group->old_term_slug ) {
464
+ $wpdb->update( "{$wpdb->prefix}bp_groups", array( 'slug' => $group->old_term_slug ), array( 'id' => $group->id ), array( '%s' ), array( '%d' ) );
465
+ delete_option( 'wbcr_bp_groups_' . $group->id . '_old_slug' );
466
+ }
467
+ }
468
+ }
469
+
470
+ // Asgaros Forum
471
+ if ( is_plugin_active( 'asgaros-forum/asgaros-forum.php' ) ) {
472
+ $forums = $wpdb->get_results( "SELECT t.id, t.name, t.slug, o.option_value as old_term_slug FROM {$wpdb->prefix}forum_forums t
 
473
  LEFT JOIN {$wpdb->options} o
474
  ON o.option_name=concat('wbcr_asgaros_forums_',t.id, '_old_slug')
475
+ WHERE o.option_value IS NOT NULL" );
476
+ foreach ( (array) $forums as $forum ) {
477
+ if ( $forum->slug != $forum->old_term_slug ) {
478
+ $wpdb->update( "{$wpdb->prefix}forum_forums", array( 'slug' => $forum->old_term_slug ), array( 'id' => $forum->id ), array( '%s' ), array( '%d' ) );
479
+ delete_option( 'wbcr_asgaros_forums_' . $forum->id . '_old_slug' );
480
+ }
481
+ }
482
+
483
+ //topic
484
+ $topics = $wpdb->get_results( "SELECT t.id, t.name, t.slug, o.option_value as old_term_slug FROM {$wpdb->prefix}forum_topics t
485
  LEFT JOIN {$wpdb->options} o
486
  ON o.option_name=concat('wbcr_asgaros_topics_',t.id, '_old_slug')
487
+ WHERE o.option_value IS NOT NULL" );
488
+ foreach ( (array) $topics as $topic ) {
489
+ if ( $topic->slug != $topic->old_term_slug ) {
490
+ $wpdb->update( "{$wpdb->prefix}forum_topics", array( 'slug' => $topic->old_term_slug ), array( 'id' => $topic->id ), array( '%s' ), array( '%d' ) );
491
+ delete_option( 'wbcr_asgaros_topics_' . $topic->id . '_old_slug' );
492
+ }
493
+ }
494
+ }
495
+
496
+ // WP Foro
497
+ if ( is_plugin_active( 'wpforo/wpforo.php' ) ) {
498
+ // forums
499
+ $forums = $wpdb->get_results( "SELECT t.forumid, t.title, t.slug, o.option_value as old_term_slug FROM {$wpdb->prefix}wpforo_forums t
 
500
  LEFT JOIN {$wpdb->options} o
501
  ON o.option_name=concat('wbcr_wpforo_forums_',t.forumid, '_old_slug')
502
+ WHERE o.option_value IS NOT NULL" );
503
+
504
+ foreach ( (array) $forums as $forum ) {
505
+ if ( $forum->slug != $forum->old_term_slug ) {
506
+ $wpdb->update( "{$wpdb->prefix}wpforo_forums", array( 'slug' => $forum->old_term_slug ), array( 'forumid' => $forum->forumid ), array( '%s' ), array( '%d' ) );
507
+ delete_option( 'wbcr_wpforo_forums_' . $topic->id . '_old_slug' );
508
+ }
509
+ }
510
+
511
+ // topics
512
+ $topics = $wpdb->get_results( "SELECT t.topicid, t.title, t.slug, o.option_value as old_term_slug FROM {$wpdb->prefix}wpforo_topics t
513
  LEFT JOIN {$wpdb->options} o
514
  ON o.option_name=concat('wbcr_wpforo_topics_',t.topicid, '_old_slug')
515
+ WHERE o.option_value IS NOT NULL" );
516
+
517
+ foreach ( (array) $topics as $topic ) {
518
+ if ( $topic->slug != $topic->old_term_slug ) {
519
+ $wpdb->update( "{$wpdb->prefix}wpforo_topics", array( 'slug' => $topic->old_term_slug ), array( 'topicid' => $topic->topicid ), array( '%s' ), array( '%d' ) );
520
+ delete_option( 'wbcr_wpforo_topics_' . $topic->id . '_old_slug' );
521
+ }
522
+ }
523
+
524
+ // clear cache
525
+ WPF()->phrase->clear_cache();
526
+ WPF()->member->clear_db_cache();
527
+ wpforo_clean_cache();
 
 
 
528
  }
529
+ }
530
+
531
+ /**
532
+ * Массово конвертирует слаги для страниц, записей, терминов и т.д.
533
+ * Делает бекап старого слага, чтобы можно было восстановить его. А также использовать в других плагинах.
534
+ */
535
+ public static function convertExistingSlugs() {
536
+ global $wpdb;
537
+
538
+ $posts = $wpdb->get_results( "SELECT ID, post_name FROM {$wpdb->posts}
539
+ WHERE post_name REGEXP('[^_A-Za-z0-9\-]+') AND post_status IN ('publish', 'future', 'private')" );
540
+
541
+ foreach ( (array) $posts as $post ) {
542
+ $sanitized_name = WCTR_Helper::sanitizeTitle( urldecode( $post->post_name ) );
543
+
544
+ if ( $post->post_name != $sanitized_name ) {
545
+ add_post_meta( $post->ID, 'wbcr_wp_old_slug', $post->post_name );
546
+
547
+ $wpdb->update( $wpdb->posts, array( 'post_name' => $sanitized_name ), array( 'ID' => $post->ID ), array( '%s' ), array( '%d' ) );
548
+ }
549
+ }
550
+
551
+ $terms = $wpdb->get_results( "SELECT term_id, slug FROM {$wpdb->terms} WHERE slug REGEXP('[^_A-Za-z0-9\-]+')" );
552
+
553
+ foreach ( (array) $terms as $term ) {
554
+ $sanitized_slug = WCTR_Helper::sanitizeTitle( urldecode( $term->slug ) );
555
+
556
+ if ( $term->slug != $sanitized_slug ) {
557
+ update_option( 'wbcr_wp_term_' . $term->term_id . '_old_slug', $term->slug, false );
558
+ $wpdb->update( $wpdb->terms, array( 'slug' => $sanitized_slug ), array( 'term_id' => $term->term_id ), array( '%s' ), array( '%d' ) );
559
+ }
560
+ }
561
+
562
+ // BuddyPress group slug
563
+ // ! slug maybe urlencoded
564
+ if ( is_plugin_active( 'buddypress/bp-loader.php' ) ) {
565
+
566
+ $groups = $wpdb->get_results( "SELECT `id`, `name`, `slug` FROM {$wpdb->prefix}bp_groups WHERE slug REGEXP('%|[^_A-Za-z0-9\-]+')" );
567
+ if ( is_array( $groups ) ) {
568
+ foreach ( $groups as $group ) {
569
+ $sanitized_slug = WCTR_Helper::sanitizeTitle( urldecode( $group->slug ) );
570
+ if ( $group->slug != $sanitized_slug ) {
571
+ update_option( 'wbcr_bp_groups_' . $group->id . '_old_slug', $group->slug, false );
572
+ $wpdb->update( $wpdb->prefix . 'bp_groups', array( 'slug' => $sanitized_slug ), array( 'id' => $group->id ), array( '%s' ), array( '%d' ) );
573
+ }
574
  }
575
  }
576
+ }
577
+
578
+ // Asgaros Forum
579
+ if ( is_plugin_active( 'asgaros-forum/asgaros-forum.php' ) ) {
580
+ // forum slug
581
+ $groups = $wpdb->get_results( "SELECT `id`, `name`, `slug` FROM {$wpdb->prefix}forum_forums WHERE slug REGEXP('%|[^_A-Za-z0-9\-]+')" );
582
+ if ( is_array( $groups ) ) {
583
+ foreach ( $groups as $group ) {
584
+ $sanitized_slug = WCTR_Helper::sanitizeTitle( urldecode( $group->slug ) );
585
+ if ( $group->slug != $sanitized_slug ) {
586
+ update_option( 'wbcr_asgaros_forums_' . $group->id . '_old_slug', $group->slug, false );
587
+ $wpdb->update( $wpdb->prefix . 'forum_forums', array( 'slug' => $sanitized_slug ), array( 'id' => $group->id ), array( '%s' ), array( '%d' ) );
588
+ }
589
  }
590
  }
591
+ // topic slug
592
+ $groups = $wpdb->get_results( "SELECT `id`, `name`, `slug` FROM {$wpdb->prefix}forum_topics WHERE slug REGEXP('%|[^_A-Za-z0-9\-]+')" );
593
+ if ( is_array( $groups ) ) {
594
+ foreach ( $groups as $group ) {
595
+ $sanitized_slug = WCTR_Helper::sanitizeTitle( urldecode( $group->slug ) );
596
+ if ( $group->slug != $sanitized_slug ) {
597
+ update_option( 'wbcr_asgaros_topics_' . $group->id . '_old_slug', $group->slug, false );
598
+ $wpdb->update( $wpdb->prefix . 'forum_topics', array( 'slug' => $sanitized_slug ), array( 'id' => $group->id ), array( '%s' ), array( '%d' ) );
599
+ }
600
+ }
601
+ }
602
+ }
603
+
604
+ // WP Foro
605
+ if ( is_plugin_active( 'wpforo/wpforo.php' ) ) {
606
+ // forum slug
607
+ $forums = $wpdb->get_results( "SELECT `forumid`, `title`, `slug` FROM {$wpdb->prefix}wpforo_forums WHERE slug REGEXP('%|[^_A-Za-z0-9\-]+')" );
608
+ if ( is_array( $forums ) ) {
609
+ foreach ( $forums as $forum ) {
610
+ $sanitized_slug = WCTR_Helper::sanitizeTitle( urldecode( $forum->slug ) );
611
+ if ( $forum->slug != $sanitized_slug ) {
612
+ update_option( 'wbcr_wpforo_forums_' . $forum->forumid . '_old_slug', $forum->slug, false );
613
+ $wpdb->update( $wpdb->prefix . 'wpforo_forums', array( 'slug' => $sanitized_slug ), array( 'forumid' => $forum->forumid ), array( '%s' ), array( '%d' ) );
614
+ }
615
+ }
616
+ }
617
+
618
+ // topic slug
619
+ $topics = $wpdb->get_results( "SELECT `topicid`, `title`, `slug` FROM {$wpdb->prefix}wpforo_topics WHERE slug REGEXP('%|[^_A-Za-z0-9\-]+')" );
620
+ if ( is_array( $topics ) ) {
621
+ foreach ( $topics as $topic ) {
622
+ $sanitized_slug = WCTR_Helper::sanitizeTitle( urldecode( $topic->slug ) );
623
+ if ( $topic->slug != $sanitized_slug ) {
624
+ update_option( 'wbcr_wpforo_topics_' . $topic->topicid . '_old_slug', $topic->slug, false );
625
+ $wpdb->update( $wpdb->prefix . 'wpforo_topics', array( 'slug' => $sanitized_slug ), array( 'topicid' => $topic->topicid ), array( '%s' ), array( '%d' ) );
626
+ }
627
+ }
628
+ }
629
+
630
+ // clear cache
631
+ WPF()->phrase->clear_cache();
632
+ WPF()->member->clear_db_cache();
633
+ wpforo_clean_cache();
634
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
635
  }
636
+ }
components/cyrlitera/includes/classes/class.configurate-cyrlitera.php CHANGED
@@ -81,7 +81,7 @@ class WCTR_ConfigurateCyrlitera extends Wbcr_FactoryClearfy206_Configurate {
81
  * @return string
82
  */
83
  public function forceSanitizeTitle( $title, $raw_title ) {
84
- $title = WCTR_Helper::sanitizeTitle( $raw_title );
85
  $force_transliterate = sanitize_title_with_dashes( $title );
86
 
87
  return apply_filters( 'wbcr_cyrlitera_sanitize_title', $force_transliterate, $raw_title );
@@ -152,15 +152,15 @@ class WCTR_ConfigurateCyrlitera extends Wbcr_FactoryClearfy206_Configurate {
152
  * @param string $filename_raw Filename as it was passed into sanitize_file_name().
153
  */
154
  $special_chars = apply_filters( 'sanitize_file_name_chars', $special_chars, $filename_raw );
155
- $filename = preg_replace( "#\x{00a0}#siu", ' ', $filename );
156
- $filename = str_replace( $special_chars, '', $filename );
157
- $filename = str_replace( array( '%20', '+' ), '-', $filename );
158
- $filename = preg_replace( '/[\r\n\t -]+/', '-', $filename );
159
- $filename = trim( $filename, '.-_' );
160
 
161
  if ( false === strpos( $filename, '.' ) ) {
162
  $mime_types = wp_get_mime_types();
163
- $filetype = wp_check_filetype( 'test.' . $filename, $mime_types );
164
  if ( $filetype['ext'] === $filename ) {
165
  $filename = 'unnamed-file.' . $filetype['ext'];
166
  }
@@ -181,9 +181,9 @@ class WCTR_ConfigurateCyrlitera extends Wbcr_FactoryClearfy206_Configurate {
181
  }
182
 
183
  // Process multiple extensions
184
- $filename = array_shift( $parts );
185
  $extension = array_pop( $parts );
186
- $mimes = get_allowed_mime_types();
187
 
188
  /*
189
  * Loop over any intermediate extensions. Postfix them with a trailing underscore
@@ -253,7 +253,8 @@ class WCTR_ConfigurateCyrlitera extends Wbcr_FactoryClearfy206_Configurate {
253
  if ( $is404 ) {
254
  if ( $this->getPopulateOption( 'redirect_from_old_urls' ) ) {
255
  $current_url = urldecode( $_SERVER['REQUEST_URI'] );
256
- $new_url = WCTR_Helper::transliterate( $current_url, true );
 
257
 
258
  if ( $current_url != $new_url ) {
259
  wp_redirect( $new_url, 301 );
81
  * @return string
82
  */
83
  public function forceSanitizeTitle( $title, $raw_title ) {
84
+ $title = WCTR_Helper::sanitizeTitle( $raw_title );
85
  $force_transliterate = sanitize_title_with_dashes( $title );
86
 
87
  return apply_filters( 'wbcr_cyrlitera_sanitize_title', $force_transliterate, $raw_title );
152
  * @param string $filename_raw Filename as it was passed into sanitize_file_name().
153
  */
154
  $special_chars = apply_filters( 'sanitize_file_name_chars', $special_chars, $filename_raw );
155
+ $filename = preg_replace( "#\x{00a0}#siu", ' ', $filename );
156
+ $filename = str_replace( $special_chars, '', $filename );
157
+ $filename = str_replace( array( '%20', '+' ), '-', $filename );
158
+ $filename = preg_replace( '/[\r\n\t -]+/', '-', $filename );
159
+ $filename = trim( $filename, '.-_' );
160
 
161
  if ( false === strpos( $filename, '.' ) ) {
162
  $mime_types = wp_get_mime_types();
163
+ $filetype = wp_check_filetype( 'test.' . $filename, $mime_types );
164
  if ( $filetype['ext'] === $filename ) {
165
  $filename = 'unnamed-file.' . $filetype['ext'];
166
  }
181
  }
182
 
183
  // Process multiple extensions
184
+ $filename = array_shift( $parts );
185
  $extension = array_pop( $parts );
186
+ $mimes = get_allowed_mime_types();
187
 
188
  /*
189
  * Loop over any intermediate extensions. Postfix them with a trailing underscore
253
  if ( $is404 ) {
254
  if ( $this->getPopulateOption( 'redirect_from_old_urls' ) ) {
255
  $current_url = urldecode( $_SERVER['REQUEST_URI'] );
256
+ $new_url = WCTR_Helper::transliterate( $current_url, true );
257
+ $new_url = strtolower( $new_url );
258
 
259
  if ( $current_url != $new_url ) {
260
  wp_redirect( $new_url, 301 );
components/cyrlitera/languages/cyrlitera-es_ES.mo ADDED
Binary file
components/cyrlitera/languages/cyrlitera-es_ES.po ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of Plugins - Clearfy in Spanish (Spain)
2
+ # This file is distributed under the same license as the Plugins - Clearfy – WordPress optimization plugin and disable ultimate tweaker - Development (trunk) package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: \n"
6
+ "POT-Creation-Date: 2019-04-28 06:25+0300\n"
7
+ "PO-Revision-Date: 2019-04-28 06:25+0300\n"
8
+ "Last-Translator: \n"
9
+ "Language-Team: \n"
10
+ "Language: es\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
15
+ "X-Generator: Poedit 2.1.1\n"
16
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
17
+ "X-Generator: Poedit 2.1.1\n"
18
+ "X-Poedit-Basepath: ..\n"
19
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
20
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
21
+ "X-Poedit-SourceCharset: UTF-8\n"
22
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
23
+ "X-Poedit-SearchPath-0: .\n"
24
+ "X-Poedit-SearchPathExcluded-0: libs\n"
25
+ "X-Poedit-SearchPathExcluded-1: components\n"
26
+ "X-Poedit-SearchPathExcluded-2: cache\n"
27
+
28
+ #: admin/boot.php:77
29
+ #, php-format
30
+ msgid ""
31
+ "We found that you have the plugin %s installed. The functions of this plugin "
32
+ "already exist in %s. Please deactivate plugin %s to avoid conflicts between "
33
+ "plugins functions."
34
+ msgstr ""
35
+ "Tienes el plugin%s instalado. Las funciones de este plugin ya existen en %s. "
36
+ "Desactive el complemento%s para evitar conflictos entre las funciones ambos."
37
+
38
+ #: admin/boot.php:78
39
+ #, php-format
40
+ msgid ""
41
+ "If you do not want to deactivate the plugin %s for some reason, we strongly "
42
+ "recommend do not use the same plugins functions at the same time!"
43
+ msgstr ""
44
+ "¡Si no desea desactivar el plugin %s por algún motivo, recomendamos nos usar "
45
+ "funciones similares de otros Plugins al mismo tiempo!."
46
+
47
+ #: admin/boot.php:138 admin/pages/cyrlitera.php:103
48
+ msgid "Use transliteration"
49
+ msgstr "Usar transliteracion"
50
+
51
+ #: admin/boot.php:144 admin/pages/cyrlitera.php:121
52
+ msgid "Force transliteration"
53
+ msgstr "Forzar transliterización"
54
+
55
+ #: admin/boot.php:150 admin/pages/cyrlitera.php:150
56
+ msgid "Don't use transliteration in frontend"
57
+ msgstr "No uses la transliteración en la interfaz."
58
+
59
+ #: admin/boot.php:156 admin/pages/cyrlitera.php:112
60
+ msgid "Convert file names"
61
+ msgstr "Convertir nombres de archivos"
62
+
63
+ #: admin/boot.php:162 admin/pages/cyrlitera.php:130
64
+ msgid "Convert file names into lowercase"
65
+ msgstr "Convertir nombres de archivos a minúsculas"
66
+
67
+ #: admin/boot.php:168 admin/pages/cyrlitera.php:140
68
+ msgid "Redirection old URLs to new ones"
69
+ msgstr "Redireccionar las URL antiguas a nuevas."
70
+
71
+ #: admin/boot.php:174 admin/pages/cyrlitera.php:160
72
+ msgid "Character Sets"
73
+ msgstr "Conjuntos de caracteres"
74
+
75
+ #: admin/boot.php:195
76
+ msgid "Get ultimate plugin free"
77
+ msgstr "Obtener el ultimate plugin gratis"
78
+
79
+ #: admin/pages/cyrlitera.php:39 admin/pages/cyrlitera.php:55
80
+ msgid "Transliteration"
81
+ msgstr "Transliterización"
82
+
83
+ #: admin/pages/cyrlitera.php:55
84
+ msgid "General"
85
+ msgstr "General"
86
+
87
+ #: admin/pages/cyrlitera.php:96
88
+ msgid "Transliteration of Cyrillic alphabet."
89
+ msgstr "Transliteración del alfabeto Cirílico."
90
+
91
+ #: admin/pages/cyrlitera.php:96
92
+ msgid ""
93
+ "Converts Cyrillic permalinks of post, pages, taxonomies and media files to "
94
+ "the Latin alphabet. Supports Russian, Ukrainian, Georgian, Bulgarian "
95
+ "languages. Example: http://site.dev/последние-новости -> http://site.dev/"
96
+ "poslednie-novosti"
97
+ msgstr ""
98
+ "Convierte los enlaces cirílicos de publicaciones, páginas, taxonomías y "
99
+ "archivos multimedia al alfabeto latino. Soporta idiomas ruso, ucraniano, "
100
+ "georgiano, búlgaro. Ejemplo: http://site.dev/последние-новости -> http://"
101
+ "site.dev/poslednie-novosti"
102
+
103
+ #: admin/pages/cyrlitera.php:105
104
+ msgid ""
105
+ "If you enable this option, all URLs of new pages, posts, tags, and "
106
+ "categories will automatically be converted to Latin."
107
+ msgstr ""
108
+ "Si habilita esta opción, todas las URL de las nuevas páginas, publicaciones, "
109
+ "etiquetas y categorías se convertirán automáticamente al latín."
110
+
111
+ #: admin/pages/cyrlitera.php:114
112
+ msgid ""
113
+ "This option works only for new media library files. All Cyrillic names of "
114
+ "the downloaded files will be converted to names with Latin characters."
115
+ msgstr ""
116
+ "Esta opción funciona solo para nuevos archivos de la biblioteca de medios. "
117
+ "Todos los nombres cirílicos de los archivos descargados se convertirán en "
118
+ "nombres con caracteres latinos."
119
+
120
+ #: admin/pages/cyrlitera.php:123
121
+ #, php-format
122
+ msgid ""
123
+ "If any of your plugins affects transliteration of links and file names, you "
124
+ "can use this option to change the plugin of %s to overwrite the changes of "
125
+ "the other plugins."
126
+ msgstr ""
127
+ "Si alguno de sus plugins afecta la transliteración de enlaces y nombres de "
128
+ "archivos, use esta opción para cambiar el plugin de %s y sobrescribir los "
129
+ "cambios de los otros complementos."
130
+
131
+ #: admin/pages/cyrlitera.php:132
132
+ msgid ""
133
+ "This function works only for new upload files. Example: File_Name.jpg -> "
134
+ "file_name.jpg"
135
+ msgstr ""
136
+ "Esta función solo trabaja para nuevas cargas de archivos. Ejemplo: "
137
+ "Nombre_Archivo.jpg -> nombre_archivo.jpg"
138
+
139
+ #: admin/pages/cyrlitera.php:142
140
+ msgid ""
141
+ "If at the time of the plugin installation you had pages with unconverted "
142
+ "links, use this option to redirect users from old to new URLs with the Latin "
143
+ "alphabet."
144
+ msgstr ""
145
+ "Si en el momento de la instalación del plugin tenía páginas con enlaces no "
146
+ "convertidos, use esta opción para redirigir a los usuarios de URL antiguas a "
147
+ "nuevas con alfabeto Latino."
148
+
149
+ #: admin/pages/cyrlitera.php:152
150
+ msgid "Enable when have a problem in frontend."
151
+ msgstr "Habilite cuando exista problemas en la interfaz."
152
+
153
+ #: admin/pages/cyrlitera.php:161
154
+ msgid ""
155
+ "You can supplement current base of transliteration characters. Write pairs "
156
+ "of values separated by commas. Example:"
157
+ msgstr ""
158
+ "Puede complementar la base actual de caracteres de transliteración. Escribe "
159
+ "pares de valores separados por comas. Ejemplo:"
160
+
161
+ #: admin/pages/cyrlitera.php:227
162
+ msgid ""
163
+ "If at the time of the plugin installation you already had posts, pages, tags "
164
+ "and categories, click on this button and the plugin will automatically "
165
+ "convert URLs into Latin. Attention! Previously uploaded files will not be "
166
+ "converted."
167
+ msgstr ""
168
+ "Si en el momento de la instalación del plugin ya tenía publicaciones, "
169
+ "páginas, etiquetas y categorías, haga clic en este botón y el plugin "
170
+ "convertirá automáticamente las URL en Latín. ¡Atención! Los archivos "
171
+ "cargados previamente no se convertirán."
172
+
173
+ #: admin/pages/cyrlitera.php:236
174
+ msgid "Convert already created posts and categories"
175
+ msgstr "Convertir publicaciones y categorías ya creados"
176
+
177
+ #: admin/pages/cyrlitera.php:238
178
+ msgid "Url of old posts, pages,terms,tags successfully converted into Latin!"
179
+ msgstr ""
180
+ "URL de entradas antiguas, páginas, términos y etiquetas convertidas con "
181
+ "éxito al Latín!"
182
+
183
+ #: admin/pages/cyrlitera.php:248
184
+ msgid ""
185
+ "Allows you to restore converted URLs by using the \"Convert already created "
186
+ "posts and categories\" button. This can be useful in case of incorrect URLs "
187
+ "or incorrect transliteration of some characters. You can roll back changes "
188
+ "and advance the character sets above to correct the plugin's work. "
189
+ msgstr ""
190
+ "Le permite restaurar las URL convertidas usando el botón \"Convertir las "
191
+ "publicaciones y categorías ya creadas\". Esto es útil en caso de URL "
192
+ "incorrectas o transliteración incorrecta de algunos caractéres. Puede "
193
+ "revertir los cambios y avanzar los conjuntos de caractéres anteriores para "
194
+ "corregir el trabajo del plugin."
195
+
196
+ #: admin/pages/cyrlitera.php:257
197
+ msgid "Rollback changes"
198
+ msgstr "Revertir cambios"
199
+
200
+ #: admin/pages/cyrlitera.php:259
201
+ msgid "The rollback of new changes was successful!"
202
+ msgstr "¡La reversión de nuevos cambios fue exitosa!"
203
+
204
+ #: cyrlitera.php:85
205
+ msgid "Webcraftic Cyrlitera"
206
+ msgstr "Webcraftic Cyrlitera"
components/cyrlitera/languages/cyrlitera-ru_RU.mo CHANGED
Binary file
components/cyrlitera/languages/cyrlitera-ru_RU.po CHANGED
@@ -1,618 +1,618 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: clearfy\n"
4
- "POT-Creation-Date: 2018-10-16 22:49+0300\n"
5
- "PO-Revision-Date: 2018-10-16 22:49+0300\n"
6
- "Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
7
- "Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
8
- "Language: ru_RU\n"
9
- "MIME-Version: 1.0\n"
10
- "Content-Type: text/plain; charset=UTF-8\n"
11
- "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 2.1.1\n"
13
- "X-Poedit-Basepath: ..\n"
14
- "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15
- "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
16
- "X-Poedit-SourceCharset: UTF-8\n"
17
- "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
18
- "X-Poedit-SearchPath-0: .\n"
19
- "X-Poedit-SearchPathExcluded-0: libs\n"
20
-
21
- #: admin/boot.php:56
22
- #, php-format
23
- msgid ""
24
- "We found that you have the plugin %s installed. The functions of this plugin "
25
- "already exist in %s. Please deactivate plugin %s to avoid conflicts between "
26
- "plugins functions."
27
- msgstr ""
28
- "Мы обнаружили, что у вас установлен плагин %s, функции этого плагина уже "
29
- "есть в %s. Пожалуйста, деактивируйте плагин %s во избежание конфликтов между "
30
- "функциями плагинов."
31
-
32
- #: admin/boot.php:57
33
- #, php-format
34
- msgid ""
35
- "If you do not want to deactivate the plugin %s for some reason, we strongly "
36
- "recommend do not use the same plugins functions at the same time!"
37
- msgstr ""
38
- "Если по какой-то причине вы не хотите деактивировать плагин %s, то мы "
39
- "настоятельно рекомендуем не использовать похожие функции плагинов "
40
- "одновременно!"
41
-
42
- #: admin/boot.php:117 admin/pages/cyrlitera.php:118
43
- msgid "Use transliteration"
44
- msgstr "Использовать транслитерацию"
45
-
46
- #: admin/boot.php:123 admin/pages/cyrlitera.php:136
47
- msgid "Force transliteration"
48
- msgstr "Принудильная траслитерация"
49
-
50
- #: admin/boot.php:129 admin/pages/cyrlitera.php:165
51
- msgid "Don't use transliteration in frontend"
52
- msgstr "Не использовать транслитерацию на фронтенде"
53
-
54
- #: admin/boot.php:135 admin/pages/cyrlitera.php:127
55
- msgid "Convert file names"
56
- msgstr "Конвертировать имена файлов"
57
-
58
- #: admin/boot.php:141 admin/pages/cyrlitera.php:145
59
- msgid "Convert file names into lowercase"
60
- msgstr "Преобразовывать имена файлов в нижний регистр"
61
-
62
- #: admin/boot.php:147 admin/pages/cyrlitera.php:155
63
- msgid "Redirection old URLs to new ones"
64
- msgstr "Перенаправление со старых URL на новые"
65
-
66
- #: admin/boot.php:153 admin/pages/cyrlitera.php:175
67
- msgid "Character Sets"
68
- msgstr "Наборы символов"
69
-
70
- #: admin/boot.php:174
71
- msgid "Get ultimate plugin free"
72
- msgstr "Получите полную версию плагина бесплатно"
73
-
74
- #: admin/pages/cyrlitera.php:39 admin/pages/cyrlitera.php:57
75
- msgid "Transliteration"
76
- msgstr "Транслитерация"
77
-
78
- #: admin/pages/cyrlitera.php:57
79
- msgid "General"
80
- msgstr "Основные"
81
-
82
- #: admin/pages/cyrlitera.php:111
83
- msgid "Transliteration of Cyrillic alphabet."
84
- msgstr "Транслитерация кириллицы."
85
-
86
- #: admin/pages/cyrlitera.php:111
87
- msgid ""
88
- "Converts Cyrillic permalinks of post, pages, taxonomies and media files to "
89
- "the Latin alphabet. Supports Russian, Ukrainian, Georgian, Bulgarian "
90
- "languages. Example: http://site.dev/последние-новости -> http://site.dev/"
91
- "poslednie-novosti"
92
- msgstr ""
93
- "Конвертирует кириллические постоянные ссылки записей, страниц, таксономий и "
94
- "медиафайлов в латиницу. Поддерживает Русский, Украинский, Грузинский, "
95
- "Болгарский языки. Пример: http://site.dev/последние-новости -> http://site."
96
- "dev/poslednie-novosti"
97
-
98
- #: admin/pages/cyrlitera.php:120
99
- msgid ""
100
- "If you enable this option, all URLs of new pages, posts, tags, and "
101
- "categories will automatically be converted to Latin."
102
- msgstr ""
103
- "Если включить эту опцию, все URL новых страниц, записей, меток, рубрик будут "
104
- "автоматически конвертироваться в латиницу."
105
-
106
- #: admin/pages/cyrlitera.php:129
107
- msgid ""
108
- "This option works only for new media library files. All Cyrillic names of "
109
- "the downloaded files will be converted to names with Latin characters."
110
- msgstr ""
111
- "Эта опция работает только для новых файлов медиа библиотеки. Все "
112
- "кириллические имена загружаемых файлов, будут преобразованы в имена с "
113
- "латинскими символами."
114
-
115
- #: admin/pages/cyrlitera.php:138
116
- #, php-format
117
- msgid ""
118
- "If any of your plugins affects transliteration of links and file names, you "
119
- "can use this option to change the plugin of %s to overwrite the changes of "
120
- "the other plugins."
121
- msgstr ""
122
- "Если какой-то из установленных у вас плагинов влияет на траслитерацию "
123
- "постоянный ссылок и файловых имен, включите эту опцию, чтобы %s "
124
- "перезаписывал изменения других плагинов."
125
-
126
- #: admin/pages/cyrlitera.php:147
127
- msgid ""
128
- "This function works only for new upload files. Example: File_Name.jpg -> "
129
- "file_name.jpg"
130
- msgstr ""
131
- "Эта функция работает только для новых загружаемых файлов. Пример: File_Name."
132
- "jpg -> file_name.jpg"
133
-
134
- #: admin/pages/cyrlitera.php:157
135
- msgid ""
136
- "If at the time of the plugin installation you had pages with unconverted "
137
- "links, use this option to redirect users from old to new URLs with the Latin "
138
- "alphabet."
139
- msgstr ""
140
- "Если на момент установки плагина у вас были страницы с не преобразованными "
141
- "ссылками, используйте эту опцию, чтобы пользователи, перешедшие по старым "
142
- "ссылкам, были перенаправлены на новые URL на латинице."
143
-
144
- #: admin/pages/cyrlitera.php:167
145
- msgid "Enable when have a problem in frontend."
146
- msgstr "Включите эту опцию, если у вас есть проблемы с внешней стороны сайта."
147
-
148
- #: admin/pages/cyrlitera.php:176
149
- msgid ""
150
- "You can supplement current base of transliteration characters. Write pairs "
151
- "of values separated by commas. Example:"
152
- msgstr ""
153
- "Вы можете дополнить текущую базу символов транслитерации, пишите пары "
154
- "значений через запятую. Пример: "
155
-
156
- #: admin/pages/cyrlitera.php:242
157
- msgid ""
158
- "If at the time of the plugin installation you already had posts, pages, tags "
159
- "and categories, click on this button and the plugin will automatically "
160
- "convert URLs into Latin. Attention! Previously uploaded files will not be "
161
- "converted."
162
- msgstr ""
163
- "Если на момент установки плагина у вас уже были созданы записи, страницы, "
164
- "метки и рубрики, то нажмите на эту кнопку и плагин автоматически преобразует "
165
- "URLы в латинские. Внимание! Ранее загруженные файлы преобразованы не будут."
166
-
167
- #: admin/pages/cyrlitera.php:251
168
- msgid "Convert already created posts and categories"
169
- msgstr "Преобразовать уже созданные записи и рубрики"
170
-
171
- #: admin/pages/cyrlitera.php:253
172
- msgid "Url of old posts, pages,terms,tags successfully converted into Latin!"
173
- msgstr ""
174
- "Url старых записей, страниц, тегов и рубрик были успешно конвертированы в "
175
- "литинские!"
176
-
177
- #: admin/pages/cyrlitera.php:263
178
- msgid ""
179
- "Allows you to restore converted URLs by using the \"Convert already created "
180
- "posts and categories\" button. This can be useful in case of incorrect URLs "
181
- "or incorrect transliteration of some characters. You can roll back changes "
182
- "and advance the character sets above to correct the plugin's work. "
183
- msgstr ""
184
- "Позволяет восстановить преобразованные с помощью кнопки “Преобразовать уже "
185
- "созданные записи и рубрики” URLы. Это может быть полезно в случае появления "
186
- "некорректных URL адресов или неправильной транслитерации определенных "
187
- "символов. У вас есть возможность откатить изменения и изменить наборы "
188
- "символов выше, чтобы скорректировать работу плагина."
189
-
190
- #: admin/pages/cyrlitera.php:272
191
- msgid "Rollback changes"
192
- msgstr "Откатить изменения"
193
-
194
- #: admin/pages/cyrlitera.php:274
195
- msgid "The rollback of new changes was successful!"
196
- msgstr "Откат новых изменений прошел успешно!"
197
-
198
- #: cyrlitera.php:63
199
- msgid "Webcraftic Cyrlitera"
200
- msgstr "Webcraftic Cyrlitera"
201
-
202
- #~ msgid ""
203
- #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
204
- #~ "installed, this plugin already has disable comments functions, so you can "
205
- #~ "deactivate plugin \"Webcraftic Cyrlitera\"!"
206
- #~ msgstr ""
207
- #~ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить "
208
- #~ "неиспользуемые функции», этот плагин уже имеет функции отключения "
209
- #~ "комментариев, поэтому вы можете отключить плагин «Webcraftic Cyrlitera»!"
210
-
211
- #~ msgid ""
212
- #~ "You can supplement current base of transliteration characters. Write "
213
- #~ "pairs of values in lower case separated by commas. Example:"
214
- #~ msgstr ""
215
- #~ "Вы можете дополнить текущую базу символов транслитерации, пишите пары "
216
- #~ "значений в нижнем регистре через запятую. Пример: ა=a,ბ=b"
217
-
218
- #~ msgid ""
219
- #~ "If any of your plugins affects transliteration of links, you can use this "
220
- #~ "option to change the plugin of %s to overwrite the changes of the other "
221
- #~ "plugins."
222
- #~ msgstr ""
223
- #~ "Если какой-то из установленных у вас плагинов влияет на траслитерацию "
224
- #~ "постоянный ссылок, включите эту опцию, чтобы %s перезаписывал изменения "
225
- #~ "других плагинов."
226
-
227
- #~ msgid ""
228
- #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
229
- #~ "installed, this plugin already has disable comments functions, so you can "
230
- #~ "deactivate plugin \"Cyrilic transliteration\"!"
231
- #~ msgstr ""
232
- #~ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить "
233
- #~ "неиспользуемые функции», этот плагин уже имеет функции отключения "
234
- #~ "комментариев, поэтому вы можете отключить плагин «Транслитерация "
235
- #~ "кириллицы»!"
236
-
237
- #~ msgid "Webcraftic cyrilic transliteration"
238
- #~ msgstr "Webcraftic транслитерация кириллицы"
239
-
240
- #~ msgid ""
241
- #~ "If you enable this option, the permanent URLs of all previously published "
242
- #~ "posts and pages will be converted into URLs with Latin characters. All "
243
- #~ "new pages and posts will also have a URL in the Latin alphabet."
244
- #~ msgstr ""
245
- #~ "Если включить эту опцию, постоянные URL всех ранее опубликованных записей "
246
- #~ "и страниц будут преобразованы в URL с латинскими символами. Все новые "
247
- #~ "страницы и записи, также будут иметь URL на латинице."
248
-
249
- #~ msgid "You don't have enough capability to edit this information."
250
- #~ msgstr "Вы не имеете разрешения на редактирование этого!"
251
-
252
- #~ msgid "Undefinded notice id."
253
- #~ msgstr "Не передан notice id."
254
-
255
- #~ msgid "Success"
256
- #~ msgstr "Успешно"
257
-
258
- #~ msgid "Hide admin notices"
259
- #~ msgstr "Скрыть уведомления"
260
-
261
- #~ msgid "Enable hidden notices in adminbar"
262
- #~ msgstr "Включить уведомления в админбаре"
263
-
264
- #~ msgid "Admin notifications, Update nags"
265
- #~ msgstr "Уведомления администратора, уведомления об обновлении Wordpress"
266
-
267
- #~ msgid ""
268
- #~ "Do you know the situation, when some plugin offers you to update to "
269
- #~ "premium, to collect technical data and shows many annoying notices? You "
270
- #~ "are close these notices every now and again but they newly appears and "
271
- #~ "interfere your work with WordPress. Even worse, some plugin’s authors "
272
- #~ "delete “close” button from notices and they shows in your admin panel "
273
- #~ "forever."
274
- #~ msgstr ""
275
- #~ "Вам знакома ситуация, когда какой-то плагин просит вас обновиться до "
276
- #~ "премиум-версии, получить права на сбор данных о вашем сайте и создает "
277
- #~ "много раздражающих уведомлений? Вы закрываете эти уведомления раз за "
278
- #~ "разом, но они вновь появляются и мешают вашей работе с WordPress. Хуже "
279
- #~ "того, некоторые авторы и вовсе удаляют кнопку “закрыть” из уведомлений, и "
280
- #~ "они висят в шапке вашей панели администратора целую вечность."
281
-
282
- #~ msgid "All notices"
283
- #~ msgstr "Все уведомления"
284
-
285
- #~ msgid "Hide all notices globally."
286
- #~ msgstr "Скрыть все уведомления глобально."
287
-
288
- #~ msgid "Only selected"
289
- #~ msgstr "Только выбранные"
290
-
291
- #~ msgid ""
292
- #~ "Hide selected notices only. You will see the link \"Hide notification "
293
- #~ "forever\" in each notice. Push it and they will not bother you anymore."
294
- #~ msgstr ""
295
- #~ "Скрывать только выбранные уведомления. В каждом уведомлении вы увидите "
296
- #~ "ссылку \"Скрыть уведомление навсегда\". Нажмите на неё и уведомление "
297
- #~ "будет скрыто навсегда и перестанет вас беспокоить."
298
-
299
- #~ msgid "Don't nide"
300
- #~ msgstr "Не скрывать"
301
-
302
- #~ msgid ""
303
- #~ "Do not hide notices and do not show “Hide notification forever” link for "
304
- #~ "admin."
305
- #~ msgstr ""
306
- #~ "Не скрывать уведомления и не показывать ссылку \"Скрыть уведомление "
307
- #~ "навсегда\" в уведомлениях администратора."
308
-
309
- #~ msgid ""
310
- #~ "Some plugins shows notifications about premium version, data collecting "
311
- #~ "or promote their services. Even if you push close button (that sometimes "
312
- #~ "are impossible), notices are shows again in some time. This option allows "
313
- #~ "you to control notices. Hide them all or each individually. Some plugins "
314
- #~ "shows notifications about premium version, data collecting or promote "
315
- #~ "their services. Even if you push close button (that sometimes are "
316
- #~ "impossible), notices are shows again in some time. This option allows you "
317
- #~ "to control notices. Hide them all or each individually."
318
- #~ msgstr ""
319
- #~ "Зачастую, плагины отображают уведомления о возможности перехода на "
320
- #~ "премиум версию, просят разрешение на сбор данных, рекламируют свои "
321
- #~ "услуги. Даже если вы нажмете кнопку закрыть (что не всегда возможно), "
322
- #~ "уведомления всё равно отобразятся через какое-то время. С помощью этой "
323
- #~ "настройки, вы можете контролировать эти уведомления. Скройте их все сразу "
324
- #~ "или каждое по отдельности."
325
-
326
- #~ msgid ""
327
- #~ "By default, the plugin hides all notices, which you specified. If you "
328
- #~ "enable this option, the plugin will collect all hidden notices and show "
329
- #~ "them into the top admin toolbar. It will not disturb you but will allow "
330
- #~ "to look notices at your convenience."
331
- #~ msgstr ""
332
- #~ "По умолчанию, плагин полностью скрывает отключенные вами уведомления. "
333
- #~ "Если включить эту опцию, то плагин будет собирать все скрытые вами "
334
- #~ "уведомления и выводить в верхней панели администратора. Это не будет вас "
335
- #~ "раздражать, но и позволит просматривать уведомления, когда вам это удобно."
336
-
337
- #~ msgid "Push reset hidden notices if you need to show hidden notices again."
338
- #~ msgstr "Нажмите кнопку \\\"Сбросить скрытые уведомления\\\""
339
-
340
- #~ msgid "Reset hidden notices (%s)"
341
- #~ msgstr "Сбросить скрытые уведомления (%s)"
342
-
343
- #~ msgid "Hidden notices are successfully reset, now you can see them again!"
344
- #~ msgstr ""
345
- #~ "Скрытые уведомления успешно восстановлены, теперь вы можете снова видеть "
346
- #~ "их!"
347
-
348
- #~ msgid "Notices"
349
- #~ msgstr "Уведомления"
350
-
351
- #~ msgid ""
352
- #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
353
- #~ "installed, this plugin already has disable comments functions, so you can "
354
- #~ "deactivate plugin \"Disable admin notices\"!"
355
- #~ msgstr ""
356
- #~ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить "
357
- #~ "неиспользуемые функции», этот плагин уже имеет функции отключения "
358
- #~ "комментариев, поэтому вы можете отключить плагин «Скрыть уведомления "
359
- #~ "администратора»!"
360
-
361
- #~ msgid "Webcraftic disable admin notices"
362
- #~ msgstr "Webcraftic отключить уведомления администратора"
363
-
364
- #~ msgid "Notifications %s"
365
- #~ msgstr "Уведомления %s"
366
-
367
- #~ msgid "Restore notice"
368
- #~ msgstr "Восстановить уведомление"
369
-
370
- #~ msgid "Hide notification forever"
371
- #~ msgstr "Скрыть уведомление навсегда"
372
-
373
- #~ msgid "Hidden notices"
374
- #~ msgstr "Скрытые уведомления"
375
-
376
- #~ msgid "Disable comments on the entire site"
377
- #~ msgstr "Отключить комментарии на всем сайте"
378
-
379
- #~ msgid "Select post types"
380
- #~ msgstr "Выбрать тип записи"
381
-
382
- #~ msgid "Replace external links in comments on the JavaScript code"
383
- #~ msgstr "Заменить внешние ссылки в комментариях на JavaScript код"
384
-
385
- #~ msgid "Replace external links from comment authors on the JavaScript code"
386
- #~ msgstr "Заменить внешние ссылки от авторов комментариев на код JavaScript"
387
-
388
- #~ msgid "Disable X-Pingback"
389
- #~ msgstr "Убрать ссылку на X-Pingback и возможность спамить pingback-ами"
390
-
391
- #~ msgid "Remove field \"site\" in comment form"
392
- #~ msgstr "Удаляет поле \"Сайт\" в форме комментариев"
393
-
394
- #~ msgid "Disable all comments"
395
- #~ msgstr "Отключить все комментарии"
396
-
397
- #~ msgid "Comments"
398
- #~ msgstr "Комментарии"
399
-
400
- #~ msgid ""
401
- #~ "Hide selected notices only. You will see the link \"Hide notification "
402
- #~ "forever\" in each notice. Push it and they will not bother you anymore. "
403
- #~ "Push <a href=\"%s\">reset hidden notices (%d)</a> if you need to show "
404
- #~ "hidden notices again."
405
- #~ msgstr ""
406
- #~ "Скрывать только выбранные уведомления. В каждом уведомлении вы увидите "
407
- #~ "ссылку \"Скрыть уведомление навсегда\". Нажмите на неё и уведомление "
408
- #~ "будет скрыто навсегда и перестанет вас беспокоить. Нажмите <a href=\"%s"
409
- #~ "\">сбросить скрытые уведомления (%d)</a>, если вам нужно восстановить "
410
- #~ "показ скрытых ранее уведомлений."
411
-
412
- #~ msgid "Webcraftic hide admin notices"
413
- #~ msgstr "Webcraftic скрыть уведомления администратора"
414
-
415
- #~ msgid "Comments tweaks"
416
- #~ msgstr "Инструменты комментариев"
417
-
418
- #~ msgid "All comments have been deleted."
419
- #~ msgstr "Все комментарии были удалены."
420
-
421
- #~ msgid ""
422
- #~ "An error occurred while trying to delete comments. Internal error "
423
- #~ "occured. Please try again later."
424
- #~ msgstr ""
425
- #~ "При попытке удалить комментарии произошла ошибка. Пожалуйста, повторите "
426
- #~ "попытку позже."
427
-
428
- #~ msgid "You are not allowed to view this page."
429
- #~ msgstr "Вам не разрешено просматривать эту страницу."
430
-
431
- #~ msgid "You do not have the selected post types!"
432
- #~ msgstr "Вы не выбрали еще ни одного типа записей!"
433
-
434
- #~ msgid "No comments available for deletion."
435
- #~ msgstr "Нет комментариев для удаления."
436
-
437
- #~ msgid ""
438
- #~ "Are you sure that you desire to delete all comments from the database?"
439
- #~ msgstr "Вы уверены, что хотите удалить все комментарии из базы данных?"
440
-
441
- #~ msgid ""
442
- #~ "Deleting comments will remove existing comment entries in the database "
443
- #~ "and cannot be reverted without a database backup."
444
- #~ msgstr ""
445
- #~ "При удалении комментариев удаляются существующие записи комментариев в "
446
- #~ "базе данных, они не могут быть восстановлены без резервного копирования "
447
- #~ "базы данных."
448
-
449
- #~ msgid "You have %s comments"
450
- #~ msgstr "У вас есть %s комментариев"
451
-
452
- #~ msgid "Yes, I'm sure"
453
- #~ msgstr "Да, я уверен"
454
-
455
- #~ msgid "No, return back"
456
- #~ msgstr "Нет, вернуться"
457
-
458
- #~ msgid ""
459
- #~ "Are you sure that you desire to delete all comments from the database for "
460
- #~ "the selected post types (%s)?"
461
- #~ msgstr ""
462
- #~ "Вы уверены, что хотите удалить все комментарии из базы данных для "
463
- #~ "выбранных типов записей (%s)?"
464
-
465
- #~ msgid "Disable comments"
466
- #~ msgstr "Отключить комментарии"
467
-
468
- #~ msgid "Not disable"
469
- #~ msgstr "Не отключать"
470
-
471
- #~ msgid "Everywhere"
472
- #~ msgstr "Повсюду"
473
-
474
- #~ msgid ""
475
- #~ "You can delete all comments in the database by clicking on this link (<a "
476
- #~ "href=\"%s\">cleaning comments in database</a>)."
477
- #~ msgstr ""
478
- #~ "Вы можете удалить все комментарии в базе данных, нажав на эту ссылку ( <a "
479
- #~ "href=\"%s\">очистка комментариев в базе данных</a> )."
480
-
481
- #~ msgid "On certain post types"
482
- #~ msgstr "Только выбранные типы записей"
483
-
484
- #~ msgid ""
485
- #~ "You can delete all comments for the selected post types. Select the post "
486
- #~ "types below and save the settings. After that, click the link (<a href="
487
- #~ "\"%s\">delete all comments for the selected post types in database</a>)."
488
- #~ msgstr ""
489
- #~ "Вы можете удалить все комментарии для выбранных типов записей. Выберите "
490
- #~ "типы записей ниже и сохраните настройки. После этого нажмите ссылку ( <a "
491
- #~ "href=\"%s\">удалите все комментарии для выбранных типов записей в базе "
492
- #~ "данных</a> )."
493
-
494
- #~ msgid ""
495
- #~ "Everywhere - Warning: This option is global and will affect your entire "
496
- #~ "site. Use it only if you want to disable comments everywhere. A complete "
497
- #~ "description of what this option does is available here"
498
- #~ msgstr ""
499
- #~ "Повсюду - предупреждение: этот параметр является глобальным и повлияет на "
500
- #~ "весь ваш сайт. Используйте его только в том случае, если вы хотите "
501
- #~ "отключить комментарии повсюду. "
502
-
503
- #~ msgid ""
504
- #~ "On certain post types - Disabling comments will also disable trackbacks "
505
- #~ "and pingbacks. All comment-related fields will also be hidden from the "
506
- #~ "edit/quick-edit screens of the affected posts. These settings cannot be "
507
- #~ "overridden for individual posts."
508
- #~ msgstr ""
509
- #~ "В некоторых типах сообщений - отключение комментариев также отключает "
510
- #~ "трекбэки и pingback. Все поля, связанные с комментариями, также будут "
511
- #~ "скрыты от экранов редактирования / быстрого редактирования затронутых "
512
- #~ "сообщений. Эти настройки нельзя переопределять для отдельных сообщений."
513
-
514
- #~ msgid "Select the post types for which comments will be disabled"
515
- #~ msgstr "Выберите типы записей, для которых комментарии будут отключены."
516
-
517
- #~ msgid ""
518
- #~ "Tired of spam in the comments? Do visitors leave \"blank\" comments for "
519
- #~ "the sake of a link to their site?"
520
- #~ msgstr ""
521
- #~ "Надоел спам в комментариях? Посетители оставляют «пустые» комментарии "
522
- #~ "ради ссылки на свой сайт?"
523
-
524
- #~ msgid "Removes the \"Site\" field from the comment form."
525
- #~ msgstr "Убирает поле «Сайт» из формы комментирования."
526
-
527
- #~ msgid ""
528
- #~ "Works with the standard comment form, if the form is manually written in "
529
- #~ "your theme-it probably will not work!"
530
- #~ msgstr ""
531
- #~ "Работает со стандартной формой комментирования, если в Вашей теме форма "
532
- #~ "прописана вручную - скорей всего не сработает!"
533
-
534
- #~ msgid "Recommended"
535
- #~ msgstr "Рекомендовано"
536
-
537
- #~ msgid ""
538
- #~ "Superfluous external links from comments, which can be typed from a dozen "
539
- #~ "and more for one article, do not bring anything good for promotion."
540
- #~ msgstr ""
541
- #~ "Внешние ссылки в комментариях, которых может быть десятки или больше на "
542
- #~ "одной странице, могут ухудшить продвижение вашего сайта."
543
-
544
- #~ msgid "Replaces the links of this kind of %s, on links of this kind %s"
545
- #~ msgstr ""
546
- #~ "Заменяет ссылки %s, на span тег и устанавливает переход с помощью "
547
- #~ "JavaScript %s"
548
-
549
- #~ msgid ""
550
- #~ "Up to 90 percent of comments in the blog can be left for the sake of an "
551
- #~ "external link. Even nofollow from page weight loss here does not help."
552
- #~ msgstr ""
553
- #~ "До 90 процентов комментариев в блоге оставляют ради внешней ссылки. Не "
554
- #~ "поможет даже nofollow от потери веса страницы."
555
-
556
- #~ msgid ""
557
- #~ "Replaces the links of the authors of comments on the JavaScript code, it "
558
- #~ "is impossible to distinguish it from usual links."
559
- #~ msgstr ""
560
- #~ "Заменяет ссылки авторов комментариев на JavaScript код, его невозможно "
561
- #~ "отличить от обычной ссылки."
562
-
563
- #~ msgid "In some Wordpress topics this may not work."
564
- #~ msgstr "В некоторых темах Wordpress это может не сработать."
565
-
566
- #~ msgid "Disable XML-RPC"
567
- #~ msgstr "Отключить XML-RPC"
568
-
569
- #~ msgid ""
570
- #~ "A pingback is basically an automated comment that gets created when "
571
- #~ "another blog links to you. A self-pingback is created when you link to an "
572
- #~ "article within your own blog. Pingbacks are essentially nothing more than "
573
- #~ "spam and simply waste resources."
574
- #~ msgstr ""
575
- #~ "Pingback по-существу автоматизированных комментарий, который создается, "
576
- #~ "когда другой блог ссылается на вас. Self-pingback создается, когда вы "
577
- #~ "оставили ссылку на статью в своем блоге. Pingbacks по существу являются "
578
- #~ "не более чем спам и пустая трата ресурсов вашего сайта."
579
-
580
- #~ msgid "Removes the server responses a reference to the xmlrpc file."
581
- #~ msgstr "Удаляет ссылку на xmlrpc-файл и ответ сервера."
582
-
583
- #~ msgid ""
584
- #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
585
- #~ "installed, this plugin already has disable comments functions, so you can "
586
- #~ "deactivate plugin \"Comments tweaks\"!"
587
- #~ msgstr ""
588
- #~ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить "
589
- #~ "неиспользуемые функции», этот плагин уже имеет функции отключения "
590
- #~ "комментариев, поэтому вы можете отключить плагин «Инструменты "
591
- #~ "комментариев»!"
592
-
593
- #~ msgid "Webcraftic comments tweaks"
594
- #~ msgstr "Webcraftic инструменты комментариев"
595
-
596
- #~ msgid "Comments are closed."
597
- #~ msgstr "Комментарии Закрыты."
598
-
599
- #~ msgid ""
600
- #~ "Note: The <em>%s</em> plugin is currently active, and comments are "
601
- #~ "completely disabled on: %s. Many of the settings below will not be "
602
- #~ "applicable for those post types."
603
- #~ msgstr ""
604
- #~ "Примечание. Плагин <em>%s</em> в настоящий момент активен, и комментарии "
605
- #~ "полностью отключены: %s. Многие из приведенных ниже настроек не будут "
606
- #~ "применяться для этих типов сообщений."
607
-
608
- #~ msgid ""
609
- #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
610
- #~ "installed, this plugin already has disable comments functions, so you can "
611
- #~ "deactivate plugin \"Disable comments\"!"
612
- #~ msgstr ""
613
- #~ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить "
614
- #~ "неиспользуемые функции», этот плагин уже имеет функции отключения "
615
- #~ "комментариев, поэтому вы можете отключить плагин «Отключить комментарии»!"
616
-
617
- #~ msgid "Webcraftic Disable comments"
618
- #~ msgstr "Webcraftic отключить комментарии"
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: clearfy\n"
4
+ "POT-Creation-Date: 2018-10-16 22:49+0300\n"
5
+ "PO-Revision-Date: 2018-12-22 16:06+0300\n"
6
+ "Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
7
+ "Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
8
+ "Language: ru_RU\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.1.1\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
16
+ "X-Poedit-SourceCharset: UTF-8\n"
17
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
18
+ "X-Poedit-SearchPath-0: .\n"
19
+ "X-Poedit-SearchPathExcluded-0: libs\n"
20
+
21
+ #: admin/boot.php:56
22
+ #, php-format
23
+ msgid ""
24
+ "We found that you have the plugin %s installed. The functions of this plugin "
25
+ "already exist in %s. Please deactivate plugin %s to avoid conflicts between "
26
+ "plugins functions."
27
+ msgstr ""
28
+ "Мы обнаружили, что у вас установлен плагин %s, функции этого плагина уже "
29
+ "есть в %s. Пожалуйста, деактивируйте плагин %s во избежание конфликтов между "
30
+ "функциями плагинов."
31
+
32
+ #: admin/boot.php:57
33
+ #, php-format
34
+ msgid ""
35
+ "If you do not want to deactivate the plugin %s for some reason, we strongly "
36
+ "recommend do not use the same plugins functions at the same time!"
37
+ msgstr ""
38
+ "Если по какой-то причине вы не хотите деактивировать плагин %s, то мы "
39
+ "настоятельно рекомендуем не использовать похожие функции плагинов "
40
+ "одновременно!"
41
+
42
+ #: admin/boot.php:117 admin/pages/cyrlitera.php:118
43
+ msgid "Use transliteration"
44
+ msgstr "Использовать транслитерацию"
45
+
46
+ #: admin/boot.php:123 admin/pages/cyrlitera.php:136
47
+ msgid "Force transliteration"
48
+ msgstr "Принудильная траслитерация"
49
+
50
+ #: admin/boot.php:129 admin/pages/cyrlitera.php:165
51
+ msgid "Don't use transliteration in frontend"
52
+ msgstr "Не использовать транслитерацию на фронтенде"
53
+
54
+ #: admin/boot.php:135 admin/pages/cyrlitera.php:127
55
+ msgid "Convert file names"
56
+ msgstr "Конвертировать имена файлов"
57
+
58
+ #: admin/boot.php:141 admin/pages/cyrlitera.php:145
59
+ msgid "Convert file names into lowercase"
60
+ msgstr "Преобразовывать имена файлов в нижний регистр"
61
+
62
+ #: admin/boot.php:147 admin/pages/cyrlitera.php:155
63
+ msgid "Redirection old URLs to new ones"
64
+ msgstr "Перенаправление со старых URL на новые"
65
+
66
+ #: admin/boot.php:153 admin/pages/cyrlitera.php:175
67
+ msgid "Character Sets"
68
+ msgstr "Наборы символов"
69
+
70
+ #: admin/boot.php:174
71
+ msgid "Get ultimate plugin free"
72
+ msgstr "Получите полную версию плагина бесплатно"
73
+
74
+ #: admin/pages/cyrlitera.php:39 admin/pages/cyrlitera.php:57
75
+ msgid "Transliteration"
76
+ msgstr "Транслитерация"
77
+
78
+ #: admin/pages/cyrlitera.php:57
79
+ msgid "General"
80
+ msgstr "Основные"
81
+
82
+ #: admin/pages/cyrlitera.php:111
83
+ msgid "Transliteration of Cyrillic alphabet."
84
+ msgstr "Транслитерация кириллицы."
85
+
86
+ #: admin/pages/cyrlitera.php:111
87
+ msgid ""
88
+ "Converts Cyrillic permalinks of post, pages, taxonomies and media files to "
89
+ "the Latin alphabet. Supports Russian, Ukrainian, Georgian, Bulgarian "
90
+ "languages. Example: http://site.dev/последние-новости -> http://site.dev/"
91
+ "poslednie-novosti"
92
+ msgstr ""
93
+ "Конвертирует кириллические постоянные ссылки записей, страниц, таксономий и "
94
+ "медиафайлов в латиницу. Поддерживает Русский, Украинский, Грузинский, "
95
+ "Болгарский языки. Пример: http://site.dev/последние-новости -> http://site."
96
+ "dev/poslednie-novosti"
97
+
98
+ #: admin/pages/cyrlitera.php:120
99
+ msgid ""
100
+ "If you enable this option, all URLs of new pages, posts, tags, and "
101
+ "categories will automatically be converted to Latin."
102
+ msgstr ""
103
+ "Если включить эту опцию, все URL новых страниц, записей, меток, рубрик будут "
104
+ "автоматически конвертироваться в латиницу."
105
+
106
+ #: admin/pages/cyrlitera.php:129
107
+ msgid ""
108
+ "This option works only for new media library files. All Cyrillic names of "
109
+ "the downloaded files will be converted to names with Latin characters."
110
+ msgstr ""
111
+ "Эта опция работает только для новых файлов медиа библиотеки. Все "
112
+ "кириллические имена загружаемых файлов, будут преобразованы в имена с "
113
+ "латинскими символами."
114
+
115
+ #: admin/pages/cyrlitera.php:138
116
+ #, php-format
117
+ msgid ""
118
+ "If any of your plugins affects transliteration of links and file names, you "
119
+ "can use this option to change the plugin of %s to overwrite the changes of "
120
+ "the other plugins."
121
+ msgstr ""
122
+ "Если какой-то из установленных у вас плагинов влияет на траслитерацию "
123
+ "постоянных ссылок и файловых имен, включите эту опцию, чтобы %s "
124
+ "перезаписывал изменения других плагинов."
125
+
126
+ #: admin/pages/cyrlitera.php:147
127
+ msgid ""
128
+ "This function works only for new upload files. Example: File_Name.jpg -> "
129
+ "file_name.jpg"
130
+ msgstr ""
131
+ "Эта функция работает только для новых загружаемых файлов. Пример: File_Name."
132
+ "jpg -> file_name.jpg"
133
+
134
+ #: admin/pages/cyrlitera.php:157
135
+ msgid ""
136
+ "If at the time of the plugin installation you had pages with unconverted "
137
+ "links, use this option to redirect users from old to new URLs with the Latin "
138
+ "alphabet."
139
+ msgstr ""
140
+ "Если на момент установки плагина у вас были страницы с не преобразованными "
141
+ "ссылками, используйте эту опцию, чтобы пользователи, перешедшие по старым "
142
+ "ссылкам, были перенаправлены на новые URL на латинице."
143
+
144
+ #: admin/pages/cyrlitera.php:167
145
+ msgid "Enable when have a problem in frontend."
146
+ msgstr "Включите эту опцию, если у вас есть проблемы с внешней стороны сайта."
147
+
148
+ #: admin/pages/cyrlitera.php:176
149
+ msgid ""
150
+ "You can supplement current base of transliteration characters. Write pairs "
151
+ "of values separated by commas. Example:"
152
+ msgstr ""
153
+ "Вы можете дополнить текущую базу символов транслитерации, пишите пары "
154
+ "значений через запятую. Пример: "
155
+
156
+ #: admin/pages/cyrlitera.php:242
157
+ msgid ""
158
+ "If at the time of the plugin installation you already had posts, pages, tags "
159
+ "and categories, click on this button and the plugin will automatically "
160
+ "convert URLs into Latin. Attention! Previously uploaded files will not be "
161
+ "converted."
162
+ msgstr ""
163
+ "Если на момент установки плагина у вас уже были созданы записи, страницы, "
164
+ "метки и рубрики, то нажмите на эту кнопку и плагин автоматически преобразует "
165
+ "URLы в латинские. Внимание! Ранее загруженные файлы преобразованы не будут."
166
+
167
+ #: admin/pages/cyrlitera.php:251
168
+ msgid "Convert already created posts and categories"
169
+ msgstr "Преобразовать уже созданные записи и рубрики"
170
+
171
+ #: admin/pages/cyrlitera.php:253
172
+ msgid "Url of old posts, pages,terms,tags successfully converted into Latin!"
173
+ msgstr ""
174
+ "Url старых записей, страниц, тегов и рубрик были успешно конвертированы в "
175
+ "литинские!"
176
+
177
+ #: admin/pages/cyrlitera.php:263
178
+ msgid ""
179
+ "Allows you to restore converted URLs by using the \"Convert already created "
180
+ "posts and categories\" button. This can be useful in case of incorrect URLs "
181
+ "or incorrect transliteration of some characters. You can roll back changes "
182
+ "and advance the character sets above to correct the plugin's work. "
183
+ msgstr ""
184
+ "Позволяет восстановить преобразованные с помощью кнопки “Преобразовать уже "
185
+ "созданные записи и рубрики” URLы. Это может быть полезно в случае появления "
186
+ "некорректных URL адресов или неправильной транслитерации определенных "
187
+ "символов. У вас есть возможность откатить изменения и изменить наборы "
188
+ "символов выше, чтобы скорректировать работу плагина."
189
+
190
+ #: admin/pages/cyrlitera.php:272
191
+ msgid "Rollback changes"
192
+ msgstr "Откатить изменения"
193
+
194
+ #: admin/pages/cyrlitera.php:274
195
+ msgid "The rollback of new changes was successful!"
196
+ msgstr "Откат новых изменений прошел успешно!"
197
+
198
+ #: cyrlitera.php:63
199
+ msgid "Webcraftic Cyrlitera"
200
+ msgstr "Webcraftic Cyrlitera"
201
+
202
+ #~ msgid ""
203
+ #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
204
+ #~ "installed, this plugin already has disable comments functions, so you can "
205
+ #~ "deactivate plugin \"Webcraftic Cyrlitera\"!"
206
+ #~ msgstr ""
207
+ #~ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить "
208
+ #~ "неиспользуемые функции», этот плагин уже имеет функции отключения "
209
+ #~ "комментариев, поэтому вы можете отключить плагин «Webcraftic Cyrlitera»!"
210
+
211
+ #~ msgid ""
212
+ #~ "You can supplement current base of transliteration characters. Write "
213
+ #~ "pairs of values in lower case separated by commas. Example:"
214
+ #~ msgstr ""
215
+ #~ "Вы можете дополнить текущую базу символов транслитерации, пишите пары "
216
+ #~ "значений в нижнем регистре через запятую. Пример: ა=a,ბ=b"
217
+
218
+ #~ msgid ""
219
+ #~ "If any of your plugins affects transliteration of links, you can use this "
220
+ #~ "option to change the plugin of %s to overwrite the changes of the other "
221
+ #~ "plugins."
222
+ #~ msgstr ""
223
+ #~ "Если какой-то из установленных у вас плагинов влияет на траслитерацию "
224
+ #~ "постоянный ссылок, включите эту опцию, чтобы %s перезаписывал изменения "
225
+ #~ "других плагинов."
226
+
227
+ #~ msgid ""
228
+ #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
229
+ #~ "installed, this plugin already has disable comments functions, so you can "
230
+ #~ "deactivate plugin \"Cyrilic transliteration\"!"
231
+ #~ msgstr ""
232
+ #~ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить "
233
+ #~ "неиспользуемые функции», этот плагин уже имеет функции отключения "
234
+ #~ "комментариев, поэтому вы можете отключить плагин «Транслитерация "
235
+ #~ "кириллицы»!"
236
+
237
+ #~ msgid "Webcraftic cyrilic transliteration"
238
+ #~ msgstr "Webcraftic транслитерация кириллицы"
239
+
240
+ #~ msgid ""
241
+ #~ "If you enable this option, the permanent URLs of all previously published "
242
+ #~ "posts and pages will be converted into URLs with Latin characters. All "
243
+ #~ "new pages and posts will also have a URL in the Latin alphabet."
244
+ #~ msgstr ""
245
+ #~ "Если включить эту опцию, постоянные URL всех ранее опубликованных записей "
246
+ #~ "и страниц будут преобразованы в URL с латинскими символами. Все новые "
247
+ #~ "страницы и записи, также будут иметь URL на латинице."
248
+
249
+ #~ msgid "You don't have enough capability to edit this information."
250
+ #~ msgstr "Вы не имеете разрешения на редактирование этого!"
251
+
252
+ #~ msgid "Undefinded notice id."
253
+ #~ msgstr "Не передан notice id."
254
+
255
+ #~ msgid "Success"
256
+ #~ msgstr "Успешно"
257
+
258
+ #~ msgid "Hide admin notices"
259
+ #~ msgstr "Скрыть уведомления"
260
+
261
+ #~ msgid "Enable hidden notices in adminbar"
262
+ #~ msgstr "Включить уведомления в админбаре"
263
+
264
+ #~ msgid "Admin notifications, Update nags"
265
+ #~ msgstr "Уведомления администратора, уведомления об обновлении Wordpress"
266
+
267
+ #~ msgid ""
268
+ #~ "Do you know the situation, when some plugin offers you to update to "
269
+ #~ "premium, to collect technical data and shows many annoying notices? You "
270
+ #~ "are close these notices every now and again but they newly appears and "
271
+ #~ "interfere your work with WordPress. Even worse, some plugin’s authors "
272
+ #~ "delete “close” button from notices and they shows in your admin panel "
273
+ #~ "forever."
274
+ #~ msgstr ""
275
+ #~ "Вам знакома ситуация, когда какой-то плагин просит вас обновиться до "
276
+ #~ "премиум-версии, получить права на сбор данных о вашем сайте и создает "
277
+ #~ "много раздражающих уведомлений? Вы закрываете эти уведомления раз за "
278
+ #~ "разом, но они вновь появляются и мешают вашей работе с WordPress. Хуже "
279
+ #~ "того, некоторые авторы и вовсе удаляют кнопку “закрыть” из уведомлений, и "
280
+ #~ "они висят в шапке вашей панели администратора целую вечность."
281
+
282
+ #~ msgid "All notices"
283
+ #~ msgstr "Все уведомления"
284
+
285
+ #~ msgid "Hide all notices globally."
286
+ #~ msgstr "Скрыть все уведомления глобально."
287
+
288
+ #~ msgid "Only selected"
289
+ #~ msgstr "Только выбранные"
290
+
291
+ #~ msgid ""
292
+ #~ "Hide selected notices only. You will see the link \"Hide notification "
293
+ #~ "forever\" in each notice. Push it and they will not bother you anymore."
294
+ #~ msgstr ""
295
+ #~ "Скрывать только выбранные уведомления. В каждом уведомлении вы увидите "
296
+ #~ "ссылку \"Скрыть уведомление навсегда\". Нажмите на неё и уведомление "
297
+ #~ "будет скрыто навсегда и перестанет вас беспокоить."
298
+
299
+ #~ msgid "Don't nide"
300
+ #~ msgstr "Не скрывать"
301
+
302
+ #~ msgid ""
303
+ #~ "Do not hide notices and do not show “Hide notification forever” link for "
304
+ #~ "admin."
305
+ #~ msgstr ""
306
+ #~ "Не скрывать уведомления и не показывать ссылку \"Скрыть уведомление "
307
+ #~ "навсегда\" в уведомлениях администратора."
308
+
309
+ #~ msgid ""
310
+ #~ "Some plugins shows notifications about premium version, data collecting "
311
+ #~ "or promote their services. Even if you push close button (that sometimes "
312
+ #~ "are impossible), notices are shows again in some time. This option allows "
313
+ #~ "you to control notices. Hide them all or each individually. Some plugins "
314
+ #~ "shows notifications about premium version, data collecting or promote "
315
+ #~ "their services. Even if you push close button (that sometimes are "
316
+ #~ "impossible), notices are shows again in some time. This option allows you "
317
+ #~ "to control notices. Hide them all or each individually."
318
+ #~ msgstr ""
319
+ #~ "Зачастую, плагины отображают уведомления о возможности перехода на "
320
+ #~ "премиум версию, просят разрешение на сбор данных, рекламируют свои "
321
+ #~ "услуги. Даже если вы нажмете кнопку закрыть (что не всегда возможно), "
322
+ #~ "уведомления всё равно отобразятся через какое-то время. С помощью этой "
323
+ #~ "настройки, вы можете контролировать эти уведомления. Скройте их все сразу "
324
+ #~ "или каждое по отдельности."
325
+
326
+ #~ msgid ""
327
+ #~ "By default, the plugin hides all notices, which you specified. If you "
328
+ #~ "enable this option, the plugin will collect all hidden notices and show "
329
+ #~ "them into the top admin toolbar. It will not disturb you but will allow "
330
+ #~ "to look notices at your convenience."
331
+ #~ msgstr ""
332
+ #~ "По умолчанию, плагин полностью скрывает отключенные вами уведомления. "
333
+ #~ "Если включить эту опцию, то плагин будет собирать все скрытые вами "
334
+ #~ "уведомления и выводить в верхней панели администратора. Это не будет вас "
335
+ #~ "раздражать, но и позволит просматривать уведомления, когда вам это удобно."
336
+
337
+ #~ msgid "Push reset hidden notices if you need to show hidden notices again."
338
+ #~ msgstr "Нажмите кнопку \\\"Сбросить скрытые уведомления\\\""
339
+
340
+ #~ msgid "Reset hidden notices (%s)"
341
+ #~ msgstr "Сбросить скрытые уведомления (%s)"
342
+
343
+ #~ msgid "Hidden notices are successfully reset, now you can see them again!"
344
+ #~ msgstr ""
345
+ #~ "Скрытые уведомления успешно восстановлены, теперь вы можете снова видеть "
346
+ #~ "их!"
347
+
348
+ #~ msgid "Notices"
349
+ #~ msgstr "Уведомления"
350
+
351
+ #~ msgid ""
352
+ #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
353
+ #~ "installed, this plugin already has disable comments functions, so you can "
354
+ #~ "deactivate plugin \"Disable admin notices\"!"
355
+ #~ msgstr ""
356
+ #~ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить "
357
+ #~ "неиспользуемые функции», этот плагин уже имеет функции отключения "
358
+ #~ "комментариев, поэтому вы можете отключить плагин «Скрыть уведомления "
359
+ #~ "администратора»!"
360
+
361
+ #~ msgid "Webcraftic disable admin notices"
362
+ #~ msgstr "Webcraftic отключить уведомления администратора"
363
+
364
+ #~ msgid "Notifications %s"
365
+ #~ msgstr "Уведомления %s"
366
+
367
+ #~ msgid "Restore notice"
368
+ #~ msgstr "Восстановить уведомление"
369
+
370
+ #~ msgid "Hide notification forever"
371
+ #~ msgstr "Скрыть уведомление навсегда"
372
+
373
+ #~ msgid "Hidden notices"
374
+ #~ msgstr "Скрытые уведомления"
375
+
376
+ #~ msgid "Disable comments on the entire site"
377
+ #~ msgstr "Отключить комментарии на всем сайте"
378
+
379
+ #~ msgid "Select post types"
380
+ #~ msgstr "Выбрать тип записи"
381
+
382
+ #~ msgid "Replace external links in comments on the JavaScript code"
383
+ #~ msgstr "Заменить внешние ссылки в комментариях на JavaScript код"
384
+
385
+ #~ msgid "Replace external links from comment authors on the JavaScript code"
386
+ #~ msgstr "Заменить внешние ссылки от авторов комментариев на код JavaScript"
387
+
388
+ #~ msgid "Disable X-Pingback"
389
+ #~ msgstr "Убрать ссылку на X-Pingback и возможность спамить pingback-ами"
390
+
391
+ #~ msgid "Remove field \"site\" in comment form"
392
+ #~ msgstr "Удаляет поле \"Сайт\" в форме комментариев"
393
+
394
+ #~ msgid "Disable all comments"
395
+ #~ msgstr "Отключить все комментарии"
396
+
397
+ #~ msgid "Comments"
398
+ #~ msgstr "Комментарии"
399
+
400
+ #~ msgid ""
401
+ #~ "Hide selected notices only. You will see the link \"Hide notification "
402
+ #~ "forever\" in each notice. Push it and they will not bother you anymore. "
403
+ #~ "Push <a href=\"%s\">reset hidden notices (%d)</a> if you need to show "
404
+ #~ "hidden notices again."
405
+ #~ msgstr ""
406
+ #~ "Скрывать только выбранные уведомления. В каждом уведомлении вы увидите "
407
+ #~ "ссылку \"Скрыть уведомление навсегда\". Нажмите на неё и уведомление "
408
+ #~ "будет скрыто навсегда и перестанет вас беспокоить. Нажмите <a href=\"%s"
409
+ #~ "\">сбросить скрытые уведомления (%d)</a>, если вам нужно восстановить "
410
+ #~ "показ скрытых ранее уведомлений."
411
+
412
+ #~ msgid "Webcraftic hide admin notices"
413
+ #~ msgstr "Webcraftic скрыть уведомления администратора"
414
+
415
+ #~ msgid "Comments tweaks"
416
+ #~ msgstr "Инструменты комментариев"
417
+
418
+ #~ msgid "All comments have been deleted."
419
+ #~ msgstr "Все комментарии были удалены."
420
+
421
+ #~ msgid ""
422
+ #~ "An error occurred while trying to delete comments. Internal error "
423
+ #~ "occured. Please try again later."
424
+ #~ msgstr ""
425
+ #~ "При попытке удалить комментарии произошла ошибка. Пожалуйста, повторите "
426
+ #~ "попытку позже."
427
+
428
+ #~ msgid "You are not allowed to view this page."
429
+ #~ msgstr "Вам не разрешено просматривать эту страницу."
430
+
431
+ #~ msgid "You do not have the selected post types!"
432
+ #~ msgstr "Вы не выбрали еще ни одного типа записей!"
433
+
434
+ #~ msgid "No comments available for deletion."
435
+ #~ msgstr "Нет комментариев для удаления."
436
+
437
+ #~ msgid ""
438
+ #~ "Are you sure that you desire to delete all comments from the database?"
439
+ #~ msgstr "Вы уверены, что хотите удалить все комментарии из базы данных?"
440
+
441
+ #~ msgid ""
442
+ #~ "Deleting comments will remove existing comment entries in the database "
443
+ #~ "and cannot be reverted without a database backup."
444
+ #~ msgstr ""
445
+ #~ "При удалении комментариев удаляются существующие записи комментариев в "
446
+ #~ "базе данных, они не могут быть восстановлены без резервного копирования "
447
+ #~ "базы данных."
448
+
449
+ #~ msgid "You have %s comments"
450
+ #~ msgstr "У вас есть %s комментариев"
451
+
452
+ #~ msgid "Yes, I'm sure"
453
+ #~ msgstr "Да, я уверен"
454
+
455
+ #~ msgid "No, return back"
456
+ #~ msgstr "Нет, вернуться"
457
+
458
+ #~ msgid ""
459
+ #~ "Are you sure that you desire to delete all comments from the database for "
460
+ #~ "the selected post types (%s)?"
461
+ #~ msgstr ""
462
+ #~ "Вы уверены, что хотите удалить все комментарии из базы данных для "
463
+ #~ "выбранных типов записей (%s)?"
464
+
465
+ #~ msgid "Disable comments"
466
+ #~ msgstr "Отключить комментарии"
467
+
468
+ #~ msgid "Not disable"
469
+ #~ msgstr "Не отключать"
470
+
471
+ #~ msgid "Everywhere"
472
+ #~ msgstr "Повсюду"
473
+
474
+ #~ msgid ""
475
+ #~ "You can delete all comments in the database by clicking on this link (<a "
476
+ #~ "href=\"%s\">cleaning comments in database</a>)."
477
+ #~ msgstr ""
478
+ #~ "Вы можете удалить все комментарии в базе данных, нажав на эту ссылку ( <a "
479
+ #~ "href=\"%s\">очистка комментариев в базе данных</a> )."
480
+
481
+ #~ msgid "On certain post types"
482
+ #~ msgstr "Только выбранные типы записей"
483
+
484
+ #~ msgid ""
485
+ #~ "You can delete all comments for the selected post types. Select the post "
486
+ #~ "types below and save the settings. After that, click the link (<a href="
487
+ #~ "\"%s\">delete all comments for the selected post types in database</a>)."
488
+ #~ msgstr ""
489
+ #~ "Вы можете удалить все комментарии для выбранных типов записей. Выберите "
490
+ #~ "типы записей ниже и сохраните настройки. После этого нажмите ссылку ( <a "
491
+ #~ "href=\"%s\">удалите все комментарии для выбранных типов записей в базе "
492
+ #~ "данных</a> )."
493
+
494
+ #~ msgid ""
495
+ #~ "Everywhere - Warning: This option is global and will affect your entire "
496
+ #~ "site. Use it only if you want to disable comments everywhere. A complete "
497
+ #~ "description of what this option does is available here"
498
+ #~ msgstr ""
499
+ #~ "Повсюду - предупреждение: этот параметр является глобальным и повлияет на "
500
+ #~ "весь ваш сайт. Используйте его только в том случае, если вы хотите "
501
+ #~ "отключить комментарии повсюду. "
502
+
503
+ #~ msgid ""
504
+ #~ "On certain post types - Disabling comments will also disable trackbacks "
505
+ #~ "and pingbacks. All comment-related fields will also be hidden from the "
506
+ #~ "edit/quick-edit screens of the affected posts. These settings cannot be "
507
+ #~ "overridden for individual posts."
508
+ #~ msgstr ""
509
+ #~ "В некоторых типах сообщений - отключение комментариев также отключает "
510
+ #~ "трекбэки и pingback. Все поля, связанные с комментариями, также будут "
511
+ #~ "скрыты от экранов редактирования / быстрого редактирования затронутых "
512
+ #~ "сообщений. Эти настройки нельзя переопределять для отдельных сообщений."
513
+
514
+ #~ msgid "Select the post types for which comments will be disabled"
515
+ #~ msgstr "Выберите типы записей, для которых комментарии будут отключены."
516
+
517
+ #~ msgid ""
518
+ #~ "Tired of spam in the comments? Do visitors leave \"blank\" comments for "
519
+ #~ "the sake of a link to their site?"
520
+ #~ msgstr ""
521
+ #~ "Надоел спам в комментариях? Посетители оставляют «пустые» комментарии "
522
+ #~ "ради ссылки на свой сайт?"
523
+
524
+ #~ msgid "Removes the \"Site\" field from the comment form."
525
+ #~ msgstr "Убирает поле «Сайт» из формы комментирования."
526
+
527
+ #~ msgid ""
528
+ #~ "Works with the standard comment form, if the form is manually written in "
529
+ #~ "your theme-it probably will not work!"
530
+ #~ msgstr ""
531
+ #~ "Работает со стандартной формой комментирования, если в Вашей теме форма "
532
+ #~ "прописана вручную - скорей всего не сработает!"
533
+
534
+ #~ msgid "Recommended"
535
+ #~ msgstr "Рекомендовано"
536
+
537
+ #~ msgid ""
538
+ #~ "Superfluous external links from comments, which can be typed from a dozen "
539
+ #~ "and more for one article, do not bring anything good for promotion."
540
+ #~ msgstr ""
541
+ #~ "Внешние ссылки в комментариях, которых может быть десятки или больше на "
542
+ #~ "одной странице, могут ухудшить продвижение вашего сайта."
543
+
544
+ #~ msgid "Replaces the links of this kind of %s, on links of this kind %s"
545
+ #~ msgstr ""
546
+ #~ "Заменяет ссылки %s, на span тег и устанавливает переход с помощью "
547
+ #~ "JavaScript %s"
548
+
549
+ #~ msgid ""
550
+ #~ "Up to 90 percent of comments in the blog can be left for the sake of an "
551
+ #~ "external link. Even nofollow from page weight loss here does not help."
552
+ #~ msgstr ""
553
+ #~ "До 90 процентов комментариев в блоге оставляют ради внешней ссылки. Не "
554
+ #~ "поможет даже nofollow от потери веса страницы."
555
+
556
+ #~ msgid ""
557
+ #~ "Replaces the links of the authors of comments on the JavaScript code, it "
558
+ #~ "is impossible to distinguish it from usual links."
559
+ #~ msgstr ""
560
+ #~ "Заменяет ссылки авторов комментариев на JavaScript код, его невозможно "
561
+ #~ "отличить от обычной ссылки."
562
+
563
+ #~ msgid "In some Wordpress topics this may not work."
564
+ #~ msgstr "В некоторых темах Wordpress это может не сработать."
565
+
566
+ #~ msgid "Disable XML-RPC"
567
+ #~ msgstr "Отключить XML-RPC"
568
+
569
+ #~ msgid ""
570
+ #~ "A pingback is basically an automated comment that gets created when "
571
+ #~ "another blog links to you. A self-pingback is created when you link to an "
572
+ #~ "article within your own blog. Pingbacks are essentially nothing more than "
573
+ #~ "spam and simply waste resources."
574
+ #~ msgstr ""
575
+ #~ "Pingback по-существу автоматизированных комментарий, который создается, "
576
+ #~ "когда другой блог ссылается на вас. Self-pingback создается, когда вы "
577
+ #~ "оставили ссылку на статью в своем блоге. Pingbacks по существу являются "
578
+ #~ "не более чем спам и пустая трата ресурсов вашего сайта."
579
+
580
+ #~ msgid "Removes the server responses a reference to the xmlrpc file."
581
+ #~ msgstr "Удаляет ссылку на xmlrpc-файл и ответ сервера."
582
+
583
+ #~ msgid ""
584
+ #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
585
+ #~ "installed, this plugin already has disable comments functions, so you can "
586
+ #~ "deactivate plugin \"Comments tweaks\"!"
587
+ #~ msgstr ""
588
+ #~ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить "
589
+ #~ "неиспользуемые функции», этот плагин уже имеет функции отключения "
590
+ #~ "комментариев, поэтому вы можете отключить плагин «Инструменты "
591
+ #~ "комментариев»!"
592
+
593
+ #~ msgid "Webcraftic comments tweaks"
594
+ #~ msgstr "Webcraftic инструменты комментариев"
595
+
596
+ #~ msgid "Comments are closed."
597
+ #~ msgstr "Комментарии Закрыты."
598
+
599
+ #~ msgid ""
600
+ #~ "Note: The <em>%s</em> plugin is currently active, and comments are "
601
+ #~ "completely disabled on: %s. Many of the settings below will not be "
602
+ #~ "applicable for those post types."
603
+ #~ msgstr ""
604
+ #~ "Примечание. Плагин <em>%s</em> в настоящий момент активен, и комментарии "
605
+ #~ "полностью отключены: %s. Многие из приведенных ниже настроек не будут "
606
+ #~ "применяться для этих типов сообщений."
607
+
608
+ #~ msgid ""
609
+ #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
610
+ #~ "installed, this plugin already has disable comments functions, so you can "
611
+ #~ "deactivate plugin \"Disable comments\"!"
612
+ #~ msgstr ""
613
+ #~ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить "
614
+ #~ "неиспользуемые функции», этот плагин уже имеет функции отключения "
615
+ #~ "комментариев, поэтому вы можете отключить плагин «Отключить комментарии»!"
616
+
617
+ #~ msgid "Webcraftic Disable comments"
618
+ #~ msgstr "Webcraftic отключить комментарии"
components/disable-admin-notices/disable-admin-notices.php CHANGED
@@ -1,73 +1,94 @@
1
  <?php
2
- /**
3
- * Plugin Name: Webcraftic Disable Admin Notices Individually
4
- * Plugin URI: https://wordpress.org/plugins/disable-admin-notices/
5
- * Description: Disable admin notices plugin gives you the option to hide updates warnings and inline notices in the admin panel.
6
- * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
- * Version: 1.0.6
8
- * Text Domain: disable-admin-notices
9
- * Domain Path: /languages/
10
- * Author URI: https://clearfy.pro
11
- * Framework Version: FACTORY_409_VERSION
12
- */
13
 
14
- // Exit if accessed directly
15
- if( !defined('ABSPATH') ) {
16
- exit;
17
- }
 
 
 
18
 
19
- define('WDN_PLUGIN_VERSION', '1.0.7');
 
 
 
 
 
 
20
 
21
- define('WDN_PLUGIN_DIR', dirname(__FILE__));
22
- define('WDN_PLUGIN_BASE', plugin_basename(__FILE__));
23
- define('WDN_PLUGIN_URL', plugins_url(null, __FILE__));
 
24
 
25
-
 
 
 
 
 
 
 
 
26
 
27
- if( !defined('LOADING_DISABLE_ADMIN_NOTICES_AS_ADDON') ) {
28
- require_once(WDN_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php');
29
- require_once(WDN_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php');
30
- }
31
 
32
- $plugin_info = array(
33
- 'prefix' => 'wbcr_dan_',
34
- 'plugin_name' => 'wbcr_dan',
35
- 'plugin_title' => __('Webcraftic disable admin notices', 'disable-admin-notices'),
36
- 'plugin_version' => WDN_PLUGIN_VERSION,
37
- 'plugin_build' => 'free',
38
- 'updates' => WDN_PLUGIN_DIR . '/updates/'
39
- );
40
 
41
- /**
42
- * Проверяет совместимость с Wordpress, php и другими плагинами.
43
- */
44
- $compatibility = new Wbcr_FactoryClearfy_Compatibility(array_merge($plugin_info, array(
45
- 'plugin_already_activate' => defined('WDN_PLUGIN_ACTIVE'),
46
- 'plugin_as_component' => defined('LOADING_DISABLE_ADMIN_NOTICES_AS_ADDON'),
47
- 'plugin_dir' => WDN_PLUGIN_DIR,
48
- 'plugin_base' => WDN_PLUGIN_BASE,
49
- 'plugin_url' => WDN_PLUGIN_URL,
50
- 'required_php_version' => '5.3',
51
- 'required_wp_version' => '4.2.0',
52
- 'required_clearfy_check_component' => true
53
- )));
54
 
55
- /**
56
- * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
57
- * а пользователь получит предупреждение.
58
- */
59
- if( !$compatibility->check() ) {
60
- return;
61
- }
 
62
 
63
- define('WDN_PLUGIN_ACTIVE', true);
 
 
 
 
 
 
 
 
 
 
 
 
 
64
 
65
- if( !defined('LOADING_DISABLE_ADMIN_NOTICES_AS_ADDON') ) {
66
- require_once(WDN_PLUGIN_DIR . '/libs/factory/core/boot.php');
67
- }
 
 
 
 
68
 
69
- require_once(WDN_PLUGIN_DIR . '/includes/class.plugin.php');
70
 
71
- if( !defined('LOADING_DISABLE_ADMIN_NOTICES_AS_ADDON') ) {
72
- new WDN_Plugin(__FILE__, $plugin_info);
73
- }
 
 
 
 
 
 
1
  <?php
2
+ /**
3
+ * Plugin Name: Webcraftic Disable Admin Notices Individually
4
+ * Plugin URI: https://wordpress.org/plugins/disable-admin-notices/
5
+ * Description: Disable admin notices plugin gives you the option to hide updates warnings and inline notices in the admin panel.
6
+ * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
+ * Version: 1.0.6
8
+ * Text Domain: disable-admin-notices
9
+ * Domain Path: /languages/
10
+ * Author URI: https://clearfy.pro
11
+ * Framework Version: FACTORY_409_VERSION
12
+ */
13
 
14
+ // Exit if accessed directly
15
+ if ( ! defined( 'ABSPATH' ) ) {
16
+ exit;
17
+ }
18
+ if ( ! defined( 'WDN_PLUGIN_VERSION' ) ) {
19
+ define( 'WDN_PLUGIN_VERSION', '1.0.7' );
20
+ }
21
 
22
+ // Fix for ithemes sync. When the ithemes sync plugin accepts the request, set the WP_ADMIN constant,
23
+ // after which the plugin Clearfy begins to create errors, and how the logic of its work is broken.
24
+ // Solution to simply terminate the plugin if there is a request from ithemes sync
25
+ // --------------------------------------
26
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'ithemes_sync_request' ) {
27
+ return;
28
+ }
29
 
30
+ if ( isset( $_GET['ithemes-sync-request'] ) && ! empty( $_GET['ithemes-sync-request'] ) ) {
31
+ return;
32
+ }
33
+ // ----------------------------------------
34
 
35
+ if ( ! defined( 'WDN_PLUGIN_DIR' ) ) {
36
+ define( 'WDN_PLUGIN_DIR', dirname( __FILE__ ) );
37
+ }
38
+ if ( ! defined( 'WDN_PLUGIN_BASE' ) ) {
39
+ define( 'WDN_PLUGIN_BASE', plugin_basename( __FILE__ ) );
40
+ }
41
+ if ( ! defined( 'WDN_PLUGIN_URL' ) ) {
42
+ define( 'WDN_PLUGIN_URL', plugins_url( null, __FILE__ ) );
43
+ }
44
 
 
 
 
 
45
 
 
 
 
 
 
 
 
 
46
 
47
+ if ( ! defined( 'LOADING_DISABLE_ADMIN_NOTICES_AS_ADDON' ) ) {
48
+ require_once( WDN_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php' );
49
+ require_once( WDN_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php' );
50
+ }
 
 
 
 
 
 
 
 
 
51
 
52
+ $plugin_info = array(
53
+ 'prefix' => 'wbcr_dan_',
54
+ 'plugin_name' => 'wbcr_dan',
55
+ 'plugin_title' => __( 'Webcraftic disable admin notices', 'disable-admin-notices' ),
56
+ 'plugin_version' => WDN_PLUGIN_VERSION,
57
+ 'plugin_build' => 'free',
58
+ 'updates' => WDN_PLUGIN_DIR . '/updates/'
59
+ );
60
 
61
+ /**
62
+ * Проверяет совместимость с Wordpress, php и другими плагинами.
63
+ */
64
+ $compatibility = new Wbcr_FactoryClearfy_Compatibility( array_merge( $plugin_info, array(
65
+ 'factory_version' => 'FACTORY_409_VERSION',
66
+ 'plugin_already_activate' => defined( 'WDN_PLUGIN_ACTIVE' ),
67
+ 'plugin_as_component' => defined( 'LOADING_DISABLE_ADMIN_NOTICES_AS_ADDON' ),
68
+ 'plugin_dir' => WDN_PLUGIN_DIR,
69
+ 'plugin_base' => WDN_PLUGIN_BASE,
70
+ 'plugin_url' => WDN_PLUGIN_URL,
71
+ 'required_php_version' => '5.3',
72
+ 'required_wp_version' => '4.2.0',
73
+ 'required_clearfy_check_component' => true
74
+ ) ) );
75
 
76
+ /**
77
+ * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
78
+ * а пользователь получит предупреждение.
79
+ */
80
+ if ( ! $compatibility->check() ) {
81
+ return;
82
+ }
83
 
84
+ define( 'WDN_PLUGIN_ACTIVE', true );
85
 
86
+ if ( ! defined( 'LOADING_DISABLE_ADMIN_NOTICES_AS_ADDON' ) ) {
87
+ require_once( WDN_PLUGIN_DIR . '/libs/factory/core/boot.php' );
88
+ }
89
+
90
+ require_once( WDN_PLUGIN_DIR . '/includes/class.plugin.php' );
91
+
92
+ if ( ! defined( 'LOADING_DISABLE_ADMIN_NOTICES_AS_ADDON' ) ) {
93
+ new WDN_Plugin( __FILE__, $plugin_info );
94
+ }
components/disable-admin-notices/includes/classes/class.configurate-notices.php CHANGED
@@ -52,7 +52,7 @@ class WDN_ConfigHideNotices extends Wbcr_FactoryClearfy206_Configurate {
52
  }
53
 
54
  public function notificationsPanel( &$wp_admin_bar ) {
55
- if ( ! $this->getPopulateOption( 'show_notices_in_adminbar', false ) && current_user_can( 'manage_network' ) ) {
56
  return;
57
  }
58
 
@@ -202,7 +202,13 @@ class WDN_ConfigHideNotices extends Wbcr_FactoryClearfy206_Configurate {
202
  global $wbcr_dan_plugin_all_notices;
203
 
204
  try {
205
- $wp_filter_admin_notices = &$this->getWPFilter( 'admin_notices' );
 
 
 
 
 
 
206
  } catch( Exception $e ) {
207
  $wp_filter_admin_notices = null;
208
  }
52
  }
53
 
54
  public function notificationsPanel( &$wp_admin_bar ) {
55
+ if ( ! $this->getPopulateOption( 'show_notices_in_adminbar', false ) ) {
56
  return;
57
  }
58
 
202
  global $wbcr_dan_plugin_all_notices;
203
 
204
  try {
205
+ if ( is_multisite() && is_network_admin() ) {
206
+ $wp_filter_admin_notices = &$this->getWPFilter( 'network_admin_notices' );
207
+ } else {
208
+ $wp_filter_admin_notices = &$this->getWPFilter( 'admin_notices' );
209
+ }
210
+ //todo: Доработать all admin notices
211
+
212
  } catch( Exception $e ) {
213
  $wp_filter_admin_notices = null;
214
  }
components/disable-admin-notices/languages/disable-admin-notices-es_ES.mo ADDED
Binary file
components/disable-admin-notices/languages/disable-admin-notices-es_ES.po ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of Plugins - Clearfy in Spanish (Spain)
2
+ # This file is distributed under the same license as the Plugins - Clearfy – WordPress optimization plugin and disable ultimate tweaker - Development (trunk) package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: \n"
6
+ "POT-Creation-Date: 2019-04-28 06:26+0300\n"
7
+ "PO-Revision-Date: 2019-04-28 06:26+0300\n"
8
+ "Last-Translator: \n"
9
+ "Language-Team: \n"
10
+ "Language: es\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
15
+ "X-Generator: Poedit 2.1.1\n"
16
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
17
+ "X-Generator: Poedit 2.1.1\n"
18
+ "X-Poedit-Basepath: ..\n"
19
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
20
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
21
+ "X-Poedit-SourceCharset: UTF-8\n"
22
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
23
+ "X-Poedit-SearchPath-0: .\n"
24
+ "X-Poedit-SearchPathExcluded-0: libs\n"
25
+ "X-Poedit-SearchPathExcluded-1: components\n"
26
+ "X-Poedit-SearchPathExcluded-2: cache\n"
27
+
28
+ #: admin/ajax/hide-notice.php:24 admin/ajax/restore-notice.php:22
29
+ msgid "Undefinded notice id."
30
+ msgstr "Aviso de ID indefinido"
31
+
32
+ #: admin/ajax/hide-notice.php:40 admin/ajax/restore-notice.php:36
33
+ msgid "You don't have enough capability to edit this information."
34
+ msgstr "No tienes suficiente permisos para editar esta información."
35
+
36
+ #: admin/boot.php:18 admin/options.php:30 admin/pages/notices.php:38
37
+ msgid "Hide admin notices"
38
+ msgstr "Ocultar avisos administrativos"
39
+
40
+ #: admin/boot.php:24 admin/options.php:103
41
+ msgid "Enable hidden notices in adminbar"
42
+ msgstr "Habilitar avisos ocultos en la barra de administración"
43
+
44
+ #: admin/boot.php:46
45
+ msgid "Get ultimate plugin free"
46
+ msgstr "Obtener el ultimate plugin gratis"
47
+
48
+ #: admin/options.php:23
49
+ msgid "Admin notifications, Update nags"
50
+ msgstr "Notificaciones de administrador, actualización de nags"
51
+
52
+ #: admin/options.php:23
53
+ msgid ""
54
+ "Do you know the situation, when some plugin offers you to update to premium, "
55
+ "to collect technical data and shows many annoying notices? You are close "
56
+ "these notices every now and again but they newly appears and interfere your "
57
+ "work with WordPress. Even worse, some plugin’s authors delete “close” button "
58
+ "from notices and they shows in your admin panel forever."
59
+ msgstr ""
60
+ "¿Conoces la situación cuando algún plugin te ofrece actualizar a Premium, "
61
+ "recopilar datos técnicos y mostrar muchos avisos molestos? A veces no están, "
62
+ "pero aparecen de nuevo e interfieren en tu trabajo con WordPress. Peor aún, "
63
+ "los autores de algunos plugin eliminan el botón \"cerrar\" de las "
64
+ "notificaciones y se muestran en su panel de administración para siempre."
65
+
66
+ #: admin/options.php:34
67
+ msgid "All notices"
68
+ msgstr "Todos los avisos"
69
+
70
+ #: admin/options.php:35
71
+ msgid "Hide all notices globally."
72
+ msgstr "Ocultar todos los avisos globalmente."
73
+
74
+ #: admin/options.php:39
75
+ msgid "Only selected"
76
+ msgstr "Solo seleccionados"
77
+
78
+ #: admin/options.php:40
79
+ msgid ""
80
+ "Hide selected notices only. You will see the link \"Hide notification forever"
81
+ "\" in each notice. Push it and they will not bother you anymore."
82
+ msgstr ""
83
+ "Ocultar solo los avisos seleccionados. Verá el enlace \"Ocultar notificación "
84
+ "para siempre\" en cada aviso. Click y ya no los veras mas."
85
+
86
+ #: admin/options.php:44
87
+ msgid "Don't nide"
88
+ msgstr "No ocultar"
89
+
90
+ #: admin/options.php:45
91
+ msgid ""
92
+ "Do not hide notices and do not show “Hide notification forever” link for "
93
+ "admin."
94
+ msgstr ""
95
+ "No ocultar avisos y no mostrar el enlace \"Ocultar notificación para siempre"
96
+ "\" para el administrador."
97
+
98
+ #: admin/options.php:49
99
+ msgid ""
100
+ "Some plugins shows notifications about premium version, data collecting or "
101
+ "promote their services. Even if you push close button (that sometimes are "
102
+ "impossible), notices are shows again in some time. This option allows you to "
103
+ "control notices. Hide them all or each individually. Some plugins shows "
104
+ "notifications about premium version, data collecting or promote their "
105
+ "services. Even if you push close button (that sometimes are impossible), "
106
+ "notices are shows again in some time. This option allows you to control "
107
+ "notices. Hide them all or each individually."
108
+ msgstr ""
109
+ "Algunos plugin muestran notificaciones sobre la versión premium: "
110
+ "Recopilación de datos o la promoción de sus servicios; Incluso si presiona "
111
+ "el botón de cierre (que a veces es imposible), las notificaciones se "
112
+ "muestran de nuevo en algún momento. Esta opción le permite controlar avisos. "
113
+ "Ocúltelas todas o cada una individualmente."
114
+
115
+ #: admin/options.php:105
116
+ msgid ""
117
+ "By default, the plugin hides all notices, which you specified. If you enable "
118
+ "this option, the plugin will collect all hidden notices and show them into "
119
+ "the top admin toolbar. It will not disturb you but will allow to look "
120
+ "notices at your convenience."
121
+ msgstr ""
122
+ "Por defecto, el plugin oculta todos los avisos que especificó. Si habilita "
123
+ "esta opción, el plugin recopilará todos los avisos ocultos y los mostrará en "
124
+ "la barra superior de administración de herramientas. No le molestará, pero "
125
+ "le permitirá ver los avisos según su conveniencia."
126
+
127
+ #: admin/options.php:166
128
+ msgid "Reset hidden notices for"
129
+ msgstr "Restablecer avisos ocultos para"
130
+
131
+ #: admin/options.php:167
132
+ msgid "Push reset hidden notices if you need to show hidden notices again."
133
+ msgstr "Pulse reiniciar avisos ocultos si necesita mostrarlos de nuevo."
134
+
135
+ #: admin/options.php:177
136
+ msgid "current user"
137
+ msgstr "usuario actual"
138
+
139
+ #: admin/options.php:181
140
+ msgid "all users"
141
+ msgstr "todos los usuarios"
142
+
143
+ #: admin/options.php:185
144
+ msgid "Reset notices"
145
+ msgstr "Restablecer avisos"
146
+
147
+ #: admin/options.php:188 admin/pages/notices.php:71
148
+ msgid "Hidden notices are successfully reset, now you can see them again!"
149
+ msgstr ""
150
+ "Los avisos ocultos se restablecieron con éxito, ¡ahora puedes verlos "
151
+ "nuevamente!"
152
+
153
+ #: admin/pages/notices.php:54
154
+ msgid "Notices"
155
+ msgstr "Avisos"
156
+
157
+ #: admin/pages/notices.php:55
158
+ msgid "General"
159
+ msgstr "General"
160
+
161
+ #: disable-admin-notices.php:84
162
+ msgid "Webcraftic disable admin notices"
163
+ msgstr "Deshabilitar los avisos Webcraftic de administración"
164
+
165
+ #: includes/classes/class.configurate-notices.php:74
166
+ #, php-format
167
+ msgid "Notifications %s"
168
+ msgstr "Notificaciones %s"
169
+
170
+ #: includes/classes/class.configurate-notices.php:86
171
+ msgid "Restore notice"
172
+ msgstr "Aviso de restauración"
173
+
174
+ #: includes/classes/class.configurate-notices.php:285
175
+ msgid "Hide notification forever"
176
+ msgstr "Ocultar notificaciones para siempre"
177
+
178
+ #~ msgid "Assets Manager"
179
+ #~ msgstr "Gestor de Activos"
180
+
181
+ #~ msgid "Settings has been successfully imported!"
182
+ #~ msgstr "¡Configuración importada exitosamente!"
components/ga-cache/admin/activation.php CHANGED
@@ -1,57 +1,45 @@
1
  <?php
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  /**
4
- * Activator for the GA cache
5
- * @author Webcraftic <wordpress.webraftic@gmail.com>
6
- * @copyright (c) 09.09.2017, Webcraftic
7
- * @see Factory409_Activator
8
- * @version 1.0
9
  */
10
-
11
- // Exit if accessed directly
12
- if( !defined('ABSPATH') ) {
13
- exit;
14
- }
15
-
16
- class WGA_Activation extends Wbcr_Factory409_Activator {
17
-
18
- /**
19
- * Runs activation actions.
20
- *
21
- * @since 1.0.0
22
- */
23
- public function activate()
24
- {
25
- // -------------
26
- // Caching google analytics on a schedule
27
- // -------------
28
-
29
- $ga_cache = WGA_Plugin::app()->getPopulateOption('ga_cache');
30
-
31
- if( $ga_cache ) {
32
- wp_clear_scheduled_hook('wbcr_clearfy_update_local_ga');
33
-
34
- if( !wp_next_scheduled('wbcr_clearfy_update_local_ga') ) {
35
- $ga_caos_remove_wp_cron = WGA_Plugin::app()->getPopulateOption('ga_caos_remove_wp_cron');
36
-
37
- if( !$ga_caos_remove_wp_cron ) {
38
- wp_schedule_event(time(), 'daily', 'wbcr_clearfy_update_local_ga');
39
- }
40
- }
41
  }
42
  }
43
-
44
- /**
45
- * Runs activation actions.
46
- *
47
- * @since 1.0.0
48
- */
49
- public function deactivate()
50
- {
51
- //WGA_Plugin::app()->updatePopulateOption('ga_cache', 0);
52
-
53
- if( wp_next_scheduled('wbcr_clearfy_update_local_ga') ) {
54
- wp_clear_scheduled_hook('wbcr_clearfy_update_local_ga');
55
- }
56
  }
57
  }
 
1
  <?php
2
 
3
+ /**
4
+ * Activator for the GA cache
5
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
6
+ * @copyright (c) 09.09.2017, Webcraftic
7
+ * @see Factory409_Activator
8
+ * @version 1.0
9
+ */
10
+
11
+ // Exit if accessed directly
12
+ if ( ! defined( 'ABSPATH' ) ) {
13
+ exit;
14
+ }
15
+
16
+ class WGA_Activation extends Wbcr_Factory409_Activator {
17
+
18
  /**
19
+ * Runs activation actions.
20
+ *
21
+ * @since 1.0.0
 
 
22
  */
23
+ public function activate() {
24
+ $ga_cache = WGA_Plugin::app()->getPopulateOption( 'ga_cache' );
25
+
26
+ if ( $ga_cache ) {
27
+ wp_clear_scheduled_hook( 'wbcr/gac/update_analytic_library' );
28
+
29
+ if ( ! wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
30
+ wp_schedule_event( time(), 'daily', 'wbcr/gac/update_analytic_library' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  }
32
  }
33
+ }
34
+
35
+ /**
36
+ * Runs activation actions.
37
+ *
38
+ * @since 1.0.0
39
+ */
40
+ public function deactivate() {
41
+ if ( wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
42
+ wp_clear_scheduled_hook( 'wbcr/gac/update_analytic_library' );
 
 
 
43
  }
44
  }
45
+ }
components/ga-cache/admin/boot.php CHANGED
@@ -1,214 +1,260 @@
1
  <?php
2
- /**
3
- * Admin boot
4
- * @author Webcraftic <wordpress.webraftic@gmail.com>
5
- * @copyright Webcraftic 25.05.2017
6
- * @version 1.0
7
- */
8
-
9
- // Exit if accessed directly
10
- if( !defined('ABSPATH') ) {
11
- exit;
12
- }
13
-
14
- /**
15
- * Notice that the plugin has been seriously updated!
16
- *
17
- * @param array $notices
18
- * @param string $plugin_name
19
- * @return array
20
- */
21
- function wbcr_ga_admin_conflict_notices_error($notices, $plugin_name)
22
- {
23
- if( defined('LOADING_GA_CACHE_AS_ADDON') || $plugin_name != WGA_Plugin::app()->getPluginName() ) {
24
- return $notices;
25
- }
26
-
27
- $text = '<p>' . __('The <b>Simple Google Analytics</b> plugin has some major changes!', 'simple-google-analytics') . '</p>';
28
- $text .= '<p>' . __('Unfortunately, the old version of the plugin (2.2.2) is no longer supported, but you still can download it from the WordPress repository in case if the new release doesn’t work for you.', 'simple-google-analytics') . '</p>';
29
- $text .= '<p>' . __('We’ve updated the code and fixed the compatibility issue for the latest WordPress and PHP versions. We’ve also added additional feature of the Local Google Analytics – this way your website will load faster. The plugin’s name has been changed to Local Google Analytics, but all features remained the same.', 'simple-google-analytics') . '</p>';
30
- $text .= '<p>' . sprintf(__('Please, check <a href="%s">plugin settings</a> and its performance on your website. We do care about you and want to avoid any problems with the new version.', 'simple-google-analytics') . '</p>', admin_url('options-general.php?page=ga_cache-' . WGA_Plugin::app()
31
- ->getPluginName())) . '</p>';
32
- $text .= '<p>' . sprintf(__('We are aimed to pay more attention to the speed and security aspects of your website. That’s why you should definitely try our basic WordPress optimization plugin as well. Clearfy includes functionality of this plugin and has many additional features for the website optimization:
33
- <a href="%s">Donwload Clearfy for free</a>', 'simple-google-analytics'), 'https://clearfy.pro?utm_source=wordpress.org&utm_campaign=' . WGA_Plugin::app()
34
- ->getPluginName()) . '</p>';
35
-
36
- $notices[] = array(
37
- 'id' => 'ga_plugin_upgrade_notice1',
38
- 'type' => 'warning',
39
- 'dismissible' => true,
40
- 'dismiss_expires' => 0,
41
- 'text' => $text
42
- );
43
-
44
  return $notices;
45
  }
46
-
47
- add_filter('wbcr_factory_notices_407_list', 'wbcr_ga_admin_conflict_notices_error', 10, 2);
48
-
49
- /**
50
- * Migrate settings from the old plugin to the new one.
51
- */
52
- function wbcr_ga_upgrade()
53
- {
54
- global $wpdb;
55
-
56
- if( defined('LOADING_GA_CACHE_AS_ADDON') ) {
57
- return;
58
- }
59
-
60
- $is_migrate_up_to_230 = WGA_Plugin::app()->getPopulateOption('is_migrate_up_to_230', false);
61
-
62
- if( !$is_migrate_up_to_230 ) {
63
- $old_plugin_tracking_id = get_option('sga_analytics_id');
64
- $old_plugin_code_location = get_option('sga_code_location');
65
- $old_plugin_demographic_and_interest = (int)get_option('sga_demographic_and_interest');
66
- $old_plugin_sga_render_when_loggedin = (int)get_option('sga_render_when_loggedin');
67
-
68
- if( !empty($old_plugin_tracking_id) ) {
69
- WGA_Plugin::app()->updatePopulateOption('ga_cache', 1);
70
- WGA_Plugin::app()->updatePopulateOption('ga_tracking_id', $old_plugin_tracking_id);
71
-
72
- $script_position = 'footer';
73
-
74
- if( $old_plugin_code_location == 'head' ) {
75
- $script_position = 'header';
76
- }
77
-
78
- WGA_Plugin::app()->updatePopulateOption('ga_script_position', $script_position);
79
- WGA_Plugin::app()->updatePopulateOption('ga_anonymize_ip', $old_plugin_demographic_and_interest);
80
- WGA_Plugin::app()->updatePopulateOption('ga_track_admin', $old_plugin_sga_render_when_loggedin);
81
-
82
- $wpdb->query("DELETE FROM {$wpdb->prefix}options WHERE option_name LIKE 'sga_%';");
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  }
84
-
85
- WGA_Plugin::app()->updatePopulateOption('is_migrate_up_to_230', 1);
 
 
 
 
86
  }
 
 
87
  }
88
-
89
- add_action('init', 'wbcr_ga_upgrade');
90
-
91
- /**
92
- * This action is executed when the component of the Clearfy plugin is activate and if this component is name ga_cache
93
- */
94
- add_action('wbcr/clearfy/activated_component', function ($component_name) {
95
- if( $component_name == 'ga_cache' ) {
96
- require_once WGA_PLUGIN_DIR . '/admin/activation.php';
97
- $plugin = new WGA_Activation(WGA_Plugin::app());
98
- $plugin->activate();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  }
100
- });
101
-
102
- /**
103
- * This action is executed when the component of the Clearfy plugin is deactivated and if this component is name ga_cache
104
- */
105
- add_action('wbcr_clearfy_pre_deactivate_component', function ($component_name) {
106
- if( $component_name == 'ga_cache' ) {
107
- require_once WGA_PLUGIN_DIR . '/admin/activation.php';
108
- $plugin = new WGA_Activation(WGA_Plugin::app());
109
- $plugin->deactivate();
110
  }
111
- });
112
-
113
- /**
114
- * @param $options
115
- * @return array
116
- */
117
- function wbcr_ga_group_options($options)
118
- {
119
- $options[] = array(
120
- 'name' => 'ga_cache',
121
- 'title' => __('Google Analytics Cache', 'simple-google-analytics'),
122
- 'tags' => array()
123
- );
124
-
125
- $options[] = array(
126
- 'name' => 'ga_tracking_id',
127
- 'title' => __('Google analytic Code', 'clearfy'),
128
- 'tags' => array()
129
- );
130
- $options[] = array(
131
- 'name' => 'ga_adjusted_bounce_rate',
132
- 'title' => __('Use adjusted bounce rate?', 'clearfy'),
133
- 'tags' => array()
134
- );
135
- $options[] = array(
136
- 'name' => 'ga_enqueue_order',
137
- 'title' => __('Change enqueue order?', 'clearfy'),
138
- 'tags' => array()
139
- );
140
- $options[] = array(
141
- 'name' => 'ga_caos_disable_display_features',
142
- 'title' => __('Disable all display features functionality?', 'clearfy'),
143
- 'tags' => array()
144
- );
145
- $options[] = array(
146
- 'name' => 'ga_anonymize_ip',
147
- 'title' => __('Use Anonymize IP? (Required by law for some countries)', 'clearfy'),
148
- 'tags' => array()
149
- );
150
- $options[] = array(
151
- 'name' => 'ga_track_admin',
152
- 'title' => __('Track logged in Administrators?', 'clearfy'),
153
- 'tags' => array()
154
- );
155
- $options[] = array(
156
- 'name' => 'ga_caos_remove_wp_cron',
157
- 'title' => __('Remove script from wp-cron?', 'clearfy'),
158
- 'tags' => array()
159
- );
160
-
161
- return $options;
162
  }
163
-
164
- add_filter("wbcr_clearfy_group_options", 'wbcr_ga_group_options');
165
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
  /**
167
- * Download ultimate plugin link
 
 
 
 
 
168
  *
169
- * @param $links
170
- * @param $file
171
  * @return array
172
  */
173
- function wbcr_ga_set_plugin_meta($links, $file)
174
- {
175
- if( $file == WGA_PLUGIN_BASE ) {
176
-
177
  $url = 'https://clearfy.pro';
178
-
179
- if( get_locale() == 'ru_RU' ) {
180
  $url = 'https://ru.clearfy.pro';
181
  }
182
-
183
  $url .= '?utm_source=wordpress.org&utm_campaign=' . WGA_Plugin::app()->getPluginName();
184
-
185
- $links[] = '<a href="' . $url . '" style="color: #FF5722;font-weight: bold;" target="_blank">' . __('Get ultimate plugin free', 'simple-google-analytics') . '</a>';
186
  }
187
-
188
  return $links;
189
  }
190
-
191
- if( !defined('LOADING_GA_CACHE_AS_ADDON') ) {
192
- add_filter('plugin_row_meta', 'wbcr_ga_set_plugin_meta', 10, 2);
193
- }
194
-
195
- /**
196
- * Rating widget url
197
- *
198
- * @param string $page_url
199
- * @param string $plugin_name
200
- * @return string
201
- */
202
- function wbcr_ga_rating_widget_url($page_url, $plugin_name)
203
- {
204
- if( !defined('LOADING_GA_CACHE_AS_ADDON') && ($plugin_name == WGA_Plugin::app()->getPluginName()) ) {
205
- return 'https://wordpress.org/support/plugin/simple-google-analytics/reviews/#new-post';
206
- }
207
-
208
- return $page_url;
209
  }
 
 
 
210
 
211
- add_filter('wbcr_factory_imppage_rating_widget_url', 'wbcr_ga_rating_widget_url', 10, 2);
212
 
213
 
214
 
1
  <?php
2
+ /**
3
+ * The boot file is needed to connect backend files, as well as register hooks.
4
+ * Some hooks are so small that it does not make sense to put them into a file
5
+ * or put them into a specific group of code.
6
+ *
7
+ * I usually register administrator notifications, create handlers before saving
8
+ * plugin settings or after, register options in the Clearfy plugin.
9
+ *
10
+ * @author Webcraftic <wordpress.webraftic@gmail.com>, Alex Kovalev <alex.kovalevv@gmail.com>
11
+ * @copyright Webcraftic
12
+ * @version 1.1
13
+ */
14
+
15
+ // Exit if accessed directly
16
+ if ( ! defined( 'ABSPATH' ) ) {
17
+ exit;
18
+ }
19
+
20
+ /**
21
+ * Notice that the plugin has been seriously updated!
22
+ *
23
+ * @param array $notices all registered notices
24
+ * @param string $plugin_name
25
+ *
26
+ * @since 3.0.1
27
+ * @return array all notices
28
+ */
29
+ function wbcr_ga_admin_conflict_notices_error( $notices, $plugin_name ) {
30
+ if ( defined( 'LOADING_GA_CACHE_AS_ADDON' ) || $plugin_name != WGA_Plugin::app()->getPluginName() ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  return $notices;
32
  }
33
+
34
+ $text = '<p>' . __( 'The <b>Simple Google Analytics</b> plugin has some major changes!', 'simple-google-analytics' ) . '</p>';
35
+ $text .= '<p>' . __( 'Unfortunately, the old version of the plugin (2.2.2) is no longer supported, but you still can download it from the WordPress repository in case if the new release doesn’t work for you.', 'simple-google-analytics' ) . '</p>';
36
+ $text .= '<p>' . __( 'We’ve updated the code and fixed the compatibility issue for the latest WordPress and PHP versions. We’ve also added additional feature of the Local Google Analytics – this way your website will load faster. The plugin’s name has been changed to Local Google Analytics, but all features remained the same.', 'simple-google-analytics' ) . '</p>';
37
+ $text .= '<p>' . sprintf( __( 'Please, check <a href="%s">plugin settings</a> and its performance on your website. We do care about you and want to avoid any problems with the new version.', 'simple-google-analytics' ) . '</p>', admin_url( 'options-general.php?page=ga_cache-' . WGA_Plugin::app()->getPluginName() ) ) . '</p>';
38
+ $text .= '<p>' . sprintf( __( 'We are aimed to pay more attention to the speed and security aspects of your website. That’s why you should definitely try our basic WordPress optimization plugin as well. Clearfy includes functionality of this plugin and has many additional features for the website optimization:
39
+ <a href="%s">Donwload Clearfy for free</a>', 'simple-google-analytics' ), 'https://clearfy.pro?utm_source=wordpress.org&utm_campaign=' . WGA_Plugin::app()->getPluginName() ) . '</p>';
40
+
41
+ $notices[] = array(
42
+ 'id' => 'ga_plugin_upgrade_notice1',
43
+ 'type' => 'warning',
44
+ 'dismissible' => true,
45
+ 'dismiss_expires' => 0,
46
+ 'text' => $text
47
+ );
48
+
49
+ return $notices;
50
+ }
51
+
52
+ add_filter( 'wbcr_factory_notices_407_list', 'wbcr_ga_admin_conflict_notices_error', 10, 2 );
53
+
54
+ /**
55
+ * Migrate settings from the old plugin to the new one.
56
+ *
57
+ * @since 3.0.1
58
+ * @return void
59
+ */
60
+ function wbcr_ga_upgrade() {
61
+ global $wpdb;
62
+
63
+ if ( defined( 'LOADING_GA_CACHE_AS_ADDON' ) ) {
64
+ return;
65
+ }
66
+
67
+ $is_migrate_up_to_230 = WGA_Plugin::app()->getPopulateOption( 'is_migrate_up_to_230', false );
68
+
69
+ if ( ! $is_migrate_up_to_230 ) {
70
+ $old_plugin_tracking_id = get_option( 'sga_analytics_id' );
71
+ $old_plugin_code_location = get_option( 'sga_code_location' );
72
+ $old_plugin_demographic_and_interest = (int) get_option( 'sga_demographic_and_interest' );
73
+ $old_plugin_sga_render_when_loggedin = (int) get_option( 'sga_render_when_loggedin' );
74
+
75
+ if ( ! empty( $old_plugin_tracking_id ) ) {
76
+ WGA_Plugin::app()->updatePopulateOption( 'ga_cache', 1 );
77
+ WGA_Plugin::app()->updatePopulateOption( 'ga_tracking_id', $old_plugin_tracking_id );
78
+
79
+ $script_position = 'footer';
80
+
81
+ if ( $old_plugin_code_location == 'head' ) {
82
+ $script_position = 'header';
83
  }
84
+
85
+ WGA_Plugin::app()->updatePopulateOption( 'ga_script_position', $script_position );
86
+ WGA_Plugin::app()->updatePopulateOption( 'ga_anonymize_ip', $old_plugin_demographic_and_interest );
87
+ WGA_Plugin::app()->updatePopulateOption( 'ga_track_admin', $old_plugin_sga_render_when_loggedin );
88
+
89
+ $wpdb->query( "DELETE FROM {$wpdb->prefix}options WHERE option_name LIKE 'sga_%';" );
90
  }
91
+
92
+ WGA_Plugin::app()->updatePopulateOption( 'is_migrate_up_to_230', 1 );
93
  }
94
+ }
95
+
96
+ add_action( 'init', 'wbcr_ga_upgrade' );
97
+
98
+ /**
99
+ * After saving the settings in the plugin, we check whether the
100
+ * options for analytic caching are enabled or not. If enabled,
101
+ * add cron task.
102
+ *
103
+ * @param Wbcr_Factory409_Plugin $plugin *
104
+ * @param Wbcr_FactoryPages410_ImpressiveThemplate $page
105
+ *
106
+ * @since 3.0.1
107
+ * @return void
108
+ */
109
+ add_action( 'wbcr_factory_409_imppage_after_form_save', function ( $plugin, $page ) {
110
+ if ( WGA_Plugin::app()->getPluginName() != $plugin->getPluginName() ) {
111
+ return;
112
+ }
113
+
114
+ $ga_cache = WGA_Plugin::app()->getPopulateOption( 'ga_cache' );
115
+
116
+ if ( $ga_cache ) {
117
+ if ( ! wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
118
+ wp_schedule_event( time(), 'daily', 'wbcr/gac/update_analytic_library' );
119
  }
120
+ } else {
121
+ if ( wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
122
+ wp_clear_scheduled_hook( 'wbcr/gac/update_analytic_library' );
 
 
 
 
 
 
 
123
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  }
125
+ }, 10, 2 );
126
+
127
+ /**
128
+ * This action is executed when the component of the Clearfy plugin
129
+ * is activate and if this component is name ga_cache
130
+ *
131
+ * @since 3.0.1
132
+ * @return void
133
+ */
134
+ add_action( 'wbcr/clearfy/activated_component', function ( $component_name ) {
135
+ if ( $component_name == 'ga_cache' ) {
136
+ require_once WGA_PLUGIN_DIR . '/admin/activation.php';
137
+ $plugin = new WGA_Activation( WGA_Plugin::app() );
138
+ $plugin->activate();
139
+ }
140
+ } );
141
+
142
+ /**
143
+ * This action is executed when the component of the Clearfy plugin
144
+ * is deactivated and if this component is name ga_cache
145
+ *
146
+ * @since 3.0.1
147
+ * @return void
148
+ */
149
+ add_action( 'wbcr_clearfy_pre_deactivate_component', function ( $component_name ) {
150
+ if ( $component_name == 'ga_cache' ) {
151
+ require_once WGA_PLUGIN_DIR . '/admin/activation.php';
152
+ $plugin = new WGA_Activation( WGA_Plugin::app() );
153
+ $plugin->deactivate();
154
+ }
155
+ } );
156
+
157
+ /**
158
+ * We register options of this plugin in global Clearfy options. Clearfy later can automatically
159
+ * set default values for this options or completely delete it from site database.
160
+ *
161
+ * In more detail you can read about it here: wp-plugin-clearfy\admin\includes\options.php
162
+ *
163
+ * @param array $options all available component options plugin clearfy
164
+ *
165
+ * @return array
166
+ */
167
+ function wbcr_ga_group_options( $options ) {
168
+ $options[] = array(
169
+ 'name' => 'ga_cache',
170
+ 'title' => __( 'Google Analytics Cache', 'simple-google-analytics' ),
171
+ 'tags' => array()
172
+ );
173
+
174
+ $options[] = array(
175
+ 'name' => 'ga_tracking_id',
176
+ 'title' => __( 'Google analytic Code', 'clearfy' ),
177
+ 'tags' => array()
178
+ );
179
+ $options[] = array(
180
+ 'name' => 'ga_adjusted_bounce_rate',
181
+ 'title' => __( 'Use adjusted bounce rate?', 'clearfy' ),
182
+ 'tags' => array()
183
+ );
184
+ $options[] = array(
185
+ 'name' => 'ga_enqueue_order',
186
+ 'title' => __( 'Change enqueue order?', 'clearfy' ),
187
+ 'tags' => array()
188
+ );
189
+ $options[] = array(
190
+ 'name' => 'ga_disable_display_features',
191
+ 'title' => __( 'Disable all display features functionality?', 'clearfy' ),
192
+ 'tags' => array()
193
+ );
194
+ $options[] = array(
195
+ 'name' => 'ga_anonymize_ip',
196
+ 'title' => __( 'Use Anonymize IP? (Required by law for some countries)', 'clearfy' ),
197
+ 'tags' => array()
198
+ );
199
+ $options[] = array(
200
+ 'name' => 'ga_track_admin',
201
+ 'title' => __( 'Track logged in Administrators?', 'clearfy' ),
202
+ 'tags' => array()
203
+ );
204
+
205
+ return $options;
206
+ }
207
+
208
+ add_filter( "wbcr_clearfy_group_options", 'wbcr_ga_group_options' );
209
+
210
+ if ( ! defined( 'LOADING_GA_CACHE_AS_ADDON' ) ) {
211
  /**
212
+ * Add a link to plugin meta. You can find this link in admin panel on
213
+ * the page plugins.php. Look under plugin short description.
214
+ *
215
+ * @param array $links An array of the plugin's metadata, including the version,
216
+ * author, author URI, and plugin URI.
217
+ * @param string $file path to the plugin file, relative to the plugins directory.
218
  *
 
 
219
  * @return array
220
  */
221
+ function wbcr_ga_set_plugin_meta( $links, $file ) {
222
+ if ( $file == WGA_PLUGIN_BASE ) {
223
+
 
224
  $url = 'https://clearfy.pro';
225
+
226
+ if ( get_locale() == 'ru_RU' ) {
227
  $url = 'https://ru.clearfy.pro';
228
  }
229
+
230
  $url .= '?utm_source=wordpress.org&utm_campaign=' . WGA_Plugin::app()->getPluginName();
231
+
232
+ $links[] = '<a href="' . $url . '" style="color: #FF5722;font-weight: bold;" target="_blank">' . __( 'Get ultimate plugin free', 'simple-google-analytics' ) . '</a>';
233
  }
234
+
235
  return $links;
236
  }
237
+
238
+ add_filter( 'plugin_row_meta', 'wbcr_ga_set_plugin_meta', 10, 2 );
239
+ }
240
+
241
+ /**
242
+ * Rating widget url
243
+ *
244
+ * @param string $page_url
245
+ * @param string $plugin_name
246
+ *
247
+ * @return string
248
+ */
249
+ function wbcr_ga_rating_widget_url( $page_url, $plugin_name ) {
250
+ if ( ! defined( 'LOADING_GA_CACHE_AS_ADDON' ) && ( $plugin_name == WGA_Plugin::app()->getPluginName() ) ) {
251
+ return 'https://wordpress.org/support/plugin/simple-google-analytics/reviews/#new-post';
 
 
 
 
252
  }
253
+
254
+ return $page_url;
255
+ }
256
 
257
+ add_filter( 'wbcr_factory_imppage_rating_widget_url', 'wbcr_ga_rating_widget_url', 10, 2 );
258
 
259
 
260
 
components/ga-cache/admin/options.php CHANGED
@@ -1,148 +1,138 @@
1
  <?php
2
- /**
3
- * Options for additionally form
4
- * @author Webcraftic <wordpress.webraftic@gmail.com>
5
- * @copyright (c) 21.01.2018, Webcraftic
6
- * @version 1.0
7
- */
8
 
9
- // Exit if accessed directly
10
- if( !defined('ABSPATH') ) {
11
- exit;
12
- }
13
-
14
- /**
15
- * @return array
16
- */
17
- function wbcr_ga_get_plugin_options()
18
- {
19
- $options = array();
20
-
21
- $options[] = array(
22
- 'type' => 'html',
23
- 'html' => '<div class="wbcr-factory-page-group-header">' . __('<strong>Google Analytics cache</strong>.', 'simple-google-analytics') . '<p>' . __('To improve Google Page Speed indicators Analytics caching is needed. However, it can also slightly increase your website loading speed, because Analytics js files will load locally. The second case that you might need these settings is the usual Google Analytics connection to your website. You do not need to do this with other plugins or insert the tracking code into your theme.', 'simple-google-analytics') . '</p></div>'
24
- );
25
 
26
- $options[] = array(
27
- 'type' => 'checkbox',
28
- 'way' => 'buttons',
29
- 'name' => 'ga_cache',
30
- 'title' => __('Google Analytics Cache', 'simple-google-analytics'),
31
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
32
- 'hint' => __('If you enable this option, the plugin will begin to save a local copy of Google Analytics to speed up the loading of your website and improve Google Page Speed.', 'simple-google-analytics') . '<br>--<br><span class="wbcr-factory-light-orange-color">' . __('ATTENTION! Before using this option, remove the previously installed Google Analytics code inside your theme or plugins associated with this feature!', 'simple-google-analytics') . '</span>',
33
- 'default' => false,
34
- 'eventsOn' => array(
35
- 'show' => '#wbcr-clearfy-performance-ga-block'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  ),
37
- 'eventsOff' => array(
38
- 'hide' => '#wbcr-clearfy-performance-ga-block'
39
- )
40
-
41
- );
42
- $options[] = array(
43
- 'type' => 'div',
44
- 'id' => 'wbcr-clearfy-performance-ga-block',
45
- 'items' => array(
46
- array(
47
- 'type' => 'textbox',
48
- 'way' => 'buttons',
49
- 'name' => 'ga_tracking_id',
50
- 'title' => __('Google analytic Code', 'simple-google-analytics'),
51
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
52
- 'hint' => __('Set the Google Analytics tracking code.', 'simple-google-analytics'),
53
- 'placeholder' => 'UA-XXXXX-Y'
54
- ),
55
- array(
56
- 'type' => 'dropdown',
57
- 'way' => 'buttons',
58
- 'name' => 'ga_script_position',
59
- 'data' => array(
60
- array('header', 'Header'),
61
- array('footer', 'Footer'),
62
- ),
63
- 'title' => __('Save GA in', 'simple-google-analytics'),
64
- 'hint' => __('Select location for the Google Analytics code.', 'simple-google-analytics'),
65
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
66
- 'default' => 'footer'
67
- ),
68
- array(
69
- 'type' => 'integer',
70
- 'name' => 'ga_adjusted_bounce_rate',
71
- 'title' => __('Use adjusted bounce rate?', 'simple-google-analytics'),
72
- 'default' => 0,
73
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
74
- 'hint' => __('Essentially, you set up an event which is triggered after a user spends a certain amount of time on the landing page, telling Google Analytics not to count these users as bounces. A user may come to your website, find all of the information they need (a phone number, for example) and then leave the site without visiting another page. Without adjusted bounce rate, such a user would be considered a bounce, even though they had a successful experience. By defining a time limit after which you can consider a user to be "engaged," that user would no longer count as a bounce, and you\'d get a more accurate idea of whether they found what they were looking for.', 'simple-google-analytics')
75
- ),
76
- array(
77
- 'type' => 'integer',
78
- 'way' => 'buttons',
79
- 'name' => 'ga_enqueue_order',
80
- 'title' => __('Change enqueue order?', 'simple-google-analytics'),
81
- 'default' => 0,
82
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
83
- 'hint' => __('By default, Google Analytics code is loaded before other scripts and javasscript code, but if you set the value to 100, the GA code will be loaded after all other scripts. By changing the priority, you can set code position on the page.', 'simple-google-analytics')
84
- ),
85
- array(
86
- 'type' => 'checkbox',
87
- 'way' => 'buttons',
88
- 'name' => 'ga_caos_disable_display_features',
89
- 'title' => __('Disable all display features functionality?', 'simple-google-analytics'),
90
- //'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
91
- 'hint' => sprintf(__('Disable all <a href="%s">display features functionality?</a>', 'simple-google-analytics'), 'https://developers.google.com/analytics/devguides/collection/analyticsjs/display-features'),
92
- 'default' => false
93
- ),
94
- array(
95
- 'type' => 'checkbox',
96
- 'way' => 'buttons',
97
- 'name' => 'ga_anonymize_ip',
98
- 'title' => __('Use Anonymize IP? (Required by law for some countries)', 'simple-google-analytics'),
99
- //'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
100
- 'hint' => sprintf(__('Use <a href="%s">Anonymize IP?</a> (Required by law for some countries)', 'simple-google-analytics'), 'https://support.google.com/analytics/answer/2763052'),
101
- 'default' => false
102
- ),
103
- array(
104
- 'type' => 'checkbox',
105
- 'way' => 'buttons',
106
- 'name' => 'ga_track_admin',
107
- 'title' => __('Track logged in Administrators?', 'simple-google-analytics'),
108
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
109
- 'hint' => __('Track logged in Administrators?', 'simple-google-analytics'),
110
- 'default' => false
111
  ),
112
- array(
113
- 'type' => 'checkbox',
114
- 'way' => 'buttons',
115
- 'name' => 'ga_caos_remove_wp_cron',
116
- 'title' => __('Remove script from wp-cron?', 'simple-google-analytics'),
117
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
118
- 'hint' => __('Clearfy creates a cron job to daily update Google Analytics cache scripts. After enabling this option, the plugin will not update Google Analytics cache file. Do not use this option if you do not understand why you need it!', 'simple-google-analytics'),
119
- 'default' => false
120
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  )
122
- );
123
-
124
- return $options;
125
- }
126
-
127
- /**
128
- * @param $form
129
- * @param $page FactoryPages410_ImpressiveThemplate
130
- * @return mixed
131
- */
132
- function wbcr_ga_additionally_form_options($form, $page)
133
- {
134
- if( empty($form) ) {
135
- return $form;
136
- }
137
-
138
- $options = wbcr_ga_get_plugin_options();
139
-
140
- foreach(array_reverse($options) as $option) {
141
- array_unshift($form[0]['items'], $option);
142
- }
143
 
 
 
 
 
 
 
 
 
144
  return $form;
145
  }
 
 
 
 
 
 
 
 
 
146
 
147
- add_filter('wbcr_clr_google_performance_form_options', 'wbcr_ga_additionally_form_options', 10, 2);
148
 
1
  <?php
2
+ /**
3
+ * Options for additionally form
4
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
5
+ * @copyright (c) 21.01.2018, Webcraftic
6
+ * @version 1.0
7
+ */
8
 
9
+ // Exit if accessed directly
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit;
12
+ }
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
+ /**
15
+ * @return array
16
+ */
17
+ function wbcr_ga_get_plugin_options() {
18
+ $options = array();
19
+
20
+ $options[] = array(
21
+ 'type' => 'html',
22
+ 'html' => '<div class="wbcr-factory-page-group-header">' . __( '<strong>Google Analytics cache</strong>.', 'simple-google-analytics' ) . '<p>' . __( 'To improve Google Page Speed indicators Analytics caching is needed. However, it can also slightly increase your website loading speed, because Analytics js files will load locally. The second case that you might need these settings is the usual Google Analytics connection to your website. You do not need to do this with other plugins or insert the tracking code into your theme.', 'simple-google-analytics' ) . '</p></div>'
23
+ );
24
+
25
+ $options[] = array(
26
+ 'type' => 'checkbox',
27
+ 'way' => 'buttons',
28
+ 'name' => 'ga_cache',
29
+ 'title' => __( 'Google Analytics Cache', 'simple-google-analytics' ),
30
+ 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
31
+ 'hint' => __( 'If you enable this option, the plugin will begin to save a local copy of Google Analytics to speed up the loading of your website and improve Google Page Speed.', 'simple-google-analytics' ) . '<br>--<br><span class="wbcr-factory-light-orange-color">' . __( 'ATTENTION! Before using this option, remove the previously installed Google Analytics code inside your theme or plugins associated with this feature!', 'simple-google-analytics' ) . '</span>',
32
+ 'default' => false,
33
+ 'eventsOn' => array(
34
+ 'show' => '#wbcr-clearfy-performance-ga-block'
35
+ ),
36
+ 'eventsOff' => array(
37
+ 'hide' => '#wbcr-clearfy-performance-ga-block'
38
+ )
39
+
40
+ );
41
+ $options[] = array(
42
+ 'type' => 'div',
43
+ 'id' => 'wbcr-clearfy-performance-ga-block',
44
+ 'items' => array(
45
+ array(
46
+ 'type' => 'textbox',
47
+ 'way' => 'buttons',
48
+ 'name' => 'ga_tracking_id',
49
+ 'title' => __( 'Google analytic Code', 'simple-google-analytics' ),
50
+ 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
51
+ 'hint' => __( 'Set the Google Analytics tracking code.', 'simple-google-analytics' ),
52
+ 'placeholder' => 'UA-XXXXX-Y'
53
  ),
54
+ array(
55
+ 'type' => 'dropdown',
56
+ 'way' => 'buttons',
57
+ 'name' => 'ga_script_position',
58
+ 'data' => array(
59
+ array( 'header', 'Header' ),
60
+ array( 'footer', 'Footer' ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  ),
62
+ 'title' => __( 'Save GA in', 'simple-google-analytics' ),
63
+ 'hint' => __( 'Select location for the Google Analytics code.', 'simple-google-analytics' ),
64
+ 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
65
+ 'default' => 'footer'
66
+ ),
67
+ array(
68
+ 'type' => 'integer',
69
+ 'name' => 'ga_adjusted_bounce_rate',
70
+ 'title' => __( 'Use adjusted bounce rate?', 'simple-google-analytics' ),
71
+ 'default' => 0,
72
+ 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
73
+ 'hint' => __( 'Essentially, you set up an event which is triggered after a user spends a certain amount of time on the landing page, telling Google Analytics not to count these users as bounces. A user may come to your website, find all of the information they need (a phone number, for example) and then leave the site without visiting another page. Without adjusted bounce rate, such a user would be considered a bounce, even though they had a successful experience. By defining a time limit after which you can consider a user to be "engaged," that user would no longer count as a bounce, and you\'d get a more accurate idea of whether they found what they were looking for.', 'simple-google-analytics' )
74
+ ),
75
+ array(
76
+ 'type' => 'integer',
77
+ 'way' => 'buttons',
78
+ 'name' => 'ga_enqueue_order',
79
+ 'title' => __( 'Change enqueue order?', 'simple-google-analytics' ),
80
+ 'default' => 0,
81
+ 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
82
+ 'hint' => __( 'By default, Google Analytics code is loaded before other scripts and javasscript code, but if you set the value to 100, the GA code will be loaded after all other scripts. By changing the priority, you can set code position on the page.', 'simple-google-analytics' )
83
+ ),
84
+ array(
85
+ 'type' => 'checkbox',
86
+ 'way' => 'buttons',
87
+ 'name' => 'ga_disable_display_features',
88
+ 'title' => __( 'Disable all display features functionality?', 'simple-google-analytics' ),
89
+ //'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
90
+ 'hint' => sprintf( __( 'Disable all <a href="%s">display features functionality?</a>', 'simple-google-analytics' ), 'https://developers.google.com/analytics/devguides/collection/analyticsjs/display-features' ),
91
+ 'default' => false
92
+ ),
93
+ array(
94
+ 'type' => 'checkbox',
95
+ 'way' => 'buttons',
96
+ 'name' => 'ga_anonymize_ip',
97
+ 'title' => __( 'Use Anonymize IP? (Required by law for some countries)', 'simple-google-analytics' ),
98
+ //'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
99
+ 'hint' => sprintf( __( 'Use <a href="%s">Anonymize IP?</a> (Required by law for some countries)', 'simple-google-analytics' ), 'https://support.google.com/analytics/answer/2763052' ),
100
+ 'default' => false
101
+ ),
102
+ array(
103
+ 'type' => 'checkbox',
104
+ 'way' => 'buttons',
105
+ 'name' => 'ga_track_admin',
106
+ 'title' => __( 'Track logged in Administrators?', 'simple-google-analytics' ),
107
+ 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
108
+ 'hint' => __( 'Track logged in Administrators?', 'simple-google-analytics' ),
109
+ 'default' => false
110
  )
111
+ )
112
+ );
113
+
114
+ return $options;
115
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
 
117
+ /**
118
+ * @param $form
119
+ * @param $page Wbcr_FactoryPages410_ImpressiveThemplate
120
+ *
121
+ * @return mixed
122
+ */
123
+ function wbcr_ga_additionally_form_options( $form, $page ) {
124
+ if ( empty( $form ) ) {
125
  return $form;
126
  }
127
+
128
+ $options = wbcr_ga_get_plugin_options();
129
+
130
+ foreach ( array_reverse( $options ) as $option ) {
131
+ array_unshift( $form[0]['items'], $option );
132
+ }
133
+
134
+ return $form;
135
+ }
136
 
137
+ add_filter( 'wbcr_clr_google_performance_form_options', 'wbcr_ga_additionally_form_options', 10, 2 );
138
 
components/ga-cache/cache/local-ga.js CHANGED
@@ -1,58 +1,74 @@
1
- (function(){var $c=function(a){this.w=a||[]};$c.prototype.set=function(a){this.w[a]=!0};$c.prototype.encode=function(){for(var a=[],b=0;b<this.w.length;b++)this.w[b]&&(a[Math.floor(b/6)]^=1<<b%6);for(b=0;b<a.length;b++)a[b]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".charAt(a[b]||0);return a.join("")+"~"};var vd=new $c;function J(a){vd.set(a)}var Td=function(a){a=Dd(a);a=new $c(a);for(var b=vd.w.slice(),c=0;c<a.w.length;c++)b[c]=b[c]||a.w[c];return(new $c(b)).encode()},Dd=function(a){a=a.get(Gd);ka(a)||(a=[]);return a};var ea=function(a){return"function"==typeof a},ka=function(a){return"[object Array]"==Object.prototype.toString.call(Object(a))},qa=function(a){return void 0!=a&&-1<(a.constructor+"").indexOf("String")},D=function(a,b){return 0==a.indexOf(b)},sa=function(a){return a?a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,""):""},ra=function(){for(var a=O.navigator.userAgent+(M.cookie?M.cookie:"")+(M.referrer?M.referrer:""),b=a.length,c=O.history.length;0<c;)a+=c--^b++;return[hd()^La(a)&2147483647,Math.round((new Date).getTime()/
2
- 1E3)].join(".")},ta=function(a){var b=M.createElement("img");b.width=1;b.height=1;b.src=a;return b},ua=function(){},K=function(a){if(encodeURIComponent instanceof Function)return encodeURIComponent(a);J(28);return a},L=function(a,b,c,d){try{a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent&&a.attachEvent("on"+b,c)}catch(e){J(27)}},f=/^[\w\-:/.?=&%!]+$/,wa=function(a,b,c){a&&(c?(c="",b&&f.test(b)&&(c=' id="'+b+'"'),f.test(a)&&M.write("<script"+c+' src="'+a+'">\x3c/script>')):(c=M.createElement("script"),
3
- c.type="text/javascript",c.async=!0,c.src=a,b&&(c.id=b),a=M.getElementsByTagName("script")[0],a.parentNode.insertBefore(c,a)))},be=function(a,b){return E(M.location[b?"href":"search"],a)},E=function(a,b){return(a=a.match("(?:&|#|\\?)"+K(b).replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")+"=([^&#]*)"))&&2==a.length?a[1]:""},xa=function(){var a=""+M.location.hostname;return 0==a.indexOf("www.")?a.substring(4):a},de=function(a,b){var c=a.indexOf(b);if(5==c||6==c)if(a=a.charAt(c+b.length),"/"==a||"?"==a||
4
- ""==a||":"==a)return!0;return!1},ya=function(a,b){var c=M.referrer;if(/^(https?|android-app):\/\//i.test(c)){if(a)return c;a="//"+M.location.hostname;if(!de(c,a))return b&&(b=a.replace(/\./g,"-")+".cdn.ampproject.org",de(c,b))?void 0:c}},za=function(a,b){if(1==b.length&&null!=b[0]&&"object"===typeof b[0])return b[0];for(var c={},d=Math.min(a.length+1,b.length),e=0;e<d;e++)if("object"===typeof b[e]){for(var g in b[e])b[e].hasOwnProperty(g)&&(c[g]=b[e][g]);break}else e<a.length&&(c[a[e]]=b[e]);return c};var ee=function(){this.keys=[];this.values={};this.m={}};ee.prototype.set=function(a,b,c){this.keys.push(a);c?this.m[":"+a]=b:this.values[":"+a]=b};ee.prototype.get=function(a){return this.m.hasOwnProperty(":"+a)?this.m[":"+a]:this.values[":"+a]};ee.prototype.map=function(a){for(var b=0;b<this.keys.length;b++){var c=this.keys[b],d=this.get(c);d&&a(c,d)}};var O=window,M=document,va=function(a,b){return setTimeout(a,b)};var F=window,Ea=document,G=function(a){var b=F._gaUserPrefs;if(b&&b.ioo&&b.ioo()||a&&!0===F["ga-disable-"+a])return!0;try{var c=F.external;if(c&&c._gaUserPrefs&&"oo"==c._gaUserPrefs)return!0}catch(g){}a=[];b=Ea.cookie.split(";");c=/^\s*AMP_TOKEN=\s*(.*?)\s*$/;for(var d=0;d<b.length;d++){var e=b[d].match(c);e&&a.push(e[1])}for(b=0;b<a.length;b++)if("$OPT_OUT"==decodeURIComponent(a[b]))return!0;return!1};var Ca=function(a){var b=[],c=M.cookie.split(";");a=new RegExp("^\\s*"+a+"=\\s*(.*?)\\s*$");for(var d=0;d<c.length;d++){var e=c[d].match(a);e&&b.push(e[1])}return b},zc=function(a,b,c,d,e,g){e=G(e)?!1:eb.test(M.location.hostname)||"/"==c&&vc.test(d)?!1:!0;if(!e)return!1;b&&1200<b.length&&(b=b.substring(0,1200));c=a+"="+b+"; path="+c+"; ";g&&(c+="expires="+(new Date((new Date).getTime()+g)).toGMTString()+"; ");d&&"none"!==d&&(c+="domain="+d+";");d=M.cookie;M.cookie=c;if(!(d=d!=M.cookie))a:{a=Ca(a);
5
- for(d=0;d<a.length;d++)if(b==a[d]){d=!0;break a}d=!1}return d},Cc=function(a){return encodeURIComponent?encodeURIComponent(a).replace(/\(/g,"%28").replace(/\)/g,"%29"):a},vc=/^(www\.)?google(\.com?)?(\.[a-z]{2})?$/,eb=/(^|\.)doubleclick\.net$/i;var oc,Id=/^.*Version\/?(\d+)[^\d].*$/i,ne=function(){if(void 0!==O.__ga4__)return O.__ga4__;if(void 0===oc){var a=O.navigator.userAgent;if(a){var b=a;try{b=decodeURIComponent(a)}catch(c){}if(a=!(0<=b.indexOf("Chrome"))&&!(0<=b.indexOf("CriOS"))&&(0<=b.indexOf("Safari/")||0<=b.indexOf("Safari,")))b=Id.exec(b),a=11<=(b?Number(b[1]):-1);oc=a}else oc=!1}return oc};var Fa,Ga,fb,Ab,ja=/^https?:\/\/[^/]*cdn\.ampproject\.org\//,Ub=[],ic=function(){Z.D([ua])},tc=function(a,b){var c=Ca("AMP_TOKEN");if(1<c.length)return J(55),!1;c=decodeURIComponent(c[0]||"");if("$OPT_OUT"==c||"$ERROR"==c||G(b))return J(62),!1;if(!ja.test(M.referrer)&&"$NOT_FOUND"==c)return J(68),!1;if(void 0!==Ab)return J(56),va(function(){a(Ab)},0),!0;if(Fa)return Ub.push(a),!0;if("$RETRIEVING"==c)return J(57),va(function(){tc(a,b)},1E4),!0;Fa=!0;c&&"$"!=c[0]||(xc("$RETRIEVING",3E4),setTimeout(Mc,
6
- 3E4),c="");return Pc(c,b)?(Ub.push(a),!0):!1},Pc=function(a,b,c){if(!window.JSON)return J(58),!1;var d=O.XMLHttpRequest;if(!d)return J(59),!1;var e=new d;if(!("withCredentials"in e))return J(60),!1;e.open("POST",(c||"https://ampcid.google.com/v1/publisher:getClientId")+"?key=AIzaSyA65lEHUEizIsNtlbNo-l2K18dT680nsaM",!0);e.withCredentials=!0;e.setRequestHeader("Content-Type","text/plain");e.onload=function(){Fa=!1;if(4==e.readyState){try{200!=e.status&&(J(61),Qc("","$ERROR",3E4));var d=JSON.parse(e.responseText);
7
- d.optOut?(J(63),Qc("","$OPT_OUT",31536E6)):d.clientId?Qc(d.clientId,d.securityToken,31536E6):!c&&d.alternateUrl?(Ga&&clearTimeout(Ga),Fa=!0,Pc(a,b,d.alternateUrl)):(J(64),Qc("","$NOT_FOUND",36E5))}catch(ca){J(65),Qc("","$ERROR",3E4)}e=null}};d={originScope:"AMP_ECID_GOOGLE"};a&&(d.securityToken=a);e.send(JSON.stringify(d));Ga=va(function(){J(66);Qc("","$ERROR",3E4)},1E4);return!0},Mc=function(){Fa=!1},xc=function(a,b){if(void 0===fb){fb="";for(var c=id(),d=0;d<c.length;d++){var e=c[d];if(zc("AMP_TOKEN",
8
- encodeURIComponent(a),"/",e,"",b)){fb=e;return}}}zc("AMP_TOKEN",encodeURIComponent(a),"/",fb,"",b)},Qc=function(a,b,c){Ga&&clearTimeout(Ga);b&&xc(b,c);Ab=a;b=Ub;Ub=[];for(c=0;c<b.length;c++)b[c](a)};var oe=function(){return(Ba||"https:"==M.location.protocol?"https:":"http:")+"//www.google-analytics.com"},Da=function(a){this.name="len";this.message=a+"-8192"},ba=function(a,b,c){c=c||ua;if(2036>=b.length)wc(a,b,c);else if(8192>=b.length)x(a,b,c)||wd(a,b,c)||wc(a,b,c);else throw ge("len",b.length),new Da(b.length);},pe=function(a,b,c,d){d=d||ua;wd(a+"?"+b,"",d,c)},wc=function(a,b,c){var d=ta(a+"?"+b);d.onload=d.onerror=function(){d.onload=null;d.onerror=null;c()}},wd=function(a,b,c,d){var e=O.XMLHttpRequest;
9
- if(!e)return!1;var g=new e;if(!("withCredentials"in g))return!1;a=a.replace(/^http:/,"https:");g.open("POST",a,!0);g.withCredentials=!0;g.setRequestHeader("Content-Type","text/plain");g.onreadystatechange=function(){if(4==g.readyState){if(d)try{var a=g.responseText;if(1>a.length)ge("xhr","ver","0"),c();else if("1"!=a.charAt(0))ge("xhr","ver",String(a.length)),c();else if(3<d.count++)ge("xhr","tmr",""+d.count),c();else if(1==a.length)c();else{var b=a.charAt(1);if("d"==b)pe("https://stats.g.doubleclick.net/j/collect",
10
- d.U,d,c);else if("g"==b){var e="https://www.google.%/ads/ga-audiences".replace("%","com");wc(e,d.google,c);var w=a.substring(2);if(w)if(/^[a-z.]{1,6}$/.test(w)){var ha="https://www.google.%/ads/ga-audiences".replace("%",w);wc(ha,d.google,ua)}else ge("tld","bcc",w)}else ge("xhr","brc",b),c()}}catch(ue){ge("xhr","rsp"),c()}else c();g=null}};g.send(b);return!0},x=function(a,b,c){return O.navigator.sendBeacon?O.navigator.sendBeacon(a,b)?(c(),!0):!1:!1},ge=function(a,b,c){1<=100*Math.random()||G("?")||
11
- (a=["t=error","_e="+a,"_v=j68","sr=1"],b&&a.push("_f="+b),c&&a.push("_m="+K(c.substring(0,100))),a.push("aip=1"),a.push("z="+hd()),wc("https://www.google-analytics.com/u/d",a.join("&"),ua))};var h=function(a){var b=O.gaData=O.gaData||{};return b[a]=b[a]||{}};var Ha=function(){this.M=[]};Ha.prototype.add=function(a){this.M.push(a)};Ha.prototype.D=function(a){try{for(var b=0;b<this.M.length;b++){var c=a.get(this.M[b]);c&&ea(c)&&c.call(O,a)}}catch(d){}b=a.get(Ia);b!=ua&&ea(b)&&(a.set(Ia,ua,!0),setTimeout(b,10))};function Ja(a){if(100!=a.get(Ka)&&La(P(a,Q))%1E4>=100*R(a,Ka))throw"abort";}function Ma(a){if(G(P(a,Na)))throw"abort";}function Oa(){var a=M.location.protocol;if("http:"!=a&&"https:"!=a)throw"abort";}
12
- function Pa(a){try{O.navigator.sendBeacon?J(42):O.XMLHttpRequest&&"withCredentials"in new O.XMLHttpRequest&&J(40)}catch(c){}a.set(ld,Td(a),!0);a.set(Ac,R(a,Ac)+1);var b=[];Qa.map(function(c,d){d.F&&(c=a.get(c),void 0!=c&&c!=d.defaultValue&&("boolean"==typeof c&&(c*=1),b.push(d.F+"="+K(""+c))))});b.push("z="+Bd());a.set(Ra,b.join("&"),!0)}
13
- function Sa(a){var b=P(a,gd)||oe()+"/collect",c=a.get(qe),d=P(a,fa);!d&&a.get(Vd)&&(d="beacon");if(c)pe(b,P(a,Ra),c,a.get(Ia));else if(d){c=d;d=P(a,Ra);var e=a.get(Ia);e=e||ua;"image"==c?wc(b,d,e):"xhr"==c&&wd(b,d,e)||"beacon"==c&&x(b,d,e)||ba(b,d,e)}else ba(b,P(a,Ra),a.get(Ia));b=a.get(Na);b=h(b);c=b.hitcount;b.hitcount=c?c+1:1;b=a.get(Na);delete h(b).pending_experiments;a.set(Ia,ua,!0)}
14
- function Hc(a){(O.gaData=O.gaData||{}).expId&&a.set(Nc,(O.gaData=O.gaData||{}).expId);(O.gaData=O.gaData||{}).expVar&&a.set(Oc,(O.gaData=O.gaData||{}).expVar);var b=a.get(Na);if(b=h(b).pending_experiments){var c=[];for(d in b)b.hasOwnProperty(d)&&b[d]&&c.push(encodeURIComponent(d)+"."+encodeURIComponent(b[d]));var d=c.join("!")}else d=void 0;d&&a.set(m,d,!0)}function cd(){if(O.navigator&&"preview"==O.navigator.loadPurpose)throw"abort";}
15
- function yd(a){var b=O.gaDevIds;ka(b)&&0!=b.length&&a.set("&did",b.join(","),!0)}function vb(a){if(!a.get(Na))throw"abort";};var hd=function(){return Math.round(2147483647*Math.random())},Bd=function(){try{var a=new Uint32Array(1);O.crypto.getRandomValues(a);return a[0]&2147483647}catch(b){return hd()}};function Ta(a){var b=R(a,Ua);500<=b&&J(15);var c=P(a,Va);if("transaction"!=c&&"item"!=c){c=R(a,Wa);var d=(new Date).getTime(),e=R(a,Xa);0==e&&a.set(Xa,d);e=Math.round(2*(d-e)/1E3);0<e&&(c=Math.min(c+e,20),a.set(Xa,d));if(0>=c)throw"abort";a.set(Wa,--c)}a.set(Ua,++b)};var Ya=function(){this.data=new ee},Qa=new ee,Za=[];Ya.prototype.get=function(a){var b=$a(a),c=this.data.get(a);b&&void 0==c&&(c=ea(b.defaultValue)?b.defaultValue():b.defaultValue);return b&&b.Z?b.Z(this,a,c):c};var P=function(a,b){a=a.get(b);return void 0==a?"":""+a},R=function(a,b){a=a.get(b);return void 0==a||""===a?0:1*a};Ya.prototype.set=function(a,b,c){if(a)if("object"==typeof a)for(var d in a)a.hasOwnProperty(d)&&ab(this,d,a[d],c);else ab(this,a,b,c)};
16
- var ab=function(a,b,c,d){if(void 0!=c)switch(b){case Na:wb.test(c)}var e=$a(b);e&&e.o?e.o(a,b,c,d):a.data.set(b,c,d)},bb=function(a,b,c,d,e){this.name=a;this.F=b;this.Z=d;this.o=e;this.defaultValue=c},$a=function(a){var b=Qa.get(a);if(!b)for(var c=0;c<Za.length;c++){var d=Za[c],e=d[0].exec(a);if(e){b=d[1](e);Qa.set(b.name,b);break}}return b},yc=function(a){var b;Qa.map(function(c,d){d.F==a&&(b=d)});return b&&b.name},S=function(a,b,c,d,e){a=new bb(a,b,c,d,e);Qa.set(a.name,a);return a.name},cb=function(a,
17
- b){Za.push([new RegExp("^"+a+"$"),b])},T=function(a,b,c){return S(a,b,c,void 0,db)},db=function(){};var gb=qa(window.GoogleAnalyticsObject)&&sa(window.GoogleAnalyticsObject)||"ga",jd=/^(?:utma\.)?\d+\.\d+$/,kd=/^amp-[\w.-]{22,64}$/,Ba=!1,hb=T("apiVersion","v"),ib=T("clientVersion","_v");S("anonymizeIp","aip");var jb=S("adSenseId","a"),Va=S("hitType","t"),Ia=S("hitCallback"),Ra=S("hitPayload");S("nonInteraction","ni");S("currencyCode","cu");S("dataSource","ds");var Vd=S("useBeacon",void 0,!1),fa=S("transport");S("sessionControl","sc","");S("sessionGroup","sg");S("queueTime","qt");var Ac=S("_s","_s");
18
- S("screenName","cd");var kb=S("location","dl",""),lb=S("referrer","dr"),mb=S("page","dp","");S("hostname","dh");var nb=S("language","ul"),ob=S("encoding","de");S("title","dt",function(){return M.title||void 0});cb("contentGroup([0-9]+)",function(a){return new bb(a[0],"cg"+a[1])});var pb=S("screenColors","sd"),qb=S("screenResolution","sr"),rb=S("viewportSize","vp"),sb=S("javaEnabled","je"),tb=S("flashVersion","fl");S("campaignId","ci");S("campaignName","cn");S("campaignSource","cs");
19
- S("campaignMedium","cm");S("campaignKeyword","ck");S("campaignContent","cc");var ub=S("eventCategory","ec"),xb=S("eventAction","ea"),yb=S("eventLabel","el"),zb=S("eventValue","ev"),Bb=S("socialNetwork","sn"),Cb=S("socialAction","sa"),Db=S("socialTarget","st"),Eb=S("l1","plt"),Fb=S("l2","pdt"),Gb=S("l3","dns"),Hb=S("l4","rrt"),Ib=S("l5","srt"),Jb=S("l6","tcp"),Kb=S("l7","dit"),Lb=S("l8","clt"),Mb=S("timingCategory","utc"),Nb=S("timingVar","utv"),Ob=S("timingLabel","utl"),Pb=S("timingValue","utt");
20
- S("appName","an");S("appVersion","av","");S("appId","aid","");S("appInstallerId","aiid","");S("exDescription","exd");S("exFatal","exf");var Nc=S("expId","xid"),Oc=S("expVar","xvar"),m=S("exp","exp"),Rc=S("_utma","_utma"),Sc=S("_utmz","_utmz"),Tc=S("_utmht","_utmht"),Ua=S("_hc",void 0,0),Xa=S("_ti",void 0,0),Wa=S("_to",void 0,20);cb("dimension([0-9]+)",function(a){return new bb(a[0],"cd"+a[1])});cb("metric([0-9]+)",function(a){return new bb(a[0],"cm"+a[1])});S("linkerParam",void 0,void 0,Bc,db);
21
- var ld=S("usage","_u"),Gd=S("_um");S("forceSSL",void 0,void 0,function(){return Ba},function(a,b,c){J(34);Ba=!!c});var ed=S("_j1","jid"),ia=S("_j2","gjid");cb("\\&(.*)",function(a){var b=new bb(a[0],a[1]),c=yc(a[0].substring(1));c&&(b.Z=function(a){return a.get(c)},b.o=function(a,b,g,ca){a.set(c,g,ca)},b.F=void 0);return b});
22
- var Qb=T("_oot"),dd=S("previewTask"),Rb=S("checkProtocolTask"),md=S("validationTask"),Sb=S("checkStorageTask"),Uc=S("historyImportTask"),Tb=S("samplerTask"),Vb=S("_rlt"),Wb=S("buildHitTask"),Xb=S("sendHitTask"),Vc=S("ceTask"),zd=S("devIdTask"),Cd=S("timingTask"),Ld=S("displayFeaturesTask"),oa=S("customTask"),V=T("name"),Q=T("clientId","cid"),n=T("clientIdTime"),xd=T("storedClientId"),Ad=S("userId","uid"),Na=T("trackingId","tid"),U=T("cookieName",void 0,"_ga"),W=T("cookieDomain"),Yb=T("cookiePath",
23
- void 0,"/"),Zb=T("cookieExpires",void 0,63072E3),Hd=T("cookieUpdate",void 0,!0),$b=T("legacyCookieDomain"),Wc=T("legacyHistoryImport",void 0,!0),ac=T("storage",void 0,"cookie"),bc=T("allowLinker",void 0,!1),cc=T("allowAnchor",void 0,!0),Ka=T("sampleRate","sf",100),dc=T("siteSpeedSampleRate",void 0,1),ec=T("alwaysSendReferrer",void 0,!1),I=T("_gid","_gid"),la=T("_gcn"),Kd=T("useAmpClientId"),ce=T("_gclid"),fe=T("_gt"),he=T("_ge",void 0,7776E6),ie=T("_gclsrc"),je=T("storeGac",void 0,!0),gd=S("transportUrl"),
24
- Md=S("_r","_r"),qe=S("_dp"),Ud=S("allowAdFeatures",void 0,!0);function X(a,b,c,d){b[a]=function(){try{return d&&J(d),c.apply(this,arguments)}catch(e){throw ge("exc",a,e&&e.name),e;}}};var Od=function(){this.V=100;this.$=this.fa=!1;this.oa="detourexp";this.groups=1},Ed=function(a){var b=new Od,c;if(b.fa&&b.$)return 0;b.$=!0;if(a){if(b.oa&&void 0!==a.get(b.oa))return R(a,b.oa);if(0==a.get(dc))return 0}if(0==b.V)return 0;void 0===c&&(c=Bd());return 0==c%b.V?Math.floor(c/b.V)%b.groups+1:0};function fc(){var a,b;if((b=(b=O.navigator)?b.plugins:null)&&b.length)for(var c=0;c<b.length&&!a;c++){var d=b[c];-1<d.name.indexOf("Shockwave Flash")&&(a=d.description)}if(!a)try{var e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");a=e.GetVariable("$version")}catch(g){}if(!a)try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"),a="WIN 6,0,21,0",e.AllowScriptAccess="always",a=e.GetVariable("$version")}catch(g){}if(!a)try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"),a=e.GetVariable("$version")}catch(g){}a&&
25
- (e=a.match(/[\d]+/g))&&3<=e.length&&(a=e[0]+"."+e[1]+" r"+e[2]);return a||void 0};var aa=function(a){var b=Math.min(R(a,dc),100);return La(P(a,Q))%100>=b?!1:!0},gc=function(a){var b={};if(Ec(b)||Fc(b)){var c=b[Eb];void 0==c||Infinity==c||isNaN(c)||(0<c?(Y(b,Gb),Y(b,Jb),Y(b,Ib),Y(b,Fb),Y(b,Hb),Y(b,Kb),Y(b,Lb),va(function(){a(b)},10)):L(O,"load",function(){gc(a)},!1))}},Ec=function(a){var b=O.performance||O.webkitPerformance;b=b&&b.timing;if(!b)return!1;var c=b.navigationStart;if(0==c)return!1;a[Eb]=b.loadEventStart-c;a[Gb]=b.domainLookupEnd-b.domainLookupStart;a[Jb]=b.connectEnd-
26
- b.connectStart;a[Ib]=b.responseStart-b.requestStart;a[Fb]=b.responseEnd-b.responseStart;a[Hb]=b.fetchStart-c;a[Kb]=b.domInteractive-c;a[Lb]=b.domContentLoadedEventStart-c;return!0},Fc=function(a){if(O.top!=O)return!1;var b=O.external,c=b&&b.onloadT;b&&!b.isValidLoadTime&&(c=void 0);2147483648<c&&(c=void 0);0<c&&b.setPageReadyTime();if(void 0==c)return!1;a[Eb]=c;return!0},Y=function(a,b){var c=a[b];if(isNaN(c)||Infinity==c||0>c)a[b]=void 0},Fd=function(a){return function(b){if("pageview"==b.get(Va)&&
27
- !a.I){a.I=!0;var c=aa(b),d=0<E(b.get(kb),"gclid").length;(c||d)&&gc(function(b){c&&a.send("timing",b);d&&a.send("adtiming",b)})}}};var hc=!1,mc=function(a){if("cookie"==P(a,ac)){if(a.get(Hd)||P(a,xd)!=P(a,Q)){var b=1E3*R(a,Zb);ma(a,Q,U,b)}ma(a,I,la,864E5);if(a.get(je)){var c=a.get(ce);if(c){var d=Math.min(R(a,he),1E3*R(a,Zb));d=Math.min(d,1E3*R(a,fe)+d-(new Date).getTime());a.data.set(he,d);b={};var e=a.get(fe),g=a.get(ie),ca=kc(P(a,Yb)),l=lc(P(a,W)),k=P(a,Na);g&&"aw.ds"!=g?b&&(b.ua=!0):(c=["1",e,Cc(c)].join("."),0<d&&(b&&(b.ta=!0),zc("_gac_"+Cc(k),c,ca,l,k,d)));le(b)}}else J(75);if(a="none"===lc(P(a,W)))a=M.location.hostname,
28
- a=eb.test(a)||vc.test(a);a&&J(30)}},ma=function(a,b,c,d){var e=nd(a,b);if(e){c=P(a,c);var g=kc(P(a,Yb)),ca=lc(P(a,W)),l=P(a,Na);if("auto"!=ca)zc(c,e,g,ca,l,d)&&(hc=!0);else{J(32);for(var k=id(),w=0;w<k.length;w++)if(ca=k[w],a.data.set(W,ca),e=nd(a,b),zc(c,e,g,ca,l,d)){hc=!0;return}a.data.set(W,"auto")}}},nc=function(a){if("cookie"==P(a,ac)&&!hc&&(mc(a),!hc))throw"abort";},Yc=function(a){if(a.get(Wc)){var b=P(a,W),c=P(a,$b)||xa(),d=Xc("__utma",c,b);d&&(J(19),a.set(Tc,(new Date).getTime(),!0),a.set(Rc,
29
- d.R),(b=Xc("__utmz",c,b))&&d.hash==b.hash&&a.set(Sc,b.R))}},nd=function(a,b){b=Cc(P(a,b));var c=lc(P(a,W)).split(".").length;a=jc(P(a,Yb));1<a&&(c+="-"+a);return b?["GA1",c,b].join("."):""},Xd=function(a,b){return na(b,P(a,W),P(a,Yb))},na=function(a,b,c){if(!a||1>a.length)J(12);else{for(var d=[],e=0;e<a.length;e++){var g=a[e];var ca=g.split(".");var l=ca.shift();("GA1"==l||"1"==l)&&1<ca.length?(g=ca.shift().split("-"),1==g.length&&(g[1]="1"),g[0]*=1,g[1]*=1,ca={H:g,s:ca.join(".")}):ca=kd.test(g)?
30
- {H:[0,0],s:g}:void 0;ca&&d.push(ca)}if(1==d.length)return J(13),d[0].s;if(0==d.length)J(12);else{J(14);d=Gc(d,lc(b).split(".").length,0);if(1==d.length)return d[0].s;d=Gc(d,jc(c),1);1<d.length&&J(41);return d[0]&&d[0].s}}},Gc=function(a,b,c){for(var d=[],e=[],g,ca=0;ca<a.length;ca++){var l=a[ca];l.H[c]==b?d.push(l):void 0==g||l.H[c]<g?(e=[l],g=l.H[c]):l.H[c]==g&&e.push(l)}return 0<d.length?d:e},lc=function(a){return 0==a.indexOf(".")?a.substr(1):a},id=function(){var a=[],b=xa().split(".");if(4==b.length){var c=
31
- b[b.length-1];if(parseInt(c,10)==c)return["none"]}for(c=b.length-2;0<=c;c--)a.push(b.slice(c).join("."));a.push("none");return a},kc=function(a){if(!a)return"/";1<a.length&&a.lastIndexOf("/")==a.length-1&&(a=a.substr(0,a.length-1));0!=a.indexOf("/")&&(a="/"+a);return a},jc=function(a){a=kc(a);return"/"==a?1:a.split("/").length},le=function(a){a.ta&&J(77);a.na&&J(74);a.pa&&J(73);a.ua&&J(69)};function Xc(a,b,c){"none"==b&&(b="");var d=[],e=Ca(a);a="__utma"==a?6:2;for(var g=0;g<e.length;g++){var ca=(""+e[g]).split(".");ca.length>=a&&d.push({hash:ca[0],R:e[g],O:ca})}if(0!=d.length)return 1==d.length?d[0]:Zc(b,d)||Zc(c,d)||Zc(null,d)||d[0]}function Zc(a,b){if(null==a)var c=a=1;else c=La(a),a=La(D(a,".")?a.substring(1):"."+a);for(var d=0;d<b.length;d++)if(b[d].hash==c||b[d].hash==a)return b[d]};var od=new RegExp(/^https?:\/\/([^\/:]+)/),pd=/(.*)([?&#])(?:_ga=[^&#]*)(?:&?)(.*)/,me=/(.*)([?&#])(?:_gac=[^&#]*)(?:&?)(.*)/;function Bc(a){var b=a.get(Q),c=a.get(I)||"";b="_ga=2."+K(pa(c+b,0)+"."+c+"-"+b);if((c=a.get(ce))&&a.get(je)){var d=R(a,fe);1E3*d+R(a,he)<=(new Date).getTime()?(J(76),a=""):(J(44),a="&_gac=1."+K([pa(c,0),d,c].join(".")))}else a="";return b+a}
32
- function Ic(a,b){var c=new Date,d=O.navigator,e=d.plugins||[];a=[a,d.userAgent,c.getTimezoneOffset(),c.getYear(),c.getDate(),c.getHours(),c.getMinutes()+b];for(b=0;b<e.length;++b)a.push(e[b].description);return La(a.join("."))}function pa(a,b){var c=new Date,d=O.navigator,e=c.getHours()+Math.floor((c.getMinutes()+b)/60);return La([a,d.userAgent,d.language||"",c.getTimezoneOffset(),c.getYear(),c.getDate()+Math.floor(e/24),(24+e)%24,(60+c.getMinutes()+b)%60].join("."))}
33
- var Dc=function(a){J(48);this.target=a;this.T=!1};Dc.prototype.ca=function(a,b){if(a.tagName){if("a"==a.tagName.toLowerCase()){a.href&&(a.href=qd(this,a.href,b));return}if("form"==a.tagName.toLowerCase())return rd(this,a)}if("string"==typeof a)return qd(this,a,b)};
34
- var qd=function(a,b,c){var d=pd.exec(b);d&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));(d=me.exec(b))&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));a=a.target.get("linkerParam");var e=b.indexOf("?");d=b.indexOf("#");c?b+=(-1==d?"#":"&")+a:(c=-1==e?"?":"&",b=-1==d?b+(c+a):b.substring(0,d)+c+a+b.substring(d));b=b.replace(/&+_ga=/,"&_ga=");return b=b.replace(/&+_gac=/,"&_gac=")},rd=function(a,b){if(b&&b.action)if("get"==b.method.toLowerCase()){a=a.target.get("linkerParam").split("&");for(var c=0;c<a.length;c++){var d=
35
- a[c].split("="),e=d[1];d=d[0];for(var g=b.childNodes||[],ca=!1,l=0;l<g.length;l++)if(g[l].name==d){g[l].setAttribute("value",e);ca=!0;break}ca||(g=M.createElement("input"),g.setAttribute("type","hidden"),g.setAttribute("name",d),g.setAttribute("value",e),b.appendChild(g))}}else"post"==b.method.toLowerCase()&&(b.action=qd(a,b.action))};
36
- Dc.prototype.S=function(a,b,c){function d(c){try{c=c||O.event;a:{var d=c.target||c.srcElement;for(c=100;d&&0<c;){if(d.href&&d.nodeName.match(/^a(?:rea)?$/i)){var g=d;break a}d=d.parentNode;c--}g={}}("http:"==g.protocol||"https:"==g.protocol)&&sd(a,g.hostname||"")&&g.href&&(g.href=qd(e,g.href,b))}catch(k){J(26)}}var e=this;this.T||(this.T=!0,L(M,"mousedown",d,!1),L(M,"keyup",d,!1));c&&L(M,"submit",function(b){b=b||O.event;if((b=b.target||b.srcElement)&&b.action){var c=b.action.match(od);c&&sd(a,c[1])&&
37
- rd(e,b)}})};function sd(a,b){if(b==M.location.hostname)return!1;for(var c=0;c<a.length;c++)if(a[c]instanceof RegExp){if(a[c].test(b))return!0}else if(0<=b.indexOf(a[c]))return!0;return!1}function ke(a,b){return b!=Ic(a,0)&&b!=Ic(a,-1)&&b!=Ic(a,-2)&&b!=pa(a,0)&&b!=pa(a,-1)&&b!=pa(a,-2)};var p=/^(GTM|OPT)-[A-Z0-9]+$/,q=/;_gaexp=[^;]*/g,r=/;((__utma=)|([^;=]+=GAX?\d+\.))[^;]*/g,Aa=/^https?:\/\/[\w\-.]+\.google.com(:\d+)?\/optimize\/opt-launch\.html\?.*$/,t=function(a){function b(a,b){b&&(c+="&"+a+"="+K(b))}var c="https://www.google-analytics.com/gtm/js?id="+K(a.id);"dataLayer"!=a.B&&b("l",a.B);b("t",a.target);b("cid",a.clientId);b("cidt",a.ka);b("gac",a.la);b("aip",a.ia);a.sync&&b("m","sync");b("cycle",a.G);a.qa&&b("gclid",a.qa);Aa.test(M.referrer)&&b("cb",String(hd()));return c};var Jd=function(a,b,c){this.aa=b;(b=c)||(b=(b=P(a,V))&&"t0"!=b?Wd.test(b)?"_gat_"+Cc(P(a,Na)):"_gat_"+Cc(b):"_gat");this.Y=b;this.ra=null},Rd=function(a,b){var c=b.get(Wb);b.set(Wb,function(b){Pd(a,b,ed);Pd(a,b,ia);var d=c(b);Qd(a,b);return d});var d=b.get(Xb);b.set(Xb,function(b){var c=d(b);if(se(b)){if(ne()!==H(a,b)){J(80);var e={U:re(a,b,1),google:re(a,b,2),count:0};pe("https://stats.g.doubleclick.net/j/collect",e.U,e)}else ta(re(a,b,0));b.set(ed,"",!0)}return c})},Pd=function(a,b,c){!1===b.get(Ud)||
38
- b.get(c)||("1"==Ca(a.Y)[0]?b.set(c,"",!0):b.set(c,""+hd(),!0))},Qd=function(a,b){se(b)&&zc(a.Y,"1",b.get(Yb),b.get(W),b.get(Na),6E4)},se=function(a){return!!a.get(ed)&&a.get(Ud)},re=function(a,b,c){var d=new ee,e=function(a){$a(a).F&&d.set($a(a).F,b.get(a))};e(hb);e(ib);e(Na);e(Q);e(ed);if(0==c||1==c)e(Ad),e(ia),e(I);d.set($a(ld).F,Td(b));var g="";d.map(function(a,b){g+=K(a)+"=";g+=K(""+b)+"&"});g+="z="+hd();0==c?g=a.aa+g:1==c?g="t=dc&aip=1&_r=3&"+g:2==c&&(g="t=sr&aip=1&_r=4&slf_rd=1&"+g);return g},
39
- H=function(a,b){null===a.ra&&(a.ra=1===Ed(b),a.ra&&J(33));return a.ra},Wd=/^gtm\d+$/;var fd=function(a,b){a=a.b;if(!a.get("dcLoaded")){var c=new $c(Dd(a));c.set(29);a.set(Gd,c.w);b=b||{};var d;b[U]&&(d=Cc(b[U]));b=new Jd(a,"https://stats.g.doubleclick.net/r/collect?t=dc&aip=1&_r=3&",d);Rd(b,a);a.set("dcLoaded",!0)}};var Sd=function(a){if(!a.get("dcLoaded")&&"cookie"==a.get(ac)){var b=new Jd(a);Pd(b,a,ed);Pd(b,a,ia);Qd(b,a);if(se(a)){var c=ne()!==H(b,a);a.set(Md,1,!0);c?(J(79),a.set(gd,oe()+"/j/collect",!0),a.set(qe,{U:re(b,a,1),google:re(b,a,2),count:0},!0)):a.set(gd,oe()+"/r/collect",!0)}}};var Lc=function(){var a=O.gaGlobal=O.gaGlobal||{};return a.hid=a.hid||hd()};var ad,bd=function(a,b,c){if(!ad){var d=M.location.hash;var e=O.name,g=/^#?gaso=([^&]*)/;if(e=(d=(d=d&&d.match(g)||e&&e.match(g))?d[1]:Ca("GASO")[0]||"")&&d.match(/^(?:!([-0-9a-z.]{1,40})!)?([-.\w]{10,1200})$/i))zc("GASO",""+d,c,b,a,0),window._udo||(window._udo=b),window._utcp||(window._utcp=c),a=e[1],wa("https://www.google.com/analytics/web/inpage/pub/inpage.js?"+(a?"prefix="+a+"&":"")+hd(),"_gasojs");ad=!0}};var wb=/^(UA|YT|MO|GP)-(\d+)-(\d+)$/,pc=function(a){function b(a,b){d.b.data.set(a,b)}function c(a,c){b(a,c);d.filters.add(a)}var d=this;this.b=new Ya;this.filters=new Ha;b(V,a[V]);b(Na,sa(a[Na]));b(U,a[U]);b(W,a[W]||xa());b(Yb,a[Yb]);b(Zb,a[Zb]);b(Hd,a[Hd]);b($b,a[$b]);b(Wc,a[Wc]);b(bc,a[bc]);b(cc,a[cc]);b(Ka,a[Ka]);b(dc,a[dc]);b(ec,a[ec]);b(ac,a[ac]);b(Ad,a[Ad]);b(n,a[n]);b(Kd,a[Kd]);b(je,a[je]);b(hb,1);b(ib,"j68");c(Qb,Ma);c(oa,ua);c(dd,cd);c(Rb,Oa);c(md,vb);c(Sb,nc);c(Uc,Yc);c(Tb,Ja);c(Vb,Ta);
40
- c(Vc,Hc);c(zd,yd);c(Ld,Sd);c(Wb,Pa);c(Xb,Sa);c(Cd,Fd(this));Kc(this.b);Jc(this.b,a[Q]);this.b.set(jb,Lc());bd(this.b.get(Na),this.b.get(W),this.b.get(Yb))},Jc=function(a,b){var c=P(a,U);a.data.set(la,"_ga"==c?"_gid":c+"_gid");if("cookie"==P(a,ac)){hc=!1;c=Ca(P(a,U));c=Xd(a,c);if(!c){c=P(a,W);var d=P(a,$b)||xa();c=Xc("__utma",d,c);void 0!=c?(J(10),c=c.O[1]+"."+c.O[2]):c=void 0}c&&(hc=!0);if(d=c&&!a.get(Hd))if(d=c.split("."),2!=d.length)d=!1;else if(d=Number(d[1])){var e=R(a,Zb);d=d+e<(new Date).getTime()/
41
- 1E3}else d=!1;d&&(c=void 0);c&&(a.data.set(xd,c),a.data.set(Q,c),c=Ca(P(a,la)),(c=Xd(a,c))&&a.data.set(I,c));if(a.get(je)&&(c=a.get(ce),d=a.get(ie),!c||d&&"aw.ds"!=d)){c={};if(M){d=[];e=M.cookie.split(";");for(var g=/^\s*_gac_(UA-\d+-\d+)=\s*(.+?)\s*$/,ca=0;ca<e.length;ca++){var l=e[ca].match(g);l&&d.push({ja:l[1],value:l[2]})}e={};if(d&&d.length)for(g=0;g<d.length;g++)(ca=d[g].value.split("."),"1"!=ca[0]||3!=ca.length)?c&&(c.na=!0):ca[1]&&(e[d[g].ja]?c&&(c.pa=!0):e[d[g].ja]=[],e[d[g].ja].push({timestamp:ca[1],
42
- qa:ca[2]}));d=e}else d={};d=d[P(a,Na)];le(c);d&&0!=d.length&&(c=d[0],a.data.set(fe,c.timestamp),a.data.set(ce,c.qa))}}if(a.get(Hd))a:if(d=be("_ga",a.get(cc)))if(a.get(bc))if(c=d.indexOf("."),-1==c)J(22);else{e=d.substring(0,c);g=d.substring(c+1);c=g.indexOf(".");d=g.substring(0,c);g=g.substring(c+1);if("1"==e){if(c=g,ke(c,d)){J(23);break a}}else if("2"==e){c=g.indexOf("-");e="";0<c?(e=g.substring(0,c),c=g.substring(c+1)):c=g.substring(1);if(ke(e+c,d)){J(53);break a}e&&(J(2),a.data.set(I,e))}else{J(22);
43
- break a}J(11);a.data.set(Q,c);if(c=be("_gac",a.get(cc)))c=c.split("."),"1"!=c[0]||4!=c.length?J(72):ke(c[3],c[1])?J(71):(a.data.set(ce,c[3]),a.data.set(fe,c[2]),J(70))}else J(21);b&&(J(9),a.data.set(Q,K(b)));a.get(Q)||((b=(b=O.gaGlobal&&O.gaGlobal.vid)&&-1!=b.search(jd)?b:void 0)?(J(17),a.data.set(Q,b)):(J(8),a.data.set(Q,ra())));a.get(I)||(J(3),a.data.set(I,ra()));mc(a)},Kc=function(a){var b=O.navigator,c=O.screen,d=M.location;a.set(lb,ya(a.get(ec),a.get(Kd)));if(d){var e=d.pathname||"";"/"!=e.charAt(0)&&
44
- (J(31),e="/"+e);a.set(kb,d.protocol+"//"+d.hostname+e+d.search)}c&&a.set(qb,c.width+"x"+c.height);c&&a.set(pb,c.colorDepth+"-bit");c=M.documentElement;var g=(e=M.body)&&e.clientWidth&&e.clientHeight,ca=[];c&&c.clientWidth&&c.clientHeight&&("CSS1Compat"===M.compatMode||!g)?ca=[c.clientWidth,c.clientHeight]:g&&(ca=[e.clientWidth,e.clientHeight]);c=0>=ca[0]||0>=ca[1]?"":ca.join("x");a.set(rb,c);a.set(tb,fc());a.set(ob,M.characterSet||M.charset);a.set(sb,b&&"function"===typeof b.javaEnabled&&b.javaEnabled()||
45
- !1);a.set(nb,(b&&(b.language||b.browserLanguage)||"").toLowerCase());a.data.set(ce,be("gclid",!0));a.data.set(ie,be("gclsrc",!0));a.data.set(fe,Math.round((new Date).getTime()/1E3));if(d&&a.get(cc)&&(b=M.location.hash)){b=b.split(/[?&#]+/);d=[];for(c=0;c<b.length;++c)(D(b[c],"utm_id")||D(b[c],"utm_campaign")||D(b[c],"utm_source")||D(b[c],"utm_medium")||D(b[c],"utm_term")||D(b[c],"utm_content")||D(b[c],"gclid")||D(b[c],"dclid")||D(b[c],"gclsrc"))&&d.push(b[c]);0<d.length&&(b="#"+d.join("&"),a.set(kb,
46
- a.get(kb)+b))}};pc.prototype.get=function(a){return this.b.get(a)};pc.prototype.set=function(a,b){this.b.set(a,b)};var qc={pageview:[mb],event:[ub,xb,yb,zb],social:[Bb,Cb,Db],timing:[Mb,Nb,Pb,Ob]};pc.prototype.send=function(a){if(!(1>arguments.length)){if("string"===typeof arguments[0]){var b=arguments[0];var c=[].slice.call(arguments,1)}else b=arguments[0]&&arguments[0][Va],c=arguments;b&&(c=za(qc[b]||[],c),c[Va]=b,this.b.set(c,void 0,!0),this.filters.D(this.b),this.b.data.m={})}};
47
- pc.prototype.ma=function(a,b){var c=this;u(a,c,b)||(v(a,function(){u(a,c,b)}),y(String(c.get(V)),a,void 0,b,!0))};var rc=function(a){if("prerender"==M.visibilityState)return!1;a();return!0},z=function(a){if(!rc(a)){J(16);var b=!1,c=function(){if(!b&&rc(a)){b=!0;var d=c,e=M;e.removeEventListener?e.removeEventListener("visibilitychange",d,!1):e.detachEvent&&e.detachEvent("onvisibilitychange",d)}};L(M,"visibilitychange",c)}};var td=/^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/,sc=function(a){if(ea(a[0]))this.u=a[0];else{var b=td.exec(a[0]);null!=b&&4==b.length&&(this.c=b[1]||"t0",this.K=b[2]||"",this.C=b[3],this.a=[].slice.call(a,1),this.K||(this.A="create"==this.C,this.i="require"==this.C,this.g="provide"==this.C,this.ba="remove"==this.C),this.i&&(3<=this.a.length?(this.X=this.a[1],this.W=this.a[2]):this.a[1]&&(qa(this.a[1])?this.X=this.a[1]:this.W=this.a[1])));b=a[1];a=a[2];if(!this.C)throw"abort";if(this.i&&(!qa(b)||""==b))throw"abort";
48
- if(this.g&&(!qa(b)||""==b||!ea(a)))throw"abort";if(ud(this.c)||ud(this.K))throw"abort";if(this.g&&"t0"!=this.c)throw"abort";}};function ud(a){return 0<=a.indexOf(".")||0<=a.indexOf(":")};var Yd,Zd,$d,A;Yd=new ee;$d=new ee;A=new ee;Zd={ec:45,ecommerce:46,linkid:47};
49
- var u=function(a,b,c){b==N||b.get(V);var d=Yd.get(a);if(!ea(d))return!1;b.plugins_=b.plugins_||new ee;if(b.plugins_.get(a))return!0;b.plugins_.set(a,new d(b,c||{}));return!0},y=function(a,b,c,d,e){if(!ea(Yd.get(b))&&!$d.get(b)){Zd.hasOwnProperty(b)&&J(Zd[b]);if(p.test(b)){J(52);a=N.j(a);if(!a)return!0;c=d||{};d={id:b,B:c.dataLayer||"dataLayer",ia:!!a.get("anonymizeIp"),sync:e,G:!1};a.get("&gtm")==b&&(d.G=!0);var g=String(a.get("name"));"t0"!=g&&(d.target=g);G(String(a.get("trackingId")))||(d.clientId=
50
- String(a.get(Q)),d.ka=Number(a.get(n)),c=c.palindrome?r:q,c=(c=M.cookie.replace(/^|(; +)/g,";").match(c))?c.sort().join("").substring(1):void 0,d.la=c,d.qa=E(a.b.get(kb)||"","gclid"));a=d.B;c=(new Date).getTime();O[a]=O[a]||[];c={"gtm.start":c};e||(c.event="gtm.js");O[a].push(c);c=t(d)}!c&&Zd.hasOwnProperty(b)?(J(39),c=b+".js"):J(43);c&&(c&&0<=c.indexOf("/")||(c=(Ba||"https:"==M.location.protocol?"https:":"http:")+"//www.google-analytics.com/plugins/ua/"+c),d=ae(c),a=d.protocol,c=M.location.protocol,
51
- ("https:"==a||a==c||("http:"!=a?0:"http:"==c))&&B(d)&&(wa(d.url,void 0,e),$d.set(b,!0)))}},v=function(a,b){var c=A.get(a)||[];c.push(b);A.set(a,c)},C=function(a,b){Yd.set(a,b);b=A.get(a)||[];for(var c=0;c<b.length;c++)b[c]();A.set(a,[])},B=function(a){var b=ae(M.location.href);if(D(a.url,"https://www.google-analytics.com/gtm/js?id="))return!0;if(a.query||0<=a.url.indexOf("?")||0<=a.path.indexOf("://"))return!1;if(a.host==b.host&&a.port==b.port)return!0;b="http:"==a.protocol?80:443;return"www.google-analytics.com"==
52
- a.host&&(a.port||b)==b&&D(a.path,"/plugins/")?!0:!1},ae=function(a){function b(a){var b=(a.hostname||"").split(":")[0].toLowerCase(),c=(a.protocol||"").toLowerCase();c=1*a.port||("http:"==c?80:"https:"==c?443:"");a=a.pathname||"";D(a,"/")||(a="/"+a);return[b,""+c,a]}var c=M.createElement("a");c.href=M.location.href;var d=(c.protocol||"").toLowerCase(),e=b(c),g=c.search||"",ca=d+"//"+e[0]+(e[1]?":"+e[1]:"");D(a,"//")?a=d+a:D(a,"/")?a=ca+a:!a||D(a,"?")?a=ca+e[2]+(a||g):0>a.split("/")[0].indexOf(":")&&
53
- (a=ca+e[2].substring(0,e[2].lastIndexOf("/"))+"/"+a);c.href=a;d=b(c);return{protocol:(c.protocol||"").toLowerCase(),host:d[0],port:d[1],path:d[2],query:c.search||"",url:a||""}};var Z={ga:function(){Z.f=[]}};Z.ga();Z.D=function(a){var b=Z.J.apply(Z,arguments);b=Z.f.concat(b);for(Z.f=[];0<b.length&&!Z.v(b[0])&&!(b.shift(),0<Z.f.length););Z.f=Z.f.concat(b)};Z.J=function(a){for(var b=[],c=0;c<arguments.length;c++)try{var d=new sc(arguments[c]);d.g?C(d.a[0],d.a[1]):(d.i&&(d.ha=y(d.c,d.a[0],d.X,d.W)),b.push(d))}catch(e){}return b};
54
- Z.v=function(a){try{if(a.u)a.u.call(O,N.j("t0"));else{var b=a.c==gb?N:N.j(a.c);if(a.A){if("t0"==a.c&&(b=N.create.apply(N,a.a),null===b))return!0}else if(a.ba)N.remove(a.c);else if(b)if(a.i){if(a.ha&&(a.ha=y(a.c,a.a[0],a.X,a.W)),!u(a.a[0],b,a.W))return!0}else if(a.K){var c=a.C,d=a.a,e=b.plugins_.get(a.K);e[c].apply(e,d)}else b[a.C].apply(b,a.a)}}catch(g){}};var N=function(a){J(1);Z.D.apply(Z,[arguments])};N.h={};N.P=[];N.L=0;N.answer=42;var uc=[Na,W,V];
55
- N.create=function(a){var b=za(uc,[].slice.call(arguments));b[V]||(b[V]="t0");var c=""+b[V];if(N.h[c])return N.h[c];a:{if(b[Kd]){J(67);if(b[ac]&&"cookie"!=b[ac]){var d=!1;break a}if(void 0!==Ab)b[Q]||(b[Q]=Ab);else{b:{d=String(b[W]||xa());var e=String(b[Yb]||"/"),g=Ca(String(b[U]||"_ga"));d=na(g,d,e);if(!d||jd.test(d))d=!0;else if(d=Ca("AMP_TOKEN"),0==d.length)d=!0;else{if(1==d.length&&(d=decodeURIComponent(d[0]),"$RETRIEVING"==d||"$OPT_OUT"==d||"$ERROR"==d||"$NOT_FOUND"==d)){d=!0;break b}d=!1}}if(d&&
56
- tc(ic,String(b[Na]))){d=!0;break a}}}d=!1}if(d)return null;b=new pc(b);N.h[c]=b;N.P.push(b);return b};N.remove=function(a){for(var b=0;b<N.P.length;b++)if(N.P[b].get(V)==a){N.P.splice(b,1);N.h[a]=null;break}};N.j=function(a){return N.h[a]};N.getAll=function(){return N.P.slice(0)};
57
- N.N=function(){"ga"!=gb&&J(49);var a=O[gb];if(!a||42!=a.answer){N.L=a&&a.l;N.loaded=!0;var b=O[gb]=N;X("create",b,b.create);X("remove",b,b.remove);X("getByName",b,b.j,5);X("getAll",b,b.getAll,6);b=pc.prototype;X("get",b,b.get,7);X("set",b,b.set,4);X("send",b,b.send);X("requireSync",b,b.ma);b=Ya.prototype;X("get",b,b.get);X("set",b,b.set);if("https:"!=M.location.protocol&&!Ba){a:{b=M.getElementsByTagName("script");for(var c=0;c<b.length&&100>c;c++){var d=b[c].src;if(d&&0==d.indexOf("https://www.google-analytics.com/analytics")){b=
58
- !0;break a}}b=!1}b&&(Ba=!0)}(O.gaplugins=O.gaplugins||{}).Linker=Dc;b=Dc.prototype;C("linker",Dc);X("decorate",b,b.ca,20);X("autoLink",b,b.S,25);C("displayfeatures",fd);C("adfeatures",fd);a=a&&a.q;ka(a)?Z.D.apply(N,a):J(50)}};N.da=function(){for(var a=N.getAll(),b=0;b<a.length;b++)a[b].get(V)};var da=N.N,Nd=O[gb];Nd&&Nd.r?da():z(da);z(function(){Z.D(["provide","render",ua])});function La(a){var b=1,c;if(a)for(b=0,c=a.length-1;0<=c;c--){var d=a.charCodeAt(c);b=(b<<6&268435455)+d+(d<<14);d=b&266338304;b=0!=d?b^d>>21:b}return b};})(window);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function(){var k=this,l=function(a,b){a=a.split(".");var c=k;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[d]=b};var m=function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c])},n=function(a){for(var b in a)if(a.hasOwnProperty(b))return!0;return!1};var q=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;var r=window,t=document,u=function(a,b){t.addEventListener?t.addEventListener(a,b,!1):t.attachEvent&&t.attachEvent("on"+a,b)};var v=/:[0-9]+$/,x=function(a,b){b&&(b=String(b).toLowerCase());if("protocol"===b||"port"===b)a.protocol=w(a.protocol)||w(r.location.protocol);"port"===b?a.port=String(Number(a.hostname?a.port:r.location.port)||("http"==a.protocol?80:"https"==a.protocol?443:"")):"host"===b&&(a.hostname=(a.hostname||r.location.hostname).replace(v,"").toLowerCase());var c=w(a.protocol);b&&(b=String(b).toLowerCase());switch(b){case "url_no_fragment":b="";a&&a.href&&(b=a.href.indexOf("#"),b=0>b?a.href:a.href.substr(0,
2
+ b));a=b;break;case "protocol":a=c;break;case "host":a=a.hostname.replace(v,"").toLowerCase();break;case "port":a=String(Number(a.port)||("http"==c?80:"https"==c?443:""));break;case "path":a="/"==a.pathname.substr(0,1)?a.pathname:"/"+a.pathname;a=a.split("/");a:if(b=a[a.length-1],c=[],Array.prototype.indexOf)b=c.indexOf(b),b="number"==typeof b?b:-1;else{for(var d=0;d<c.length;d++)if(c[d]===b){b=d;break a}b=-1}0<=b&&(a[a.length-1]="");a=a.join("/");break;case "query":a=a.search.replace("?","");break;
3
+ case "extension":a=a.pathname.split(".");a=1<a.length?a[a.length-1]:"";a=a.split("/")[0];break;case "fragment":a=a.hash.replace("#","");break;default:a=a&&a.href}return a},w=function(a){return a?a.replace(":","").toLowerCase():""},y=function(a){var b=t.createElement("a");a&&(b.href=a);a=b.pathname;"/"!==a[0]&&(a="/"+a);var c=b.hostname.replace(v,"");return{href:b.href,protocol:b.protocol,host:b.host,hostname:c,pathname:a,search:b.search,hash:b.hash,port:b.port}};function z(){for(var a=A,b={},c=0;c<a.length;++c)b[a[c]]=c;return b}function B(){var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ";a+=a.toLowerCase()+"0123456789-_";return a+"."}
4
+ var A,C,D=function(a){A=A||B();C=C||z();for(var b=[],c=0;c<a.length;c+=3){var d=c+1<a.length,e=c+2<a.length,g=a.charCodeAt(c),f=d?a.charCodeAt(c+1):0,h=e?a.charCodeAt(c+2):0,p=g>>2;g=(g&3)<<4|f>>4;f=(f&15)<<2|h>>6;h&=63;e||(h=64,d||(f=64));b.push(A[p],A[g],A[f],A[h])}return b.join("")},E=function(a){function b(b){for(;d<a.length;){var c=a.charAt(d++),e=C[c];if(null!=e)return e;if(!/^[\s\xa0]*$/.test(c))throw Error("Unknown base64 encoding at char: "+c);}return b}A=A||B();C=C||z();for(var c="",d=0;;){var e=
5
+ b(-1),g=b(0),f=b(64),h=b(64);if(64===h&&-1===e)return c;c+=String.fromCharCode(e<<2|g>>4);64!=f&&(c+=String.fromCharCode(g<<4&240|f>>2),64!=h&&(c+=String.fromCharCode(f<<6&192|h)))}};var F;function G(a,b){if(!a||b===t.location.hostname)return!1;for(var c=0;c<a.length;c++)if(a[c]instanceof RegExp){if(a[c].test(b))return!0}else if(0<=b.indexOf(a[c]))return!0;return!1}var H=function(){var a={};var b=r.google_tag_data;r.google_tag_data=void 0===b?a:b;a=r.google_tag_data;b=a.gl;b&&b.decorators||(b={decorators:[]},a.gl=b);return b};var I=/(.*?)\*(.*?)\*(.*)/,J=/([^?#]+)(\?[^#]*)?(#.*)?/,K=/(.*?)(^|&)_gl=([^&]*)&?(.*)/,M=function(a){var b=[],c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];void 0!==d&&d===d&&null!==d&&"[object Object]"!==d.toString()&&(b.push(c),b.push(D(String(d))))}a=b.join("*");return["1",L(a),a].join("*")},L=function(a,b){a=[window.navigator.userAgent,(new Date).getTimezoneOffset(),window.navigator.userLanguage||window.navigator.language,Math.floor((new Date).getTime()/60/1E3)-(void 0===b?0:b),a].join("*");
6
+ if(!(b=F)){b=Array(256);for(var c=0;256>c;c++){for(var d=c,e=0;8>e;e++)d=d&1?d>>>1^3988292384:d>>>1;b[c]=d}}F=b;b=4294967295;for(c=0;c<a.length;c++)b=b>>>8^F[(b^a.charCodeAt(c))&255];return((b^-1)>>>0).toString(36)},P=function(a){return function(b){var c=y(r.location.href),d=c.search.replace("?","");a:{var e=d.split("&");for(var g=0;g<e.length;g++){var f=e[g].split("=");if("_gl"===decodeURIComponent(f[0]).replace(/\+/g," ")){e=f.slice(1).join("=");break a}}e=void 0}b.query=N(e||"")||{};e=x(c,"fragment");
7
+ g=e.match(K);b.fragment=N(g&&g[3]||"")||{};a&&O(c,d,e)}};function Q(a){var b=K.exec(a);if(b){var c=b[2],d=b[4];a=b[1];d&&(a=a+c+d)}return a}
8
+ var O=function(a,b,c){function d(a,b){a=Q(a);a.length&&(a=b+a);return a}r.history&&r.history.replaceState&&(K.test(b)||K.test(c))&&(a=x(a,"path"),b=d(b,"?"),c=d(c,"#"),r.history.replaceState({},void 0,""+a+b+c))},N=function(a){var b=void 0===b?3:b;try{if(a){a:{for(var c=0;3>c;++c){var d=I.exec(a);if(d){var e=d;break a}a=decodeURIComponent(a)}e=void 0}if(e&&"1"===e[1]){var g=e[2],f=e[3];a:{for(e=0;e<b;++e)if(g===L(f,e)){var h=!0;break a}h=!1}if(h){b={};var p=f?f.split("*"):[];for(f=0;f<p.length;f+=
9
+ 2)b[p[f]]=E(p[f+1]);return b}}}}catch(X){}};function R(a,b,c){function d(a){a=Q(a);var b=a.charAt(a.length-1);a&&"&"!==b&&(a+="&");return a+f}c=void 0===c?!1:c;var e=J.exec(b);if(!e)return"";b=e[1];var g=e[2]||"";e=e[3]||"";var f="_gl="+a;c?e="#"+d(e.substring(1)):g="?"+d(g.substring(1));return""+b+g+e}
10
+ function S(a,b,c){for(var d={},e={},g=H().decorators,f=0;f<g.length;++f){var h=g[f];(!c||h.forms)&&G(h.domains,b)&&(h.fragment?m(e,h.callback()):m(d,h.callback()))}n(d)&&(b=M(d),c?T(b,a):U(b,a,!1));!c&&n(e)&&(c=M(e),U(c,a,!0))}function U(a,b,c){b.href&&(a=R(a,b.href,void 0===c?!1:c),q.test(a)&&(b.href=a))}
11
+ function T(a,b){if(b&&b.action){var c=(b.method||"").toLowerCase();if("get"===c){c=b.childNodes||[];for(var d=!1,e=0;e<c.length;e++){var g=c[e];if("_gl"===g.name){g.setAttribute("value",a);d=!0;break}}d||(c=t.createElement("input"),c.setAttribute("type","hidden"),c.setAttribute("name","_gl"),c.setAttribute("value",a),b.appendChild(c))}else"post"===c&&(a=R(a,b.action),q.test(a)&&(b.action=a))}}
12
+ var V=function(a){try{a:{var b=a.target||a.srcElement||{};for(a=100;b&&0<a;){if(b.href&&b.nodeName.match(/^a(?:rea)?$/i)){var c=b;break a}b=b.parentNode;a--}c=null}if(c){var d=c.protocol;"http:"!==d&&"https:"!==d||S(c,c.hostname,!1)}}catch(e){}},W=function(a){try{var b=a.target||a.srcElement||{};if(b.action){var c=x(y(b.action),"host");S(b,c,!0)}}catch(d){}};l("google_tag_data.glBridge.auto",function(a,b,c,d){var e=H();e.init||(u("mousedown",V),u("keyup",V),u("submit",W),e.init=!0);a={callback:a,domains:b,fragment:"fragment"===c,forms:!!d};H().decorators.push(a)});l("google_tag_data.glBridge.decorate",function(a,b,c){c=!!c;a=M(a);if(b.tagName){if("a"==b.tagName.toLowerCase())return U(a,b,c);if("form"==b.tagName.toLowerCase())return T(a,b)}if("string"==typeof b)return R(a,b,c)});l("google_tag_data.glBridge.generate",M);
13
+ l("google_tag_data.glBridge.get",function(a,b){var c=P(!!b);b=H();b.data||(b.data={query:{},fragment:{}},c(b.data));c={};if(b=b.data)m(c,b.query),a&&m(c,b.fragment);return c});})(window);
14
+ (function(){function La(a){var b=1,c;if(a)for(b=0,c=a.length-1;0<=c;c--){var d=a.charCodeAt(c);b=(b<<6&268435455)+d+(d<<14);d=b&266338304;b=0!=d?b^d>>21:b}return b};var $c=function(a){this.w=a||[]};$c.prototype.set=function(a){this.w[a]=!0};$c.prototype.encode=function(){for(var a=[],b=0;b<this.w.length;b++)this.w[b]&&(a[Math.floor(b/6)]^=1<<b%6);for(b=0;b<a.length;b++)a[b]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".charAt(a[b]||0);return a.join("")+"~"};var vd=new $c;function J(a){vd.set(a)}var Td=function(a){a=Dd(a);a=new $c(a);for(var b=vd.w.slice(),c=0;c<a.w.length;c++)b[c]=b[c]||a.w[c];return(new $c(b)).encode()},Dd=function(a){a=a.get(Gd);ka(a)||(a=[]);return a};var ea=function(a){return"function"==typeof a},ka=function(a){return"[object Array]"==Object.prototype.toString.call(Object(a))},qa=function(a){return void 0!=a&&-1<(a.constructor+"").indexOf("String")},D=function(a,b){return 0==a.indexOf(b)},sa=function(a){return a?a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,""):""},ra=function(){for(var a=O.navigator.userAgent+(M.cookie?M.cookie:"")+(M.referrer?M.referrer:""),b=a.length,c=O.history.length;0<c;)a+=c--^b++;return[hd()^La(a)&2147483647,Math.round((new Date).getTime()/
15
+ 1E3)].join(".")},ta=function(a){var b=M.createElement("img");b.width=1;b.height=1;b.src=a;return b},ua=function(){},K=function(a){if(encodeURIComponent instanceof Function)return encodeURIComponent(a);J(28);return a},L=function(a,b,c,d){try{a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent&&a.attachEvent("on"+b,c)}catch(e){J(27)}},f=/^[\w\-:/.?=&%!\[\]]+$/,Nd=/^[\w+/_-]+[=]{0,2}$/,wa=function(a,b,c){if(a){var d=M.querySelector&&M.querySelector("script[nonce]")||null;d=d?d.nonce||d.getAttribute&&
16
+ d.getAttribute("nonce")||"":"";if(c){var e=c="";b&&f.test(b)&&(c=' id="'+b+'"');d&&Nd.test(d)&&(e=' nonce="'+d+'"');f.test(a)&&M.write("<script"+c+e+' src="'+a+'">\x3c/script>')}else c=M.createElement("script"),c.type="text/javascript",c.async=!0,c.src=a,b&&(c.id=b),d&&c.setAttribute("nonce",d),a=M.getElementsByTagName("script")[0],a.parentNode.insertBefore(c,a)}},be=function(a,b){return E(M.location[b?"href":"search"],a)},E=function(a,b){return(a=a.match("(?:&|#|\\?)"+K(b).replace(/([.*+?^=!:${}()|\[\]\/\\])/g,
17
+ "\\$1")+"=([^&#]*)"))&&2==a.length?a[1]:""},xa=function(){var a=""+M.location.hostname;return 0==a.indexOf("www.")?a.substring(4):a},de=function(a,b){var c=a.indexOf(b);if(5==c||6==c)if(a=a.charAt(c+b.length),"/"==a||"?"==a||""==a||":"==a)return!0;return!1},ya=function(a,b){var c=M.referrer;if(/^(https?|android-app):\/\//i.test(c)){if(a)return c;a="//"+M.location.hostname;if(!de(c,a))return b&&(b=a.replace(/\./g,"-")+".cdn.ampproject.org",de(c,b))?void 0:c}},za=function(a,b){if(1==b.length&&null!=
18
+ b[0]&&"object"===typeof b[0])return b[0];for(var c={},d=Math.min(a.length+1,b.length),e=0;e<d;e++)if("object"===typeof b[e]){for(var g in b[e])b[e].hasOwnProperty(g)&&(c[g]=b[e][g]);break}else e<a.length&&(c[a[e]]=b[e]);return c};var ee=function(){this.keys=[];this.values={};this.m={}};ee.prototype.set=function(a,b,c){this.keys.push(a);c?this.m[":"+a]=b:this.values[":"+a]=b};ee.prototype.get=function(a){return this.m.hasOwnProperty(":"+a)?this.m[":"+a]:this.values[":"+a]};ee.prototype.map=function(a){for(var b=0;b<this.keys.length;b++){var c=this.keys[b],d=this.get(c);d&&a(c,d)}};var O=window,M=document,va=function(a,b){return setTimeout(a,b)};var F=window,Ea=document,G=function(a){var b=F._gaUserPrefs;if(b&&b.ioo&&b.ioo()||a&&!0===F["ga-disable-"+a])return!0;try{var c=F.external;if(c&&c._gaUserPrefs&&"oo"==c._gaUserPrefs)return!0}catch(g){}a=[];b=String(Ea.cookie||document.cookie).split(";");for(c=0;c<b.length;c++){var d=b[c].split("="),e=d[0].replace(/^\s*|\s*$/g,"");e&&"AMP_TOKEN"==e&&((d=d.slice(1).join("=").replace(/^\s*|\s*$/g,""))&&(d=decodeURIComponent(d)),a.push(d))}for(b=0;b<a.length;b++)if("$OPT_OUT"==a[b])return!0;return!1};var Ca=function(a){var b=[],c=M.cookie.split(";");a=new RegExp("^\\s*"+a+"=\\s*(.*?)\\s*$");for(var d=0;d<c.length;d++){var e=c[d].match(a);e&&b.push(e[1])}return b},zc=function(a,b,c,d,e,g){e=G(e)?!1:eb.test(M.location.hostname)||"/"==c&&vc.test(d)?!1:!0;if(!e)return!1;b&&1200<b.length&&(b=b.substring(0,1200));c=a+"="+b+"; path="+c+"; ";g&&(c+="expires="+(new Date((new Date).getTime()+g)).toGMTString()+"; ");d&&"none"!==d&&(c+="domain="+d+";");d=M.cookie;M.cookie=c;if(!(d=d!=M.cookie))a:{a=Ca(a);
19
+ for(d=0;d<a.length;d++)if(b==a[d]){d=!0;break a}d=!1}return d},Cc=function(a){return encodeURIComponent?encodeURIComponent(a).replace(/\(/g,"%28").replace(/\)/g,"%29"):a},vc=/^(www\.)?google(\.com?)?(\.[a-z]{2})?$/,eb=/(^|\.)doubleclick\.net$/i;var oc,Id=/^.*Version\/?(\d+)[^\d].*$/i,ne=function(){if(void 0!==O.__ga4__)return O.__ga4__;if(void 0===oc){var a=O.navigator.userAgent;if(a){var b=a;try{b=decodeURIComponent(a)}catch(c){}if(a=!(0<=b.indexOf("Chrome"))&&!(0<=b.indexOf("CriOS"))&&(0<=b.indexOf("Safari/")||0<=b.indexOf("Safari,")))b=Id.exec(b),a=11<=(b?Number(b[1]):-1);oc=a}else oc=!1}return oc};var Fa,Ga,fb,Ab,ja=/^https?:\/\/[^/]*cdn\.ampproject\.org\//,Ue=/^(?:www\.|m\.|amp\.)+/,Ub=[],da=function(a){a:{if(ja.test(M.referrer)){var b=M.location.hostname.replace(Ue,"");b:{var c=M.referrer;c=c.replace(/^https?:\/\//,"");var d=c.replace(/^[^/]+/,"").split("/"),e=d[2];d=(d="s"==e?d[3]:e)?decodeURIComponent(d):d;if(!d){if(0==c.indexOf("xn--")){c="";break b}(c=c.match(/(.*)\.cdn\.ampproject\.org\/?$/))&&2==c.length&&(d=c[1].replace(/-/g,".").replace(/\.\./g,"-"))}c=d?d.replace(Ue,""):""}if(b==
20
+ c){b=!0;break a}else J(78)}b=!1}if(b&&!1!==a[Kd]&&(void 0===Ab&&(b=(b=De.get())&&b._ga||void 0)&&(Ab=b,J(81)),void 0!==Ab))return a[Q]||(a[Q]=Ab),!1;if(a[Kd]){J(67);if(a[ac]&&"cookie"!=a[ac])return!1;if(void 0!==Ab)a[Q]||(a[Q]=Ab);else{a:if(b=String(a[W]||xa()),c=String(a[Yb]||"/"),d=Ca(String(a[U]||"_ga")),b=na(d,b,c),!b||jd.test(b))b=!0;else if(b=Ca("AMP_TOKEN"),0==b.length)b=!0;else{if(1==b.length&&(b=decodeURIComponent(b[0]),"$RETRIEVING"==b||"$OPT_OUT"==b||"$ERROR"==b||"$NOT_FOUND"==b)){b=!0;
21
+ break a}b=!1}if(b&&tc(ic,String(a[Na])))return!0}}return!1},ic=function(){Z.D([ua])},tc=function(a,b){var c=Ca("AMP_TOKEN");if(1<c.length)return J(55),!1;c=decodeURIComponent(c[0]||"");if("$OPT_OUT"==c||"$ERROR"==c||G(b))return J(62),!1;if(!ja.test(M.referrer)&&"$NOT_FOUND"==c)return J(68),!1;if(void 0!==Ab)return J(56),va(function(){a(Ab)},0),!0;if(Fa)return Ub.push(a),!0;if("$RETRIEVING"==c)return J(57),va(function(){tc(a,b)},1E4),!0;Fa=!0;c&&"$"!=c[0]||(xc("$RETRIEVING",3E4),setTimeout(Mc,3E4),
22
+ c="");return Pc(c,b)?(Ub.push(a),!0):!1},Pc=function(a,b,c){if(!window.JSON)return J(58),!1;var d=O.XMLHttpRequest;if(!d)return J(59),!1;var e=new d;if(!("withCredentials"in e))return J(60),!1;e.open("POST",(c||"https://ampcid.google.com/v1/publisher:getClientId")+"?key=AIzaSyA65lEHUEizIsNtlbNo-l2K18dT680nsaM",!0);e.withCredentials=!0;e.setRequestHeader("Content-Type","text/plain");e.onload=function(){Fa=!1;if(4==e.readyState){try{200!=e.status&&(J(61),Qc("","$ERROR",3E4));var d=JSON.parse(e.responseText);
23
+ d.optOut?(J(63),Qc("","$OPT_OUT",31536E6)):d.clientId?Qc(d.clientId,d.securityToken,31536E6):!c&&d.alternateUrl?(Ga&&clearTimeout(Ga),Fa=!0,Pc(a,b,d.alternateUrl)):(J(64),Qc("","$NOT_FOUND",36E5))}catch(ca){J(65),Qc("","$ERROR",3E4)}e=null}};d={originScope:"AMP_ECID_GOOGLE"};a&&(d.securityToken=a);e.send(JSON.stringify(d));Ga=va(function(){J(66);Qc("","$ERROR",3E4)},1E4);return!0},Mc=function(){Fa=!1},xc=function(a,b){if(void 0===fb){fb="";for(var c=id(),d=0;d<c.length;d++){var e=c[d];if(zc("AMP_TOKEN",
24
+ encodeURIComponent(a),"/",e,"",b)){fb=e;return}}}zc("AMP_TOKEN",encodeURIComponent(a),"/",fb,"",b)},Qc=function(a,b,c){Ga&&clearTimeout(Ga);b&&xc(b,c);Ab=a;b=Ub;Ub=[];for(c=0;c<b.length;c++)b[c](a)};var oe=function(){return(Ba||"https:"==M.location.protocol?"https:":"http:")+"//www.google-analytics.com"},Da=function(a){this.name="len";this.message=a+"-8192"},ba=function(a,b,c){c=c||ua;if(2036>=b.length)wc(a,b,c);else if(8192>=b.length)x(a,b,c)||wd(a,b,c)||wc(a,b,c);else throw ge("len",b.length),new Da(b.length);},pe=function(a,b,c,d){d=d||ua;wd(a+"?"+b,"",d,c)},wc=function(a,b,c){var d=ta(a+"?"+b);d.onload=d.onerror=function(){d.onload=null;d.onerror=null;c()}},wd=function(a,b,c,d){var e=O.XMLHttpRequest;
25
+ if(!e)return!1;var g=new e;if(!("withCredentials"in g))return!1;a=a.replace(/^http:/,"https:");g.open("POST",a,!0);g.withCredentials=!0;g.setRequestHeader("Content-Type","text/plain");g.onreadystatechange=function(){if(4==g.readyState){if(d)try{var a=g.responseText;if(1>a.length)ge("xhr","ver","0"),c();else if("1"!=a.charAt(0))ge("xhr","ver",String(a.length)),c();else if(3<d.count++)ge("xhr","tmr",""+d.count),c();else if(1==a.length)c();else{var b=a.charAt(1);if("d"==b)pe("https://stats.g.doubleclick.net/j/collect",
26
+ d.U,d,c);else if("g"==b){var e="https://www.google.%/ads/ga-audiences".replace("%","com");wc(e,d.google,c);var w=a.substring(2);if(w)if(/^[a-z.]{1,6}$/.test(w)){var ha="https://www.google.%/ads/ga-audiences".replace("%",w);wc(ha,d.google,ua)}else ge("tld","bcc",w)}else ge("xhr","brc",b),c()}}catch(ue){ge("xhr","rsp"),c()}else c();g=null}};g.send(b);return!0},x=function(a,b,c){return O.navigator.sendBeacon?O.navigator.sendBeacon(a,b)?(c(),!0):!1:!1},ge=function(a,b,c){1<=100*Math.random()||G("?")||
27
+ (a=["t=error","_e="+a,"_v=j73","sr=1"],b&&a.push("_f="+b),c&&a.push("_m="+K(c.substring(0,100))),a.push("aip=1"),a.push("z="+hd()),wc("https://www.google-analytics.com/u/d",a.join("&"),ua))};var h=function(a){var b=O.gaData=O.gaData||{};return b[a]=b[a]||{}};var Ha=function(){this.M=[]};Ha.prototype.add=function(a){this.M.push(a)};Ha.prototype.D=function(a){try{for(var b=0;b<this.M.length;b++){var c=a.get(this.M[b]);c&&ea(c)&&c.call(O,a)}}catch(d){}b=a.get(Ia);b!=ua&&ea(b)&&(a.set(Ia,ua,!0),setTimeout(b,10))};function Ja(a){if(100!=a.get(Ka)&&La(P(a,Q))%1E4>=100*R(a,Ka))throw"abort";}function Ma(a){if(G(P(a,Na)))throw"abort";}function Oa(){var a=M.location.protocol;if("http:"!=a&&"https:"!=a)throw"abort";}
28
+ function Pa(a){try{O.navigator.sendBeacon?J(42):O.XMLHttpRequest&&"withCredentials"in new O.XMLHttpRequest&&J(40)}catch(c){}a.set(ld,Td(a),!0);a.set(Ac,R(a,Ac)+1);var b=[];Qa.map(function(c,d){d.F&&(c=a.get(c),void 0!=c&&c!=d.defaultValue&&("boolean"==typeof c&&(c*=1),b.push(d.F+"="+K(""+c))))});b.push("z="+Bd());a.set(Ra,b.join("&"),!0)}
29
+ function Sa(a){var b=P(a,gd)||oe()+"/collect",c=a.get(qe),d=P(a,fa);!d&&a.get(Vd)&&(d="beacon");if(c)pe(b,P(a,Ra),c,a.get(Ia));else if(d){c=d;d=P(a,Ra);var e=a.get(Ia);e=e||ua;"image"==c?wc(b,d,e):"xhr"==c&&wd(b,d,e)||"beacon"==c&&x(b,d,e)||ba(b,d,e)}else ba(b,P(a,Ra),a.get(Ia));b=a.get(Na);b=h(b);c=b.hitcount;b.hitcount=c?c+1:1;b=a.get(Na);delete h(b).pending_experiments;a.set(Ia,ua,!0)}
30
+ function Hc(a){(O.gaData=O.gaData||{}).expId&&a.set(Nc,(O.gaData=O.gaData||{}).expId);(O.gaData=O.gaData||{}).expVar&&a.set(Oc,(O.gaData=O.gaData||{}).expVar);var b=a.get(Na);if(b=h(b).pending_experiments){var c=[];for(d in b)b.hasOwnProperty(d)&&b[d]&&c.push(encodeURIComponent(d)+"."+encodeURIComponent(b[d]));var d=c.join("!")}else d=void 0;d&&a.set(m,d,!0)}function cd(){if(O.navigator&&"preview"==O.navigator.loadPurpose)throw"abort";}
31
+ function yd(a){var b=O.gaDevIds;ka(b)&&0!=b.length&&a.set("&did",b.join(","),!0)}function vb(a){if(!a.get(Na))throw"abort";};var hd=function(){return Math.round(2147483647*Math.random())},Bd=function(){try{var a=new Uint32Array(1);O.crypto.getRandomValues(a);return a[0]&2147483647}catch(b){return hd()}};function Ta(a){var b=R(a,Ua);500<=b&&J(15);var c=P(a,Va);if("transaction"!=c&&"item"!=c){c=R(a,Wa);var d=(new Date).getTime(),e=R(a,Xa);0==e&&a.set(Xa,d);e=Math.round(2*(d-e)/1E3);0<e&&(c=Math.min(c+e,20),a.set(Xa,d));if(0>=c)throw"abort";a.set(Wa,--c)}a.set(Ua,++b)};var Ya=function(){this.data=new ee},Qa=new ee,Za=[];Ya.prototype.get=function(a){var b=$a(a),c=this.data.get(a);b&&void 0==c&&(c=ea(b.defaultValue)?b.defaultValue():b.defaultValue);return b&&b.Z?b.Z(this,a,c):c};var P=function(a,b){a=a.get(b);return void 0==a?"":""+a},R=function(a,b){a=a.get(b);return void 0==a||""===a?0:1*a};Ya.prototype.set=function(a,b,c){if(a)if("object"==typeof a)for(var d in a)a.hasOwnProperty(d)&&ab(this,d,a[d],c);else ab(this,a,b,c)};
32
+ var ab=function(a,b,c,d){if(void 0!=c)switch(b){case Na:wb.test(c)}var e=$a(b);e&&e.o?e.o(a,b,c,d):a.data.set(b,c,d)},bb=function(a,b,c,d,e){this.name=a;this.F=b;this.Z=d;this.o=e;this.defaultValue=c},$a=function(a){var b=Qa.get(a);if(!b)for(var c=0;c<Za.length;c++){var d=Za[c],e=d[0].exec(a);if(e){b=d[1](e);Qa.set(b.name,b);break}}return b},yc=function(a){var b;Qa.map(function(c,d){d.F==a&&(b=d)});return b&&b.name},S=function(a,b,c,d,e){a=new bb(a,b,c,d,e);Qa.set(a.name,a);return a.name},cb=function(a,
33
+ b){Za.push([new RegExp("^"+a+"$"),b])},T=function(a,b,c){return S(a,b,c,void 0,db)},db=function(){};var gb=qa(window.GoogleAnalyticsObject)&&sa(window.GoogleAnalyticsObject)||"ga",jd=/^(?:utma\.)?\d+\.\d+$/,kd=/^amp-[\w.-]{22,64}$/,Ba=!1,hb=T("apiVersion","v"),ib=T("clientVersion","_v");S("anonymizeIp","aip");var jb=S("adSenseId","a"),Va=S("hitType","t"),Ia=S("hitCallback"),Ra=S("hitPayload");S("nonInteraction","ni");S("currencyCode","cu");S("dataSource","ds");var Vd=S("useBeacon",void 0,!1),fa=S("transport");S("sessionControl","sc","");S("sessionGroup","sg");S("queueTime","qt");var Ac=S("_s","_s");
34
+ S("screenName","cd");var kb=S("location","dl",""),lb=S("referrer","dr"),mb=S("page","dp","");S("hostname","dh");var nb=S("language","ul"),ob=S("encoding","de");S("title","dt",function(){return M.title||void 0});cb("contentGroup([0-9]+)",function(a){return new bb(a[0],"cg"+a[1])});var pb=S("screenColors","sd"),qb=S("screenResolution","sr"),rb=S("viewportSize","vp"),sb=S("javaEnabled","je"),tb=S("flashVersion","fl");S("campaignId","ci");S("campaignName","cn");S("campaignSource","cs");
35
+ S("campaignMedium","cm");S("campaignKeyword","ck");S("campaignContent","cc");
36
+ var ub=S("eventCategory","ec"),xb=S("eventAction","ea"),yb=S("eventLabel","el"),zb=S("eventValue","ev"),Bb=S("socialNetwork","sn"),Cb=S("socialAction","sa"),Db=S("socialTarget","st"),Eb=S("l1","plt"),Fb=S("l2","pdt"),Gb=S("l3","dns"),Hb=S("l4","rrt"),Ib=S("l5","srt"),Jb=S("l6","tcp"),Kb=S("l7","dit"),Lb=S("l8","clt"),Ve=S("l9","_gst"),We=S("l10","_gbt"),Xe=S("l11","_cst"),Ye=S("l12","_cbt"),Mb=S("timingCategory","utc"),Nb=S("timingVar","utv"),Ob=S("timingLabel","utl"),Pb=S("timingValue","utt");
37
+ S("appName","an");S("appVersion","av","");S("appId","aid","");S("appInstallerId","aiid","");S("exDescription","exd");S("exFatal","exf");var Nc=S("expId","xid"),Oc=S("expVar","xvar"),m=S("exp","exp"),Rc=S("_utma","_utma"),Sc=S("_utmz","_utmz"),Tc=S("_utmht","_utmht"),Ua=S("_hc",void 0,0),Xa=S("_ti",void 0,0),Wa=S("_to",void 0,20);cb("dimension([0-9]+)",function(a){return new bb(a[0],"cd"+a[1])});cb("metric([0-9]+)",function(a){return new bb(a[0],"cm"+a[1])});S("linkerParam",void 0,void 0,Bc,db);
38
+ var Ze=T("_cd2l",void 0,!1),ld=S("usage","_u"),Gd=S("_um");S("forceSSL",void 0,void 0,function(){return Ba},function(a,b,c){J(34);Ba=!!c});var ed=S("_j1","jid"),ia=S("_j2","gjid");cb("\\&(.*)",function(a){var b=new bb(a[0],a[1]),c=yc(a[0].substring(1));c&&(b.Z=function(a){return a.get(c)},b.o=function(a,b,g,ca){a.set(c,g,ca)},b.F=void 0);return b});
39
+ var Qb=T("_oot"),dd=S("previewTask"),Rb=S("checkProtocolTask"),md=S("validationTask"),Sb=S("checkStorageTask"),Uc=S("historyImportTask"),Tb=S("samplerTask"),Vb=S("_rlt"),Wb=S("buildHitTask"),Xb=S("sendHitTask"),Vc=S("ceTask"),zd=S("devIdTask"),Cd=S("timingTask"),Ld=S("displayFeaturesTask"),oa=S("customTask"),V=T("name"),Q=T("clientId","cid"),n=T("clientIdTime"),xd=T("storedClientId"),Ad=S("userId","uid"),Na=T("trackingId","tid"),U=T("cookieName",void 0,"_ga"),W=T("cookieDomain"),Yb=T("cookiePath",
40
+ void 0,"/"),Zb=T("cookieExpires",void 0,63072E3),Hd=T("cookieUpdate",void 0,!0),$b=T("legacyCookieDomain"),Wc=T("legacyHistoryImport",void 0,!0),ac=T("storage",void 0,"cookie"),bc=T("allowLinker",void 0,!1),cc=T("allowAnchor",void 0,!0),Ka=T("sampleRate","sf",100),dc=T("siteSpeedSampleRate",void 0,1),ec=T("alwaysSendReferrer",void 0,!1),I=T("_gid","_gid"),la=T("_gcn"),Kd=T("useAmpClientId"),ce=T("_gclid"),fe=T("_gt"),he=T("_ge",void 0,7776E6),ie=T("_gclsrc"),je=T("storeGac",void 0,!0),gd=S("transportUrl"),
41
+ Md=S("_r","_r"),qe=S("_dp"),Ud=S("allowAdFeatures",void 0,!0);function X(a,b,c,d){b[a]=function(){try{return d&&J(d),c.apply(this,arguments)}catch(e){throw ge("exc",a,e&&e.name),e;}}};var Od=function(){this.V=100;this.$=this.fa=!1;this.oa="detourexp";this.groups=1},Ed=function(a){var b=new Od,c;if(b.fa&&b.$)return 0;b.$=!0;if(a){if(b.oa&&void 0!==a.get(b.oa))return R(a,b.oa);if(0==a.get(dc))return 0}if(0==b.V)return 0;void 0===c&&(c=Bd());return 0==c%b.V?Math.floor(c/b.V)%b.groups+1:0};function fc(){var a,b;if((b=(b=O.navigator)?b.plugins:null)&&b.length)for(var c=0;c<b.length&&!a;c++){var d=b[c];-1<d.name.indexOf("Shockwave Flash")&&(a=d.description)}if(!a)try{var e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");a=e.GetVariable("$version")}catch(g){}if(!a)try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"),a="WIN 6,0,21,0",e.AllowScriptAccess="always",a=e.GetVariable("$version")}catch(g){}if(!a)try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"),a=e.GetVariable("$version")}catch(g){}a&&
42
+ (e=a.match(/[\d]+/g))&&3<=e.length&&(a=e[0]+"."+e[1]+" r"+e[2]);return a||void 0};var aa=function(a){var b=Math.min(R(a,dc),100);return La(P(a,Q))%100>=b?!1:!0},gc=function(a){var b={};if(Ec(b)||Fc(b)){var c=b[Eb];void 0==c||Infinity==c||isNaN(c)||(0<c?(Y(b,Gb),Y(b,Jb),Y(b,Ib),Y(b,Fb),Y(b,Hb),Y(b,Kb),Y(b,Lb),Y(b,Ve),Y(b,We),Y(b,Xe),Y(b,Ye),va(function(){a(b)},10)):L(O,"load",function(){gc(a)},!1))}},Ec=function(a){var b=O.performance||O.webkitPerformance;b=b&&b.timing;if(!b)return!1;var c=b.navigationStart;if(0==c)return!1;a[Eb]=b.loadEventStart-c;a[Gb]=b.domainLookupEnd-b.domainLookupStart;
43
+ a[Jb]=b.connectEnd-b.connectStart;a[Ib]=b.responseStart-b.requestStart;a[Fb]=b.responseEnd-b.responseStart;a[Hb]=b.fetchStart-c;a[Kb]=b.domInteractive-c;a[Lb]=b.domContentLoadedEventStart-c;a[Ve]=N.L-c;a[We]=N.ya-c;O.google_tag_manager&&O.google_tag_manager._li&&(b=O.google_tag_manager._li,a[Xe]=b.cst,a[Ye]=b.cbt);return!0},Fc=function(a){if(O.top!=O)return!1;var b=O.external,c=b&&b.onloadT;b&&!b.isValidLoadTime&&(c=void 0);2147483648<c&&(c=void 0);0<c&&b.setPageReadyTime();if(void 0==c)return!1;
44
+ a[Eb]=c;return!0},Y=function(a,b){var c=a[b];if(isNaN(c)||Infinity==c||0>c)a[b]=void 0},Fd=function(a){return function(b){if("pageview"==b.get(Va)&&!a.I){a.I=!0;var c=aa(b),d=0<E(b.get(kb),"gclid").length;(c||d)&&gc(function(b){c&&a.send("timing",b);d&&a.send("adtiming",b)})}}};var hc=!1,mc=function(a){if("cookie"==P(a,ac)){if(a.get(Hd)||P(a,xd)!=P(a,Q)){var b=1E3*R(a,Zb);ma(a,Q,U,b)}ma(a,I,la,864E5);if(a.get(je)){var c=a.get(ce);if(c){var d=Math.min(R(a,he),1E3*R(a,Zb));d=Math.min(d,1E3*R(a,fe)+d-(new Date).getTime());a.data.set(he,d);b={};var e=a.get(fe),g=a.get(ie),ca=kc(P(a,Yb)),l=lc(P(a,W));a=P(a,Na);g&&"aw.ds"!=g?b&&(b.ua=!0):(c=["1",e,Cc(c)].join("."),0<d&&(b&&(b.ta=!0),zc("_gac_"+Cc(a),c,ca,l,a,d)));le(b)}}else J(75)}},ma=function(a,b,c,d){var e=nd(a,b);if(e){c=
45
+ P(a,c);var g=kc(P(a,Yb)),ca=lc(P(a,W)),l=P(a,Na);if("auto"!=ca)zc(c,e,g,ca,l,d)&&(hc=!0);else{J(32);for(var k=id(),w=0;w<k.length;w++)if(ca=k[w],a.data.set(W,ca),e=nd(a,b),zc(c,e,g,ca,l,d)){hc=!0;return}a.data.set(W,"auto")}}},nc=function(a){if("cookie"==P(a,ac)&&!hc&&(mc(a),!hc))throw"abort";},Yc=function(a){if(a.get(Wc)){var b=P(a,W),c=P(a,$b)||xa(),d=Xc("__utma",c,b);d&&(J(19),a.set(Tc,(new Date).getTime(),!0),a.set(Rc,d.R),(b=Xc("__utmz",c,b))&&d.hash==b.hash&&a.set(Sc,b.R))}},nd=function(a,b){b=
46
+ Cc(P(a,b));var c=lc(P(a,W)).split(".").length;a=jc(P(a,Yb));1<a&&(c+="-"+a);return b?["GA1",c,b].join("."):""},Xd=function(a,b){return na(b,P(a,W),P(a,Yb))},na=function(a,b,c){if(!a||1>a.length)J(12);else{for(var d=[],e=0;e<a.length;e++){var g=a[e];var ca=g.split(".");var l=ca.shift();("GA1"==l||"1"==l)&&1<ca.length?(g=ca.shift().split("-"),1==g.length&&(g[1]="1"),g[0]*=1,g[1]*=1,ca={H:g,s:ca.join(".")}):ca=kd.test(g)?{H:[0,0],s:g}:void 0;ca&&d.push(ca)}if(1==d.length)return J(13),d[0].s;if(0==d.length)J(12);
47
+ else{J(14);d=Gc(d,lc(b).split(".").length,0);if(1==d.length)return d[0].s;d=Gc(d,jc(c),1);1<d.length&&J(41);return d[0]&&d[0].s}}},Gc=function(a,b,c){for(var d=[],e=[],g,ca=0;ca<a.length;ca++){var l=a[ca];l.H[c]==b?d.push(l):void 0==g||l.H[c]<g?(e=[l],g=l.H[c]):l.H[c]==g&&e.push(l)}return 0<d.length?d:e},lc=function(a){return 0==a.indexOf(".")?a.substr(1):a},id=function(){var a=[],b=xa().split(".");if(4==b.length){var c=b[b.length-1];if(parseInt(c,10)==c)return["none"]}for(c=b.length-2;0<=c;c--)a.push(b.slice(c).join("."));
48
+ b=M.location.hostname;eb.test(b)||vc.test(b)||a.push("none");return a},kc=function(a){if(!a)return"/";1<a.length&&a.lastIndexOf("/")==a.length-1&&(a=a.substr(0,a.length-1));0!=a.indexOf("/")&&(a="/"+a);return a},jc=function(a){a=kc(a);return"/"==a?1:a.split("/").length},le=function(a){a.ta&&J(77);a.na&&J(74);a.pa&&J(73);a.ua&&J(69)};function Xc(a,b,c){"none"==b&&(b="");var d=[],e=Ca(a);a="__utma"==a?6:2;for(var g=0;g<e.length;g++){var ca=(""+e[g]).split(".");ca.length>=a&&d.push({hash:ca[0],R:e[g],O:ca})}if(0!=d.length)return 1==d.length?d[0]:Zc(b,d)||Zc(c,d)||Zc(null,d)||d[0]}function Zc(a,b){if(null==a)var c=a=1;else c=La(a),a=La(D(a,".")?a.substring(1):"."+a);for(var d=0;d<b.length;d++)if(b[d].hash==c||b[d].hash==a)return b[d]};var od=new RegExp(/^https?:\/\/([^\/:]+)/),De=O.google_tag_data.glBridge,pd=/(.*)([?&#])(?:_ga=[^&#]*)(?:&?)(.*)/,me=/(.*)([?&#])(?:_gac=[^&#]*)(?:&?)(.*)/;function Bc(a){if(a.get(Ze))return J(35),De.generate($e(a));var b=a.get(Q),c=a.get(I)||"";b="_ga=2."+K(pa(c+b,0)+"."+c+"-"+b);(a=af(a))?(J(44),a="&_gac=1."+K([pa(a.qa,0),a.timestamp,a.qa].join("."))):a="";return b+a}
49
+ function Ic(a,b){var c=new Date,d=O.navigator,e=d.plugins||[];a=[a,d.userAgent,c.getTimezoneOffset(),c.getYear(),c.getDate(),c.getHours(),c.getMinutes()+b];for(b=0;b<e.length;++b)a.push(e[b].description);return La(a.join("."))}function pa(a,b){var c=new Date,d=O.navigator,e=c.getHours()+Math.floor((c.getMinutes()+b)/60);return La([a,d.userAgent,d.language||"",c.getTimezoneOffset(),c.getYear(),c.getDate()+Math.floor(e/24),(24+e)%24,(60+c.getMinutes()+b)%60].join("."))}
50
+ var Dc=function(a){J(48);this.target=a;this.T=!1};Dc.prototype.ca=function(a,b){if(a){if(this.target.get(Ze))return De.decorate($e(this.target),a,b);if(a.tagName){if("a"==a.tagName.toLowerCase()){a.href&&(a.href=qd(this,a.href,b));return}if("form"==a.tagName.toLowerCase())return rd(this,a)}if("string"==typeof a)return qd(this,a,b)}};
51
+ var qd=function(a,b,c){var d=pd.exec(b);d&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));(d=me.exec(b))&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));a=a.target.get("linkerParam");var e=b.indexOf("?");d=b.indexOf("#");c?b+=(-1==d?"#":"&")+a:(c=-1==e?"?":"&",b=-1==d?b+(c+a):b.substring(0,d)+c+a+b.substring(d));b=b.replace(/&+_ga=/,"&_ga=");return b=b.replace(/&+_gac=/,"&_gac=")},rd=function(a,b){if(b&&b.action)if("get"==b.method.toLowerCase()){a=a.target.get("linkerParam").split("&");for(var c=0;c<a.length;c++){var d=
52
+ a[c].split("="),e=d[1];d=d[0];for(var g=b.childNodes||[],ca=!1,l=0;l<g.length;l++)if(g[l].name==d){g[l].setAttribute("value",e);ca=!0;break}ca||(g=M.createElement("input"),g.setAttribute("type","hidden"),g.setAttribute("name",d),g.setAttribute("value",e),b.appendChild(g))}}else"post"==b.method.toLowerCase()&&(b.action=qd(a,b.action))};
53
+ Dc.prototype.S=function(a,b,c){function d(c){try{c=c||O.event;a:{var d=c.target||c.srcElement;for(c=100;d&&0<c;){if(d.href&&d.nodeName.match(/^a(?:rea)?$/i)){var g=d;break a}d=d.parentNode;c--}g={}}("http:"==g.protocol||"https:"==g.protocol)&&sd(a,g.hostname||"")&&g.href&&(g.href=qd(e,g.href,b))}catch(k){J(26)}}var e=this;this.target.get(Ze)?De.auto(function(){return $e(e.target)},a,b?"fragment":"",c):(this.T||(this.T=!0,L(M,"mousedown",d,!1),L(M,"keyup",d,!1)),c&&L(M,"submit",function(b){b=b||O.event;
54
+ if((b=b.target||b.srcElement)&&b.action){var c=b.action.match(od);c&&sd(a,c[1])&&rd(e,b)}}))};function sd(a,b){if(b==M.location.hostname)return!1;for(var c=0;c<a.length;c++)if(a[c]instanceof RegExp){if(a[c].test(b))return!0}else if(0<=b.indexOf(a[c]))return!0;return!1}function ke(a,b){return b!=Ic(a,0)&&b!=Ic(a,-1)&&b!=Ic(a,-2)&&b!=pa(a,0)&&b!=pa(a,-1)&&b!=pa(a,-2)}function $e(a){var b=af(a);return{_ga:a.get(Q),_gid:a.get(I)||void 0,_gac:b?[b.qa,b.timestamp].join("."):void 0}}
55
+ function af(a){function b(a){return void 0==a||""===a?0:Number(a)}var c=a.get(ce);if(c&&a.get(je)){var d=b(a.get(fe));if(1E3*d+b(a.get(he))<=(new Date).getTime())J(76);else return{timestamp:d,qa:c}}};var p=/^(GTM|OPT)-[A-Z0-9]+$/,q=/;_gaexp=[^;]*/g,r=/;((__utma=)|([^;=]+=GAX?\d+\.))[^;]*/g,Aa=/^https?:\/\/[\w\-.]+\.google.com(:\d+)?\/optimize\/opt-launch\.html\?.*$/,t=function(a){function b(a,b){b&&(c+="&"+a+"="+K(b))}var c="https://www.google-analytics.com/gtm/js?id="+K(a.id);"dataLayer"!=a.B&&b("l",a.B);b("t",a.target);b("cid",a.clientId);b("cidt",a.ka);b("gac",a.la);b("aip",a.ia);a.sync&&b("m","sync");b("cycle",a.G);a.qa&&b("gclid",a.qa);Aa.test(M.referrer)&&b("cb",String(hd()));return c};var Jd=function(a,b,c){this.aa=b;(b=c)||(b=(b=P(a,V))&&"t0"!=b?Wd.test(b)?"_gat_"+Cc(P(a,Na)):"_gat_"+Cc(b):"_gat");this.Y=b;this.ra=null},Rd=function(a,b){var c=b.get(Wb);b.set(Wb,function(b){Pd(a,b,ed);Pd(a,b,ia);var d=c(b);Qd(a,b);return d});var d=b.get(Xb);b.set(Xb,function(b){var c=d(b);if(se(b)){if(ne()!==H(a,b)){J(80);var e={U:re(a,b,1),google:re(a,b,2),count:0};pe("https://stats.g.doubleclick.net/j/collect",e.U,e)}else ta(re(a,b,0));b.set(ed,"",!0)}return c})},Pd=function(a,b,c){!1===b.get(Ud)||
56
+ b.get(c)||("1"==Ca(a.Y)[0]?b.set(c,"",!0):b.set(c,""+hd(),!0))},Qd=function(a,b){se(b)&&zc(a.Y,"1",b.get(Yb),b.get(W),b.get(Na),6E4)},se=function(a){return!!a.get(ed)&&a.get(Ud)},re=function(a,b,c){var d=new ee,e=function(a){$a(a).F&&d.set($a(a).F,b.get(a))};e(hb);e(ib);e(Na);e(Q);e(ed);if(0==c||1==c)e(Ad),e(ia),e(I);d.set($a(ld).F,Td(b));var g="";d.map(function(a,b){g+=K(a)+"=";g+=K(""+b)+"&"});g+="z="+hd();0==c?g=a.aa+g:1==c?g="t=dc&aip=1&_r=3&"+g:2==c&&(g="t=sr&aip=1&_r=4&slf_rd=1&"+g);return g},
57
+ H=function(a,b){null===a.ra&&(a.ra=1===Ed(b),a.ra&&J(33));return a.ra},Wd=/^gtm\d+$/;var fd=function(a,b){a=a.b;if(!a.get("dcLoaded")){var c=new $c(Dd(a));c.set(29);a.set(Gd,c.w);b=b||{};var d;b[U]&&(d=Cc(b[U]));b=new Jd(a,"https://stats.g.doubleclick.net/r/collect?t=dc&aip=1&_r=3&",d);Rd(b,a);a.set("dcLoaded",!0)}};var Sd=function(a){if(!a.get("dcLoaded")&&"cookie"==a.get(ac)){var b=new Jd(a);Pd(b,a,ed);Pd(b,a,ia);Qd(b,a);if(se(a)){var c=ne()!==H(b,a);a.set(Md,1,!0);c?(J(79),a.set(gd,oe()+"/j/collect",!0),a.set(qe,{U:re(b,a,1),google:re(b,a,2),count:0},!0)):a.set(gd,oe()+"/r/collect",!0)}}};var Lc=function(){var a=O.gaGlobal=O.gaGlobal||{};return a.hid=a.hid||hd()};var ad,bd=function(a,b,c){if(!ad){var d=M.location.hash;var e=O.name,g=/^#?gaso=([^&]*)/;if(e=(d=(d=d&&d.match(g)||e&&e.match(g))?d[1]:Ca("GASO")[0]||"")&&d.match(/^(?:!([-0-9a-z.]{1,40})!)?([-.\w]{10,1200})$/i))zc("GASO",""+d,c,b,a,0),window._udo||(window._udo=b),window._utcp||(window._utcp=c),a=e[1],wa("https://www.google.com/analytics/web/inpage/pub/inpage.js?"+(a?"prefix="+a+"&":"")+hd(),"_gasojs");ad=!0}};var wb=/^(UA|YT|MO|GP)-(\d+)-(\d+)$/,pc=function(a){function b(a,b){d.b.data.set(a,b)}function c(a,c){b(a,c);d.filters.add(a)}var d=this;this.b=new Ya;this.filters=new Ha;b(V,a[V]);b(Na,sa(a[Na]));b(U,a[U]);b(W,a[W]||xa());b(Yb,a[Yb]);b(Zb,a[Zb]);b(Hd,a[Hd]);b($b,a[$b]);b(Wc,a[Wc]);b(bc,a[bc]);b(cc,a[cc]);b(Ka,a[Ka]);b(dc,a[dc]);b(ec,a[ec]);b(ac,a[ac]);b(Ad,a[Ad]);b(n,a[n]);b(Kd,a[Kd]);b(je,a[je]);b(Ze,a[Ze]);b(hb,1);b(ib,"j73");c(Qb,Ma);c(oa,ua);c(dd,cd);c(Rb,Oa);c(md,vb);c(Sb,nc);c(Uc,Yc);c(Tb,
58
+ Ja);c(Vb,Ta);c(Vc,Hc);c(zd,yd);c(Ld,Sd);c(Wb,Pa);c(Xb,Sa);c(Cd,Fd(this));Kc(this.b);Jc(this.b,a[Q]);this.b.set(jb,Lc());bd(this.b.get(Na),this.b.get(W),this.b.get(Yb))},Jc=function(a,b){var c=P(a,U);a.data.set(la,"_ga"==c?"_gid":c+"_gid");if("cookie"==P(a,ac)){hc=!1;c=Ca(P(a,U));c=Xd(a,c);if(!c){c=P(a,W);var d=P(a,$b)||xa();c=Xc("__utma",d,c);void 0!=c?(J(10),c=c.O[1]+"."+c.O[2]):c=void 0}c&&(hc=!0);if(d=c&&!a.get(Hd))if(d=c.split("."),2!=d.length)d=!1;else if(d=Number(d[1])){var e=R(a,Zb);d=d+e<
59
+ (new Date).getTime()/1E3}else d=!1;d&&(c=void 0);c&&(a.data.set(xd,c),a.data.set(Q,c),c=Ca(P(a,la)),(c=Xd(a,c))&&a.data.set(I,c));if(a.get(je)&&(c=a.get(ce),d=a.get(ie),!c||d&&"aw.ds"!=d)){c={};if(M){d=[];e=M.cookie.split(";");for(var g=/^\s*_gac_(UA-\d+-\d+)=\s*(.+?)\s*$/,ca=0;ca<e.length;ca++){var l=e[ca].match(g);l&&d.push({ja:l[1],value:l[2]})}e={};if(d&&d.length)for(g=0;g<d.length;g++)(ca=d[g].value.split("."),"1"!=ca[0]||3!=ca.length)?c&&(c.na=!0):ca[1]&&(e[d[g].ja]?c&&(c.pa=!0):e[d[g].ja]=
60
+ [],e[d[g].ja].push({timestamp:ca[1],qa:ca[2]}));d=e}else d={};d=d[P(a,Na)];le(c);d&&0!=d.length&&(c=d[0],a.data.set(fe,c.timestamp),a.data.set(ce,c.qa))}}if(a.get(Hd)&&(c=be("_ga",a.get(cc)),d=be("_gl",a.get(cc)),e=De.get(a.get(cc)),g=e._ga,d&&0<d.indexOf("_ga")&&!g&&J(30),c||g))if(c&&g&&J(36),a.get(bc)){if(g&&(J(38),a.data.set(Q,g),e._gid&&(J(51),a.data.set(I,e._gid)),e._gac&&(d=e._gac.split("."))&&2==d.length&&(J(37),a.data.set(ce,d[0]),a.data.set(fe,d[1]))),c)b:if(d=c.indexOf("."),-1==d)J(22);
61
+ else{e=c.substring(0,d);g=c.substring(d+1);d=g.indexOf(".");c=g.substring(0,d);g=g.substring(d+1);if("1"==e){if(d=g,ke(d,c)){J(23);break b}}else if("2"==e){d=g.indexOf("-");e="";0<d?(e=g.substring(0,d),d=g.substring(d+1)):d=g.substring(1);if(ke(e+d,c)){J(53);break b}e&&(J(2),a.data.set(I,e))}else{J(22);break b}J(11);a.data.set(Q,d);if(c=be("_gac",a.get(cc)))c=c.split("."),"1"!=c[0]||4!=c.length?J(72):ke(c[3],c[1])?J(71):(a.data.set(ce,c[3]),a.data.set(fe,c[2]),J(70))}}else J(21);b&&(J(9),a.data.set(Q,
62
+ K(b)));a.get(Q)||((b=(b=O.gaGlobal&&O.gaGlobal.vid)&&-1!=b.search(jd)?b:void 0)?(J(17),a.data.set(Q,b)):(J(8),a.data.set(Q,ra())));a.get(I)||(J(3),a.data.set(I,ra()));mc(a)},Kc=function(a){var b=O.navigator,c=O.screen,d=M.location;a.set(lb,ya(a.get(ec),a.get(Kd)));if(d){var e=d.pathname||"";"/"!=e.charAt(0)&&(J(31),e="/"+e);a.set(kb,d.protocol+"//"+d.hostname+e+d.search)}c&&a.set(qb,c.width+"x"+c.height);c&&a.set(pb,c.colorDepth+"-bit");c=M.documentElement;var g=(e=M.body)&&e.clientWidth&&e.clientHeight,
63
+ ca=[];c&&c.clientWidth&&c.clientHeight&&("CSS1Compat"===M.compatMode||!g)?ca=[c.clientWidth,c.clientHeight]:g&&(ca=[e.clientWidth,e.clientHeight]);c=0>=ca[0]||0>=ca[1]?"":ca.join("x");a.set(rb,c);a.set(tb,fc());a.set(ob,M.characterSet||M.charset);a.set(sb,b&&"function"===typeof b.javaEnabled&&b.javaEnabled()||!1);a.set(nb,(b&&(b.language||b.browserLanguage)||"").toLowerCase());a.data.set(ce,be("gclid",!0));a.data.set(ie,be("gclsrc",!0));a.data.set(fe,Math.round((new Date).getTime()/1E3));if(d&&a.get(cc)&&
64
+ (b=M.location.hash)){b=b.split(/[?&#]+/);d=[];for(c=0;c<b.length;++c)(D(b[c],"utm_id")||D(b[c],"utm_campaign")||D(b[c],"utm_source")||D(b[c],"utm_medium")||D(b[c],"utm_term")||D(b[c],"utm_content")||D(b[c],"gclid")||D(b[c],"dclid")||D(b[c],"gclsrc"))&&d.push(b[c]);0<d.length&&(b="#"+d.join("&"),a.set(kb,a.get(kb)+b))}};pc.prototype.get=function(a){return this.b.get(a)};pc.prototype.set=function(a,b){this.b.set(a,b)};var qc={pageview:[mb],event:[ub,xb,yb,zb],social:[Bb,Cb,Db],timing:[Mb,Nb,Pb,Ob]};
65
+ pc.prototype.send=function(a){if(!(1>arguments.length)){if("string"===typeof arguments[0]){var b=arguments[0];var c=[].slice.call(arguments,1)}else b=arguments[0]&&arguments[0][Va],c=arguments;b&&(c=za(qc[b]||[],c),c[Va]=b,this.b.set(c,void 0,!0),this.filters.D(this.b),this.b.data.m={})}};pc.prototype.ma=function(a,b){var c=this;u(a,c,b)||(v(a,function(){u(a,c,b)}),y(String(c.get(V)),a,void 0,b,!0))};var rc=function(a){if("prerender"==M.visibilityState)return!1;a();return!0},z=function(a){if(!rc(a)){J(16);var b=!1,c=function(){if(!b&&rc(a)){b=!0;var d=c,e=M;e.removeEventListener?e.removeEventListener("visibilitychange",d,!1):e.detachEvent&&e.detachEvent("onvisibilitychange",d)}};L(M,"visibilitychange",c)}};var td=/^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/,sc=function(a){if(ea(a[0]))this.u=a[0];else{var b=td.exec(a[0]);null!=b&&4==b.length&&(this.c=b[1]||"t0",this.K=b[2]||"",this.C=b[3],this.a=[].slice.call(a,1),this.K||(this.A="create"==this.C,this.i="require"==this.C,this.g="provide"==this.C,this.ba="remove"==this.C),this.i&&(3<=this.a.length?(this.X=this.a[1],this.W=this.a[2]):this.a[1]&&(qa(this.a[1])?this.X=this.a[1]:this.W=this.a[1])));b=a[1];a=a[2];if(!this.C)throw"abort";if(this.i&&(!qa(b)||""==b))throw"abort";
66
+ if(this.g&&(!qa(b)||""==b||!ea(a)))throw"abort";if(ud(this.c)||ud(this.K))throw"abort";if(this.g&&"t0"!=this.c)throw"abort";}};function ud(a){return 0<=a.indexOf(".")||0<=a.indexOf(":")};var Yd,Zd,$d,A;Yd=new ee;$d=new ee;A=new ee;Zd={ec:45,ecommerce:46,linkid:47};
67
+ var u=function(a,b,c){b==N||b.get(V);var d=Yd.get(a);if(!ea(d))return!1;b.plugins_=b.plugins_||new ee;if(b.plugins_.get(a))return!0;b.plugins_.set(a,new d(b,c||{}));return!0},y=function(a,b,c,d,e){if(!ea(Yd.get(b))&&!$d.get(b)){Zd.hasOwnProperty(b)&&J(Zd[b]);if(p.test(b)){J(52);a=N.j(a);if(!a)return!0;c=d||{};d={id:b,B:c.dataLayer||"dataLayer",ia:!!a.get("anonymizeIp"),sync:e,G:!1};a.get("&gtm")==b&&(d.G=!0);var g=String(a.get("name"));"t0"!=g&&(d.target=g);G(String(a.get("trackingId")))||(d.clientId=
68
+ String(a.get(Q)),d.ka=Number(a.get(n)),c=c.palindrome?r:q,c=(c=M.cookie.replace(/^|(; +)/g,";").match(c))?c.sort().join("").substring(1):void 0,d.la=c,d.qa=E(a.b.get(kb)||"","gclid"));a=d.B;c=(new Date).getTime();O[a]=O[a]||[];c={"gtm.start":c};e||(c.event="gtm.js");O[a].push(c);c=t(d)}!c&&Zd.hasOwnProperty(b)?(J(39),c=b+".js"):J(43);c&&(c&&0<=c.indexOf("/")||(c=(Ba||"https:"==M.location.protocol?"https:":"http:")+"//www.google-analytics.com/plugins/ua/"+c),d=ae(c),a=d.protocol,c=M.location.protocol,
69
+ ("https:"==a||a==c||("http:"!=a?0:"http:"==c))&&B(d)&&(wa(d.url,void 0,e),$d.set(b,!0)))}},v=function(a,b){var c=A.get(a)||[];c.push(b);A.set(a,c)},C=function(a,b){Yd.set(a,b);b=A.get(a)||[];for(var c=0;c<b.length;c++)b[c]();A.set(a,[])},B=function(a){var b=ae(M.location.href);if(D(a.url,"https://www.google-analytics.com/gtm/js?id="))return!0;if(a.query||0<=a.url.indexOf("?")||0<=a.path.indexOf("://"))return!1;if(a.host==b.host&&a.port==b.port)return!0;b="http:"==a.protocol?80:443;return"www.google-analytics.com"==
70
+ a.host&&(a.port||b)==b&&D(a.path,"/plugins/")?!0:!1},ae=function(a){function b(a){var b=a.hostname||"",c=0<=b.indexOf("]");b=b.split(c?"]":":")[0].toLowerCase();c&&(b+="]");c=(a.protocol||"").toLowerCase();c=1*a.port||("http:"==c?80:"https:"==c?443:"");a=a.pathname||"";D(a,"/")||(a="/"+a);return[b,""+c,a]}var c=M.createElement("a");c.href=M.location.href;var d=(c.protocol||"").toLowerCase(),e=b(c),g=c.search||"",ca=d+"//"+e[0]+(e[1]?":"+e[1]:"");D(a,"//")?a=d+a:D(a,"/")?a=ca+a:!a||D(a,"?")?a=ca+e[2]+
71
+ (a||g):0>a.split("/")[0].indexOf(":")&&(a=ca+e[2].substring(0,e[2].lastIndexOf("/"))+"/"+a);c.href=a;d=b(c);return{protocol:(c.protocol||"").toLowerCase(),host:d[0],port:d[1],path:d[2],query:c.search||"",url:a||""}};var Z={ga:function(){Z.f=[]}};Z.ga();Z.D=function(a){var b=Z.J.apply(Z,arguments);b=Z.f.concat(b);for(Z.f=[];0<b.length&&!Z.v(b[0])&&!(b.shift(),0<Z.f.length););Z.f=Z.f.concat(b)};Z.J=function(a){for(var b=[],c=0;c<arguments.length;c++)try{var d=new sc(arguments[c]);d.g?C(d.a[0],d.a[1]):(d.i&&(d.ha=y(d.c,d.a[0],d.X,d.W)),b.push(d))}catch(e){}return b};
72
+ Z.v=function(a){try{if(a.u)a.u.call(O,N.j("t0"));else{var b=a.c==gb?N:N.j(a.c);if(a.A){if("t0"==a.c&&(b=N.create.apply(N,a.a),null===b))return!0}else if(a.ba)N.remove(a.c);else if(b)if(a.i){if(a.ha&&(a.ha=y(a.c,a.a[0],a.X,a.W)),!u(a.a[0],b,a.W))return!0}else if(a.K){var c=a.C,d=a.a,e=b.plugins_.get(a.K);e[c].apply(e,d)}else b[a.C].apply(b,a.a)}}catch(g){}};var N=function(a){J(1);Z.D.apply(Z,[arguments])};N.h={};N.P=[];N.L=0;N.ya=0;N.answer=42;var uc=[Na,W,V];N.create=function(a){var b=za(uc,[].slice.call(arguments));b[V]||(b[V]="t0");var c=""+b[V];if(N.h[c])return N.h[c];if(da(b))return null;b=new pc(b);N.h[c]=b;N.P.push(b);return b};N.remove=function(a){for(var b=0;b<N.P.length;b++)if(N.P[b].get(V)==a){N.P.splice(b,1);N.h[a]=null;break}};N.j=function(a){return N.h[a]};N.getAll=function(){return N.P.slice(0)};
73
+ N.N=function(){"ga"!=gb&&J(49);var a=O[gb];if(!a||42!=a.answer){N.L=a&&a.l;N.ya=1*new Date;N.loaded=!0;var b=O[gb]=N;X("create",b,b.create);X("remove",b,b.remove);X("getByName",b,b.j,5);X("getAll",b,b.getAll,6);b=pc.prototype;X("get",b,b.get,7);X("set",b,b.set,4);X("send",b,b.send);X("requireSync",b,b.ma);b=Ya.prototype;X("get",b,b.get);X("set",b,b.set);if("https:"!=M.location.protocol&&!Ba){a:{b=M.getElementsByTagName("script");for(var c=0;c<b.length&&100>c;c++){var d=b[c].src;if(d&&0==d.indexOf("https://www.google-analytics.com/analytics")){b=
74
+ !0;break a}}b=!1}b&&(Ba=!0)}(O.gaplugins=O.gaplugins||{}).Linker=Dc;b=Dc.prototype;C("linker",Dc);X("decorate",b,b.ca,20);X("autoLink",b,b.S,25);C("displayfeatures",fd);C("adfeatures",fd);a=a&&a.q;ka(a)?Z.D.apply(N,a):J(50)}};N.da=function(){for(var a=N.getAll(),b=0;b<a.length;b++)a[b].get(V)};var te=N.N,ve=O[gb];ve&&ve.r?te():z(te);z(function(){Z.D(["provide","render",ua])});})(window);
components/ga-cache/includes/classes/class.configurate-ga.php CHANGED
@@ -1,129 +1,160 @@
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  /**
3
- * This class configures the google analytics cache
4
- * @author Webcraftic <wordpress.webraftic@gmail.com>
5
- * @copyright (c) 2017 Webraftic Ltd
6
- * @version 1.0
 
 
 
 
7
  */
8
-
9
- // Exit if accessed directly
10
- if( !defined('ABSPATH') ) {
11
- exit;
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  }
13
-
14
- class WGA_ConfigGACache extends Wbcr_FactoryClearfy206_Configurate {
15
-
16
-
17
- public function registerActionsAndFilters()
18
- {
19
-
20
- if( $this->getPopulateOption('ga_cache') ) {
21
- add_filter('cron_schedules', array($this, 'cronAdditions'));
22
-
23
- // Load update script to schedule in wp_cron.
24
- add_action('wbcr_ga_update_local_script', array($this, 'updateLocalGoogleAnaliticScript'));
25
-
26
- if( !is_admin() ) {
27
- $this->addGoogleAnaliticsScript();
28
- }
29
- }
30
- }
31
-
32
-
33
- public function cronAdditions($schedules)
34
- {
35
- $schedules['weekly'] = array(
36
- 'interval' => DAY_IN_SECONDS * 7,
37
- 'display' => __('Once Weekly'),
38
- );
39
-
40
- $schedules['twicemonthly'] = array(
41
- 'interval' => DAY_IN_SECONDS * 14,
42
- 'display' => __('Twice Monthly'),
43
- );
44
-
45
- $schedules['monthly'] = array(
46
- 'interval' => DAY_IN_SECONDS * 30,
47
- 'display' => __('Once Monthly'),
48
- );
49
-
50
- return $schedules;
51
- }
52
-
53
- public function updateLocalGoogleAnaliticScript()
54
- {
55
- include(WGA_PLUGIN_DIR . '/includes/update-local-ga.php');
56
- }
57
-
58
- private function addGoogleAnaliticsScript()
59
- {
60
- $ga_tracking_id = $this->getPopulateOption('ga_tracking_id');
61
-
62
- if( !empty($ga_tracking_id) ) {
63
- $local_ga_file = WGA_PLUGIN_DIR . '/cache/local-ga.js';
64
- // If file is not created yet, create now!
65
- if( !file_exists($local_ga_file) ) {
66
- ob_start();
67
- do_action('wbcr_ga_update_local_script');
68
- ob_end_clean();
69
- }
70
-
71
- $ga_script_position = $this->getPopulateOption('ga_script_position', 'footer');
72
- $ga_enqueue_order = $this->getPopulateOption('ga_enqueue_order', 0);
73
-
74
- switch( $ga_script_position ) {
75
- case 'header':
76
- add_action('wp_head', array($this, 'printGoogleAnalitics'), $ga_enqueue_order);
77
- break;
78
- default:
79
- add_action('wp_footer', array($this, 'printGoogleAnalitics'), $ga_enqueue_order);
80
- }
81
- }
82
  }
83
-
84
- /**
85
- * Generate tracking code and add to header/footer (default is header).
86
- */
87
- public function printGoogleAnalitics()
88
- {
89
- $ga_tracking_id = $this->getPopulateOption('ga_tracking_id');
90
- $ga_track_admin = $this->getPopulateOption('ga_track_admin');
91
-
92
- // If user is admin we don't want to render the tracking code, when option is disabled.
93
- if( empty($ga_tracking_id) || (current_user_can('manage_options') && (!$ga_track_admin)) ) {
94
- return;
95
- }
96
-
97
- $ga_adjusted_bounce_rate = $this->getPopulateOption('ga_adjusted_bounce_rate', 0);
98
- $ga_anonymize_ip = $this->getPopulateOption('ga_anonymize_ip', false);
99
- $ga_caos_disable_display_features = $this->getPopulateOption('ga_caos_disable_display_features', false);
100
-
101
- echo "<!-- Google Analytics Local by " . $this->plugin->getPluginTitle() . " -->" . PHP_EOL;
102
-
103
- echo "<script>" . PHP_EOL;
104
- echo "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
105
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
106
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
107
  })(window,document,'script','" . WGA_PLUGIN_URL . "/cache/local-ga.js','ga');" . PHP_EOL;
108
-
109
- echo "ga('create', '" . $ga_tracking_id . "', 'auto');" . PHP_EOL;
110
-
111
- echo $ga_caos_disable_display_features
112
- ? "ga('set', 'displayFeaturesTask', null);" . PHP_EOL
113
- : '';
114
-
115
- echo $ga_anonymize_ip
116
- ? "ga('set', 'anonymizeIp', true);" . PHP_EOL
117
- : '';
118
-
119
- echo "ga('send', 'pageview');";
120
-
121
- echo $ga_adjusted_bounce_rate
122
- ? PHP_EOL . 'setTimeout("ga(' . "'send','event','adjusted bounce rate','" . $ga_adjusted_bounce_rate . " seconds')" . '"' . ',' . $ga_adjusted_bounce_rate * 1000 . ');'
123
- : '';
124
-
125
- echo PHP_EOL . '</script>' . PHP_EOL;
126
-
127
- echo "<!-- end Google Analytics Local by " . $this->plugin->getPluginTitle() . " -->" . PHP_EOL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
  }
129
  }
 
1
  <?php
2
+ /**
3
+ * This class configures the google analytics cache
4
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
5
+ * @copyright (c) 2017 Webraftic Ltd
6
+ * @version 1.0
7
+ */
8
+
9
+ // Exit if accessed directly
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit;
12
+ }
13
+
14
+ class WGA_ConfigGACache extends Wbcr_FactoryClearfy206_Configurate {
15
+
16
+
17
+ public function registerActionsAndFilters() {
18
+
19
+ if ( $this->getPopulateOption( 'ga_cache' ) ) {
20
+ add_filter( 'cron_schedules', array( $this, 'cron_additions' ) );
21
+
22
+ // Load update script to schedule in wp_cron.
23
+ add_action( 'wbcr/gac/update_analytic_library', array( $this, 'update_local_analytic' ) );
24
+
25
+ if ( ! is_admin() ) {
26
+ $this->add_google_analitics_script();
27
+ }
28
+ }
29
+ }
30
+
31
  /**
32
+ * Extends the recurrence interval of cron tasks. In the core,
33
+ * the number of recurrence intervals for cron tasks is limited.
34
+ * Therefore, we create 3 additional recurrences weekly,
35
+ * twicemonthly, monthly.
36
+ *
37
+ * @param array $schedules an array of already recorded recurrences
38
+ *
39
+ * @return mixed
40
  */
41
+ public function cron_additions( $schedules ) {
42
+ $schedules['weekly'] = array(
43
+ 'interval' => DAY_IN_SECONDS * 7,
44
+ 'display' => __( 'Once Weekly' ),
45
+ );
46
+
47
+ $schedules['twicemonthly'] = array(
48
+ 'interval' => DAY_IN_SECONDS * 14,
49
+ 'display' => __( 'Twice Monthly' ),
50
+ );
51
+
52
+ $schedules['monthly'] = array(
53
+ 'interval' => DAY_IN_SECONDS * 30,
54
+ 'display' => __( 'Once Monthly' ),
55
+ );
56
+
57
+ return $schedules;
58
  }
59
+
60
+ /**
61
+ * Enables update-local-ga.php, which creates and updates
62
+ * the Google analytics library locally on the user's site.
63
+ * This method performs via cron and manually if the library
64
+ * file has not yet been created.
65
+ *
66
+ * @since 3.0.1
67
+ * @return void
68
+ */
69
+ public function update_local_analytic() {
70
+ include( WGA_PLUGIN_DIR . '/includes/update-local-ga.php' );
71
+ }
72
+
73
+ /**
74
+ * Generates tracking code based on the user options set. Then it just
75
+ * prints this code on the page. The code can be printed to the header
76
+ * or footer, depending on which action called this method.
77
+ *
78
+ * @since 3.0.1
79
+ * @return void
80
+ */
81
+ public function print_google_analytics() {
82
+
83
+ $tracking_id = $this->getPopulateOption( 'ga_tracking_id' );
84
+ $track_admin = $this->getPopulateOption( 'ga_track_admin' );
85
+
86
+ // If user is admin we don't want to render the tracking code, when option is disabled.
87
+ if ( empty( $tracking_id ) || ( current_user_can( 'manage_options' ) && ( ! $track_admin ) ) ) {
88
+ return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  }
90
+
91
+ $adjusted_bounce_rate = $this->getPopulateOption( 'ga_adjusted_bounce_rate', 0 );
92
+ $anonymize_ip = $this->getPopulateOption( 'ga_anonymize_ip', false );
93
+ $disable_display_features = $this->getPopulateOption( 'ga_disable_display_features', false );
94
+
95
+ echo "<!-- Google Analytics Local by " . $this->plugin->getPluginTitle() . " -->" . PHP_EOL;
96
+
97
+ echo "<script>" . PHP_EOL;
98
+ echo "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
100
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
101
  })(window,document,'script','" . WGA_PLUGIN_URL . "/cache/local-ga.js','ga');" . PHP_EOL;
102
+
103
+ /**
104
+ * Allows you to complement the current configuration analytics.
105
+ * For example, one of the users wanted to add google adwords ID
106
+ * to this code.
107
+ *
108
+ * When using this action, you must enter only javascript code,
109
+ * without opening and closing tags.
110
+ *
111
+ * @since 3.0.1
112
+ */
113
+ do_action( 'wbcr/gac/print_analytic_options', array(
114
+ 'tracking_id' => $tracking_id,
115
+ 'track_admin' => $track_admin,
116
+ 'adjusted_bounce_rate' => $adjusted_bounce_rate,
117
+ 'anonymize_ip' => $anonymize_ip,
118
+ 'disable_display_features' => $disable_display_features
119
+ ) );
120
+
121
+ echo "ga('create', '" . $tracking_id . "', 'auto');" . PHP_EOL;
122
+ echo $disable_display_features ? "ga('set', 'displayFeaturesTask', null);" . PHP_EOL : '';
123
+ echo $anonymize_ip ? "ga('set', 'anonymizeIp', true);" . PHP_EOL : '';
124
+ echo "ga('send', 'pageview');";
125
+ echo $adjusted_bounce_rate ? PHP_EOL . 'setTimeout("ga(' . "'send','event','adjusted bounce rate','" . $adjusted_bounce_rate . " seconds')" . '"' . ',' . $adjusted_bounce_rate * 1000 . ');' : '';
126
+ echo PHP_EOL . '</script>' . PHP_EOL;
127
+
128
+ echo "<!-- end Google Analytics Local by " . $this->plugin->getPluginTitle() . " -->" . PHP_EOL;
129
+ }
130
+
131
+ /**
132
+ * Inserts tracking code in header and footer. Before insertion,
133
+ * it executes the wbcr_ga_update_local_script action to update
134
+ * Google local analytics library.
135
+ *
136
+ * @since 3.0.1
137
+ * @return void
138
+ */
139
+ private function add_google_analitics_script() {
140
+ $tracking_id = $this->getPopulateOption( 'ga_tracking_id' );
141
+
142
+ if ( ! empty( $tracking_id ) ) {
143
+ $local_ga_file = WGA_PLUGIN_DIR . '/cache/local-ga.js';
144
+ // If file is not created yet, create now!
145
+ if ( ! file_exists( $local_ga_file ) ) {
146
+ ob_start();
147
+ do_action( 'wbcr_ga_update_local_script' );
148
+ ob_end_clean();
149
+ }
150
+
151
+ $enqueue_order = $this->getPopulateOption( 'ga_enqueue_order', 0 );
152
+
153
+ if ( $this->getPopulateOption( 'ga_script_position', 'footer' ) == 'header' ) {
154
+ add_action( 'wp_head', array( $this, 'print_google_analytics' ), $enqueue_order );
155
+ } else {
156
+ add_action( 'wp_footer', array( $this, 'print_google_analytics' ), $enqueue_order );
157
+ }
158
  }
159
  }
160
+ }
components/ga-cache/languages/simple-google-analytics-es_ES.mo ADDED
Binary file
components/ga-cache/languages/simple-google-analytics-es_ES.po ADDED
@@ -0,0 +1,234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of Plugins - Clearfy in Spanish (Spain)
2
+ # This file is distributed under the same license as the Plugins - Clearfy – WordPress optimization plugin and disable ultimate tweaker - Development (trunk) package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: \n"
6
+ "POT-Creation-Date: 2019-04-28 06:27+0300\n"
7
+ "PO-Revision-Date: 2019-04-28 06:27+0300\n"
8
+ "Last-Translator: \n"
9
+ "Language-Team: \n"
10
+ "Language: es\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
15
+ "X-Generator: Poedit 2.1.1\n"
16
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
17
+ "X-Generator: Poedit 2.1.1\n"
18
+ "X-Poedit-Basepath: ..\n"
19
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
20
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
21
+ "X-Poedit-SourceCharset: UTF-8\n"
22
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
23
+ "X-Poedit-SearchPath-0: .\n"
24
+ "X-Poedit-SearchPathExcluded-0: libs\n"
25
+ "X-Poedit-SearchPathExcluded-1: components\n"
26
+ "X-Poedit-SearchPathExcluded-2: cache\n"
27
+
28
+ #: admin/boot.php:34
29
+ msgid "The <b>Simple Google Analytics</b> plugin has some major changes!"
30
+ msgstr "El plugin <b>Simple Google Analytics</b> tiene cambios importantes."
31
+
32
+ #: admin/boot.php:35
33
+ msgid ""
34
+ "Unfortunately, the old version of the plugin (2.2.2) is no longer supported, "
35
+ "but you still can download it from the WordPress repository in case if the "
36
+ "new release doesn’t work for you."
37
+ msgstr ""
38
+ "Desafortunadamente, la versión anterior del complemento (2.2.2) ya no aplica "
39
+ "soporte, pero aún puede descargarlo del repositorio de WordPress en caso de "
40
+ "que la nueva versión no funcione para usted."
41
+
42
+ #: admin/boot.php:36
43
+ msgid ""
44
+ "We’ve updated the code and fixed the compatibility issue for the latest "
45
+ "WordPress and PHP versions. We’ve also added additional feature of the Local "
46
+ "Google Analytics – this way your website will load faster. The plugin’s name "
47
+ "has been changed to Local Google Analytics, but all features remained the "
48
+ "same."
49
+ msgstr ""
50
+ "Hemos actualizado el código y hemos solucionado el problema de "
51
+ "compatibilidad para las últimas versiones de WordPress y PHP. También hemos "
52
+ "agregado una función adicional de Local Google Analytics, de esta manera su "
53
+ "sitio web cargará más rápido. El nombre del plugin se ha cambiado a Local "
54
+ "Google Analytics, pero todas las características siguen siendo las mismas."
55
+
56
+ #: admin/boot.php:37
57
+ #, php-format
58
+ msgid ""
59
+ "Please, check <a href=\"%s\">plugin settings</a> and its performance on your "
60
+ "website. We do care about you and want to avoid any problems with the new "
61
+ "version."
62
+ msgstr ""
63
+ "Verifique <a href=\"%s\">configuraciónes de plugins</a> y el rendimiento de "
64
+ "su Website. Nos preocupamos por usted, queremos evitar problemas con la "
65
+ "nueva versión."
66
+
67
+ #: admin/boot.php:38
68
+ #, php-format
69
+ msgid ""
70
+ "We are aimed to pay more attention to the speed and security aspects of your "
71
+ "website. That’s why you should definitely try our basic WordPress "
72
+ "optimization plugin as well. Clearfy includes functionality of this plugin "
73
+ "and has many additional features for the website optimization:\n"
74
+ "<a href=\"%s\">Donwload Clearfy for free</a>"
75
+ msgstr ""
76
+ "Nuestro meta es prestar más atención a los aspectos de velocidad y seguridad "
77
+ "de su sitio web. Por eso prueba nuestro plugin básico de optimización "
78
+ "WordPress. Clearfy incluye funcionalidades de este plugin y posee "
79
+ "características adicionales para optimización de sitios web:\n"
80
+ "<a href=\"%s\">Descargue Clearfy de forma gratuita</a>"
81
+
82
+ #: admin/boot.php:170 admin/options.php:29 admin/pages/ga_cache.php:54
83
+ msgid "Google Analytics Cache"
84
+ msgstr "Cache de Google Analytics"
85
+
86
+ #: admin/boot.php:176 admin/options.php:49
87
+ msgid "Google analytic Code"
88
+ msgstr "Código de Google Analytics"
89
+
90
+ #: admin/boot.php:181 admin/options.php:70
91
+ msgid "Use adjusted bounce rate?"
92
+ msgstr "¿Usar tasa de rebote ajustada?"
93
+
94
+ #: admin/boot.php:186 admin/options.php:79
95
+ msgid "Change enqueue order?"
96
+ msgstr "¿Cambiar orden del turno?"
97
+
98
+ #: admin/boot.php:191 admin/options.php:88
99
+ msgid "Disable all display features functionality?"
100
+ msgstr "¿Desactivar todas las funciones de la pantalla?"
101
+
102
+ #: admin/boot.php:196 admin/options.php:97
103
+ msgid "Use Anonymize IP? (Required by law for some countries)"
104
+ msgstr "¿Usar IP Anónima? (Requerimiento legal en algunos países)"
105
+
106
+ #: admin/boot.php:201 admin/options.php:106 admin/options.php:108
107
+ msgid "Track logged in Administrators?"
108
+ msgstr "¿Registrados en Administradores?"
109
+
110
+ #: admin/boot.php:232
111
+ msgid "Get ultimate plugin free"
112
+ msgstr "Obtener el ultimate plugin gratis"
113
+
114
+ #: admin/options.php:22
115
+ msgid "<strong>Google Analytics cache</strong>."
116
+ msgstr "<strong>Google Analytics cache</strong>."
117
+
118
+ #: admin/options.php:22
119
+ msgid ""
120
+ "To improve Google Page Speed indicators Analytics caching is needed. "
121
+ "However, it can also slightly increase your website loading speed, because "
122
+ "Analytics js files will load locally. The second case that you might need "
123
+ "these settings is the usual Google Analytics connection to your website. You "
124
+ "do not need to do this with other plugins or insert the tracking code into "
125
+ "your theme."
126
+ msgstr ""
127
+ "Para mejorar el ranking en Google Page Speed, es necesario el almacenamiento "
128
+ "en caché de Analytics. con esto, aumentará ligeramente la velocidad de carga "
129
+ "de su sitio web, ya que los archivos de Analytics js se cargarán localmente. "
130
+ "El segundo caso en el que puede necesitar estos ajustes, es con la conexión "
131
+ "habitual de Google Analytics a su sitio web. No necesita hacer esto con "
132
+ "otros plugins ni insertar el código de seguimiento en su tema."
133
+
134
+ #: admin/options.php:31
135
+ msgid ""
136
+ "If you enable this option, the plugin will begin to save a local copy of "
137
+ "Google Analytics to speed up the loading of your website and improve Google "
138
+ "Page Speed."
139
+ msgstr ""
140
+ "Si habilita esta opción, el complemento comenzará a guardar una copia local "
141
+ "de Google Analytics acelerando la carga de su sitio web y mejorando el "
142
+ "ranking en Google Page Speed ."
143
+
144
+ #: admin/options.php:31
145
+ msgid ""
146
+ "ATTENTION! Before using this option, remove the previously installed Google "
147
+ "Analytics code inside your theme or plugins associated with this feature!"
148
+ msgstr ""
149
+ "¡ATENCIÓN! ¡Antes de usar esta opción, elimine el código de Google Analytics "
150
+ "instalado previamente dentro de su tema o los complementos asociados con "
151
+ "esta función!"
152
+
153
+ #: admin/options.php:51
154
+ msgid "Set the Google Analytics tracking code."
155
+ msgstr "Configure el código de seguimiento de Google Analytics."
156
+
157
+ #: admin/options.php:62
158
+ msgid "Save GA in"
159
+ msgstr "Guardar GA en"
160
+
161
+ #: admin/options.php:63
162
+ msgid "Select location for the Google Analytics code."
163
+ msgstr "Seleccione la ubicación para el código de Google Analytics."
164
+
165
+ #: admin/options.php:73
166
+ msgid ""
167
+ "Essentially, you set up an event which is triggered after a user spends a "
168
+ "certain amount of time on the landing page, telling Google Analytics not to "
169
+ "count these users as bounces. A user may come to your website, find all of "
170
+ "the information they need (a phone number, for example) and then leave the "
171
+ "site without visiting another page. Without adjusted bounce rate, such a "
172
+ "user would be considered a bounce, even though they had a successful "
173
+ "experience. By defining a time limit after which you can consider a user to "
174
+ "be \"engaged,\" that user would no longer count as a bounce, and you'd get a "
175
+ "more accurate idea of whether they found what they were looking for."
176
+ msgstr ""
177
+ "Básicamente, configura un evento que se activa después de que un usuario "
178
+ "pasa una cierta cantidad de tiempo en la página de destino, diciéndole a "
179
+ "Google Analytics que no cuente a estos usuarios como rebotes. Un usuario "
180
+ "puede ir a su sitio web, buscar toda la información que necesita (un número "
181
+ "de teléfono, por ejemplo) y luego abandonar el sitio sin visitar otra "
182
+ "página. Sin una tasa de rebote ajustada, dicho usuario se consideraría un "
183
+ "rebote aunque tuviera una experiencia exitosa. Al definir un límite de "
184
+ "tiempo, un usuario se consideraría \"comprometido\", ese usuario ya no se "
185
+ "contaría como un rebote ya que sería obvio que encontró lo que buscó."
186
+
187
+ #: admin/options.php:82
188
+ msgid ""
189
+ "By default, Google Analytics code is loaded before other scripts and "
190
+ "javasscript code, but if you set the value to 100, the GA code will be "
191
+ "loaded after all other scripts. By changing the priority, you can set code "
192
+ "position on the page."
193
+ msgstr ""
194
+ "Por defecto, el código de Google Analytics se carga antes que otros scripts "
195
+ "y el código javasscript, pero si establece el valor a 100, el código GA se "
196
+ "cargará después de todos los demás scripts. Al cambiar la prioridad, puede "
197
+ "establecer la posición del código en la página."
198
+
199
+ #: admin/options.php:90
200
+ #, php-format
201
+ msgid "Disable all <a href=\"%s\">display features functionality?</a>"
202
+ msgstr ""
203
+ "Deshabilitar todas las <a href=\"%s\">¿Características de funciones?</a>"
204
+
205
+ #: admin/options.php:99
206
+ #, php-format
207
+ msgid ""
208
+ "Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
209
+ msgstr ""
210
+ "Use <a href=\"%s\">¿Anonimizar IP?</a> (Requisito legal para algunos países)"
211
+
212
+ #: admin/pages/ga_cache.php:38
213
+ msgid "Local Google Analytics"
214
+ msgstr "Google Analytics local"
215
+
216
+ #: admin/pages/ga_cache.php:55
217
+ msgid "General"
218
+ msgstr "General"
219
+
220
+ #: includes/classes/class.configurate-ga.php:44
221
+ msgid "Once Weekly"
222
+ msgstr "Una vez a la semana"
223
+
224
+ #: includes/classes/class.configurate-ga.php:49
225
+ msgid "Twice Monthly"
226
+ msgstr "Dos veces al mes"
227
+
228
+ #: includes/classes/class.configurate-ga.php:54
229
+ msgid "Once Monthly"
230
+ msgstr "Una vez al mes"
231
+
232
+ #: simple_google_analytics.php:83
233
+ msgid "Webcraftic Local Google Analytics"
234
+ msgstr "Webcraftic Local Google Analytics"
components/ga-cache/languages/simple-google-analytics-ru_RU.po CHANGED
@@ -16,7 +16,7 @@ msgstr ""
16
  "X-Poedit-SourceCharset: UTF-8\n"
17
  "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
18
  "X-Poedit-SearchPath-0: google-analytics-cache.php\n"
19
- "X-Poedit-SearchPath-1: includes/class.plugin.php\n"
20
  "X-Poedit-SearchPath-2: admin/options.php\n"
21
  "X-Poedit-SearchPath-3: includes/classes/class.configurate-ga.php\n"
22
  "X-Poedit-SearchPath-4: admin/pages/ga_cache.php\n"
16
  "X-Poedit-SourceCharset: UTF-8\n"
17
  "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
18
  "X-Poedit-SearchPath-0: google-analytics-cache.php\n"
19
+ "X-Poedit-SearchPath-1: includes/class-rio-plugin.php\n"
20
  "X-Poedit-SearchPath-2: admin/options.php\n"
21
  "X-Poedit-SearchPath-3: includes/classes/class.configurate-ga.php\n"
22
  "X-Poedit-SearchPath-4: admin/pages/ga_cache.php\n"
components/ga-cache/simple_google_analytics.php CHANGED
@@ -1,73 +1,94 @@
1
  <?php
2
- /**
3
- * Plugin Name: Webcraftic Local Google Analytics
4
- * Plugin URI: https://wordpress.org/plugins/simple-google-analytics/
5
- * Description: Old plugin name: Simple Google Analytics. To improve Google Page Speed indicators Analytics caching is needed. However, it can also slightly increase your website loading speed, because Analytics js files will load locally. The second case that you might need these settings is the usual Google Analytics connection to your website. You do not need to do this with other plugins or insert the tracking code into your theme.
6
- * Author: Webcraftic <wordpress.webraftic@gmail.com>, JeromeMeyer62<jerome.meyer@hollywoud.net>
7
- * Version: 3.0.1
8
- * Text Domain: simple-google-analytics
9
- * Domain Path: /languages/
10
- * Author URI: http://clearfy.pro
11
- */
12
 
13
- // Exit if accessed directly
14
- if( !defined('ABSPATH') ) {
15
- exit;
16
- }
17
-
18
- define('WGA_PLUGIN_VERSION', '3.0.1');
19
-
20
- define('WGA_PLUGIN_DIR', dirname(__FILE__));
21
- define('WGA_PLUGIN_BASE', plugin_basename(__FILE__));
22
- define('WGA_PLUGIN_URL', plugins_url(null, __FILE__));
23
 
24
-
25
-
26
- if( !defined('LOADING_GA_CACHE_AS_ADDON') ) {
27
- require_once(WGA_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php');
28
- require_once(WGA_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php');
29
- }
30
-
31
- $plugin_info = array(
32
- 'prefix' => 'wbcr_gac_',
33
- 'plugin_name' => 'wbcr_gac',
34
- 'plugin_title' => __('Webcraftic Local Google Analytics', 'simple-google-analytics'),
35
- 'plugin_version' => WGA_PLUGIN_VERSION,
36
- 'plugin_build' => 'free',
37
- //'updates' => WGA_PLUGIN_DIR . '/updates/'
38
- );
39
-
40
- /**
41
- * Проверяет совместимость с Wordpress, php и другими плагинами.
42
- */
43
- $compatibility = new Wbcr_FactoryClearfy_Compatibility(array_merge($plugin_info, array(
44
- 'plugin_already_activate' => defined('WGA_PLUGIN_ACTIVE'),
45
- 'plugin_as_component' => defined('LOADING_GA_CACHE_AS_ADDON'),
46
- 'plugin_dir' => WGA_PLUGIN_DIR,
47
- 'plugin_base' => WGA_PLUGIN_BASE,
48
- 'plugin_url' => WGA_PLUGIN_URL,
49
- 'required_php_version' => '5.3',
50
- 'required_wp_version' => '4.2.0',
51
- 'required_clearfy_check_component' => true
52
- )));
53
-
54
- /**
55
- * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
56
- * а пользователь получит предупреждение.
57
- */
58
- if( !$compatibility->check() ) {
59
- return;
60
- }
61
-
62
- define('WGA_PLUGIN_ACTIVE', true);
63
 
64
- if( !defined('LOADING_GA_CACHE_AS_ADDON') ) {
65
- require_once(WGA_PLUGIN_DIR . '/libs/factory/core/boot.php');
66
- }
 
67
 
68
- require_once(WGA_PLUGIN_DIR . '/includes/class.plugin.php');
 
 
 
 
 
 
 
 
69
 
70
- if( !defined('LOADING_GA_CACHE_AS_ADDON') ) {
71
- new WGA_Plugin(__FILE__, $plugin_info);
72
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
 
1
  <?php
2
+ /**
3
+ * Plugin Name: Webcraftic Local Google Analytics
4
+ * Plugin URI: https://wordpress.org/plugins/simple-google-analytics/
5
+ * Description: Old plugin name: Simple Google Analytics. To improve Google Page Speed indicators Analytics caching is needed. However, it can also slightly increase your website loading speed, because Analytics js files will load locally. The second case that you might need these settings is the usual Google Analytics connection to your website. You do not need to do this with other plugins or insert the tracking code into your theme.
6
+ * Author: Webcraftic <wordpress.webraftic@gmail.com>, JeromeMeyer62<jerome.meyer@hollywoud.net>
7
+ * Version: 3.0.2
8
+ * Text Domain: simple-google-analytics
9
+ * Domain Path: /languages/
10
+ * Author URI: http://clearfy.pro
11
+ */
12
 
13
+ // Exit if accessed directly
14
+ if ( ! defined( 'ABSPATH' ) ) {
15
+ exit;
16
+ }
17
+ if ( ! defined( 'WGA_PLUGIN_VERSION' ) ) {
18
+ define( 'WGA_PLUGIN_VERSION', '3.0.1' );
19
+ }
 
 
 
20
 
21
+ // Fix for ithemes sync. When the ithemes sync plugin accepts the request, set the WP_ADMIN constant,
22
+ // after which the plugin Clearfy begins to create errors, and how the logic of its work is broken.
23
+ // Solution to simply terminate the plugin if there is a request from ithemes sync
24
+ // --------------------------------------
25
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'ithemes_sync_request' ) {
26
+ return;
27
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
 
29
+ if ( isset( $_GET['ithemes-sync-request'] ) && ! empty( $_GET['ithemes-sync-request'] ) ) {
30
+ return;
31
+ }
32
+ // ----------------------------------------
33
 
34
+ if ( ! defined( 'WGA_PLUGIN_DIR' ) ) {
35
+ define( 'WGA_PLUGIN_DIR', dirname( __FILE__ ) );
36
+ }
37
+ if ( ! defined( 'WGA_PLUGIN_BASE' ) ) {
38
+ define( 'WGA_PLUGIN_BASE', plugin_basename( __FILE__ ) );
39
+ }
40
+ if ( ! defined( 'WGA_PLUGIN_URL' ) ) {
41
+ define( 'WGA_PLUGIN_URL', plugins_url( null, __FILE__ ) );
42
+ }
43
 
44
+
45
+
46
+ if ( ! defined( 'LOADING_GA_CACHE_AS_ADDON' ) ) {
47
+ require_once( WGA_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php' );
48
+ require_once( WGA_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php' );
49
+ }
50
+
51
+ $plugin_info = array(
52
+ 'prefix' => 'wbcr_gac_',
53
+ 'plugin_name' => 'wbcr_gac',
54
+ 'plugin_title' => __( 'Webcraftic Local Google Analytics', 'simple-google-analytics' ),
55
+ 'plugin_version' => WGA_PLUGIN_VERSION,
56
+ 'plugin_build' => 'free',
57
+ 'updates' => WGA_PLUGIN_DIR . '/updates/'
58
+ );
59
+
60
+ /**
61
+ * Проверяет совместимость с Wordpress, php и другими плагинами.
62
+ */
63
+ $compatibility = new Wbcr_FactoryClearfy_Compatibility( array_merge( $plugin_info, array(
64
+ 'factory_version' => 'FACTORY_409_VERSION',
65
+ 'plugin_already_activate' => defined( 'WGA_PLUGIN_ACTIVE' ),
66
+ 'plugin_as_component' => defined( 'LOADING_GA_CACHE_AS_ADDON' ),
67
+ 'plugin_dir' => WGA_PLUGIN_DIR,
68
+ 'plugin_base' => WGA_PLUGIN_BASE,
69
+ 'plugin_url' => WGA_PLUGIN_URL,
70
+ 'required_php_version' => '5.3',
71
+ 'required_wp_version' => '4.2.0',
72
+ 'required_clearfy_check_component' => true
73
+ ) ) );
74
+
75
+ /**
76
+ * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
77
+ * а пользователь получит предупреждение.
78
+ */
79
+ if ( ! $compatibility->check() ) {
80
+ return;
81
+ }
82
+
83
+ define( 'WGA_PLUGIN_ACTIVE', true );
84
+
85
+ if ( ! defined( 'LOADING_GA_CACHE_AS_ADDON' ) ) {
86
+ require_once( WGA_PLUGIN_DIR . '/libs/factory/core/boot.php' );
87
+ }
88
+
89
+ require_once( WGA_PLUGIN_DIR . '/includes/class.plugin.php' );
90
+
91
+ if ( ! defined( 'LOADING_GA_CACHE_AS_ADDON' ) ) {
92
+ new WGA_Plugin( __FILE__, $plugin_info );
93
+ }
94
 
components/ga-cache/updates/030002.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php #comp-page builds: premium
2
+
3
+ /**
4
+ * Updates for altering the table used to store statistics data.
5
+ * Adds new columns and renames existing ones in order to add support for the new social buttons.
6
+ */
7
+ class WGACUpdate030002 extends Wbcr_Factory409_Update {
8
+
9
+ public function install() {
10
+ /**
11
+ * Remove the old cron hook
12
+ */
13
+ if ( wp_next_scheduled( 'wbcr_clearfy_update_local_ga' ) ) {
14
+ wp_clear_scheduled_hook( 'wbcr_clearfy_update_local_ga' );
15
+ }
16
+
17
+ /**
18
+ * Add a new cron hook
19
+ */
20
+ if ( ! wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
21
+ wp_schedule_event( time(), 'twicedaily', 'wbcr/gac/update_analytic_library' );
22
+ }
23
+
24
+ $disable_display_features = $this->plugin->getPopulateOption( 'ga_caos_disable_display_features', false );
25
+ $this->plugin->updatePopulateOption( 'ga_disable_display_features', $disable_display_features );
26
+
27
+ $this->plugin->deletePopulateOption( 'ga_caos_disable_display_features' );
28
+ $this->plugin->deletePopulateOption( 'ga_caos_remove_wp_cron' );
29
+ }
30
+ }
components/ga-cache/updates/index.php ADDED
@@ -0,0 +1,2 @@
 
 
1
+ <?php
2
+ // Silence is golden.
components/html-minify/html-minify.php CHANGED
@@ -1,98 +1,119 @@
1
  <?php
2
- /**
3
- * Plugin Name: HTML Мinify
4
- * Plugin URI: https://clearfy.pro/html-minify/
5
- * Description: Ever look at the HTML markup of your website and notice how sloppy and amateurish it looks? The HTML Мinify options cleans up sloppy looking markup and minifies, which also speeds up download.
6
- * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
- * Version: 1.0.1
8
- * Text Domain: html-minify
9
- * Domain Path: /languages/
10
- * Author URI: https://clearfy.pro
11
- * Framework Version: FACTORY_409_VERSION
12
- */
13
-
14
- /*
15
- * #### CREDITS ####
16
- * This plugin is based on the plugin Autoptimize by the author Frank Goossens, we have finalized this code for our project and our goals.
17
- * Many thanks to Frank Goossens for the quality solution for optimizing scripts in Wordpress.
18
- *
19
- * Public License is a GPLv2 compatible license allowing you to change and use this version of the plugin for free.
20
- */
21
-
22
- // Exit if accessed directly
23
- if( !defined('ABSPATH') ) {
24
- exit;
25
- }
26
-
27
- define('WHTM_PLUGIN_VERSION', '1.0.1');
28
-
29
- // Директория плагина
30
- define('WHTM_PLUGIN_DIR', dirname(__FILE__));
31
-
32
- // Относительный путь к плагину
33
- define('WHTM_PLUGIN_BASE', plugin_basename(__FILE__));
34
-
35
- // Ссылка к директории плагина
36
- define('WHTM_PLUGIN_URL', plugins_url(null, __FILE__));
37
-
38
-
39
-
40
- if( !defined('LOADING_HTML_MINIFY_AS_ADDON') ) {
41
- require_once(WHTM_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php');
42
- require_once(WHTM_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php');
43
- }
44
-
45
- $plugin_info = array(
46
- 'prefix' => 'wbcr_htm_', // префикс для базы данных и полей формы
47
- 'plugin_name' => 'wbcr_html_minify', // имя плагина, как уникальный идентификатор
48
- 'plugin_title' => __('Webcraftic HTML Minify', 'html-minify'), // заголовок плагина
49
- 'plugin_version' => WHTM_PLUGIN_VERSION, // текущая версия плагина
50
- 'plugin_build' => 'free', // сборка плагина
51
- //'updates' => WHTM_PLUGIN_DIR . '/updates/' в этой папке хранятся миграции для разных версий плагина
52
- );
53
-
54
- /**
55
- * Проверяет совместимость с Wordpress, php и другими плагинами.
56
- */
57
- $compatibility = new Wbcr_FactoryClearfy_Compatibility(array_merge($plugin_info, array(
58
- 'plugin_already_activate' => defined('WHTM_PLUGIN_ACTIVE'),
59
- 'plugin_as_component' => defined('LOADING_HTML_MINIFY_AS_ADDON'),
60
- 'plugin_dir' => WHTM_PLUGIN_DIR,
61
- 'plugin_base' => WHTM_PLUGIN_BASE,
62
- 'plugin_url' => WHTM_PLUGIN_URL,
63
- 'required_php_version' => '5.4',
64
- 'required_wp_version' => '4.2.0',
65
- 'required_clearfy_check_component' => true
66
- )));
67
-
68
- /**
69
- * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
70
- * а пользователь получит предупреждение.
71
- */
72
- if( !$compatibility->check() ) {
73
- return;
74
- }
75
-
76
- // Устанавливаем контстанту, что плагин уже используется
77
- define('WHTM_PLUGIN_ACTIVE', true);
78
-
79
- // Этот плагин может быть аддоном плагина Clearfy, если он загружен, как аддон, то мы не подключаем фреймворк,
80
- // а наследуем функции фреймворка от плагина Clearfy. Если плагин скомпилирован, как отдельный плагин, то он использует собственный фреймворк для работы.
81
- // Константа LOADING_HTML_MINIFY_AS_ADDON утсанавливается в классе libs/factory/core/includes/Wbcr_Factory409_Plugin
82
-
83
- if( !defined('LOADING_HTML_MINIFY_AS_ADDON') ) {
84
- // Фреймворк - отвечает за интерфейс, содержит общие функции для серии плагинов и готовые шаблоны для быстрого развертывания плагина.
85
- require_once(WHTM_PLUGIN_DIR . '/libs/factory/core/boot.php');
86
- }
87
-
88
- // Основной класс плагина
89
- require_once(WHTM_PLUGIN_DIR . '/includes/class.plugin.php');
90
-
91
- // Класс WHTM_Plugin создается только, если этот плагин работает, как самостоятельный плагин.
92
- // Если плагин работает, как аддон, то класс создается родительским плагином.
93
-
94
- if( !defined('LOADING_HTML_MINIFY_AS_ADDON') ) {
95
- new WHTM_Plugin(__FILE__, $plugin_info);
96
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
 
98
 
1
  <?php
2
+ /**
3
+ * Plugin Name: HTML Мinify
4
+ * Plugin URI: https://clearfy.pro/html-minify/
5
+ * Description: Ever look at the HTML markup of your website and notice how sloppy and amateurish it looks? The HTML Мinify options cleans up sloppy looking markup and minifies, which also speeds up download.
6
+ * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
+ * Version: 1.0.1
8
+ * Text Domain: html-minify
9
+ * Domain Path: /languages/
10
+ * Author URI: https://clearfy.pro
11
+ * Framework Version: FACTORY_409_VERSION
12
+ */
13
+
14
+ /*
15
+ * #### CREDITS ####
16
+ * This plugin is based on the plugin Autoptimize by the author Frank Goossens, we have finalized this code for our project and our goals.
17
+ * Many thanks to Frank Goossens for the quality solution for optimizing scripts in Wordpress.
18
+ *
19
+ * Public License is a GPLv2 compatible license allowing you to change and use this version of the plugin for free.
20
+ */
21
+
22
+ // Exit if accessed directly
23
+ if ( ! defined( 'ABSPATH' ) ) {
24
+ exit;
25
+ }
26
+ if ( ! defined( 'WHTM_PLUGIN_VERSION' ) ) {
27
+ define( 'WHTM_PLUGIN_VERSION', '1.0.1' );
28
+ }
29
+
30
+ // Fix for ithemes sync. When the ithemes sync plugin accepts the request, set the WP_ADMIN constant,
31
+ // after which the plugin Clearfy begins to create errors, and how the logic of its work is broken.
32
+ // Solution to simply terminate the plugin if there is a request from ithemes sync
33
+ // --------------------------------------
34
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'ithemes_sync_request' ) {
35
+ return;
36
+ }
37
+
38
+ if ( isset( $_GET['ithemes-sync-request'] ) && ! empty( $_GET['ithemes-sync-request'] ) ) {
39
+ return;
40
+ }
41
+ // ----------------------------------------
42
+
43
+ // Директория плагина
44
+ if ( ! defined( 'WHTM_PLUGIN_DIR' ) ) {
45
+ define( 'WHTM_PLUGIN_DIR', dirname( __FILE__ ) );
46
+ }
47
+
48
+ // Относительный путь к плагину
49
+ if ( ! defined( 'WHTM_PLUGIN_BASE' ) ) {
50
+ define( 'WHTM_PLUGIN_BASE', plugin_basename( __FILE__ ) );
51
+ }
52
+
53
+ // Ссылка к директории плагина
54
+ if ( ! defined( 'WHTM_PLUGIN_URL' ) ) {
55
+ define( 'WHTM_PLUGIN_URL', plugins_url( null, __FILE__ ) );
56
+ }
57
+
58
+
59
+
60
+ if ( ! defined( 'LOADING_HTML_MINIFY_AS_ADDON' ) ) {
61
+ require_once( WHTM_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php' );
62
+ require_once( WHTM_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php' );
63
+ }
64
+
65
+ $plugin_info = array(
66
+ 'prefix' => 'wbcr_htm_', // префикс для базы данных и полей формы
67
+ 'plugin_name' => 'wbcr_html_minify', // имя плагина, как уникальный идентификатор
68
+ 'plugin_title' => __( 'Webcraftic HTML Minify', 'html-minify' ), // заголовок плагина
69
+ 'plugin_version' => WHTM_PLUGIN_VERSION, // текущая версия плагина
70
+ 'plugin_build' => 'free', // сборка плагина
71
+ //'updates' => WHTM_PLUGIN_DIR . '/updates/' в этой папке хранятся миграции для разных версий плагина
72
+ );
73
+
74
+ /**
75
+ * Проверяет совместимость с Wordpress, php и другими плагинами.
76
+ */
77
+ $compatibility = new Wbcr_FactoryClearfy_Compatibility( array_merge( $plugin_info, array(
78
+ 'factory_version' => 'FACTORY_409_VERSION',
79
+ 'plugin_already_activate' => defined( 'WHTM_PLUGIN_ACTIVE' ),
80
+ 'plugin_as_component' => defined( 'LOADING_HTML_MINIFY_AS_ADDON' ),
81
+ 'plugin_dir' => WHTM_PLUGIN_DIR,
82
+ 'plugin_base' => WHTM_PLUGIN_BASE,
83
+ 'plugin_url' => WHTM_PLUGIN_URL,
84
+ 'required_php_version' => '5.4',
85
+ 'required_wp_version' => '4.2.0',
86
+ 'required_clearfy_check_component' => true
87
+ ) ) );
88
+
89
+ /**
90
+ * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
91
+ * а пользователь получит предупреждение.
92
+ */
93
+ if ( ! $compatibility->check() ) {
94
+ return;
95
+ }
96
+
97
+ // Устанавливаем контстанту, что плагин уже используется
98
+ define( 'WHTM_PLUGIN_ACTIVE', true );
99
+
100
+ // Этот плагин может быть аддоном плагина Clearfy, если он загружен, как аддон, то мы не подключаем фреймворк,
101
+ // а наследуем функции фреймворка от плагина Clearfy. Если плагин скомпилирован, как отдельный плагин, то он использует собственный фреймворк для работы.
102
+ // Константа LOADING_HTML_MINIFY_AS_ADDON утсанавливается в классе libs/factory/core/includes/Wbcr_Factory409_Plugin
103
+
104
+ if ( ! defined( 'LOADING_HTML_MINIFY_AS_ADDON' ) ) {
105
+ // Фреймворк - отвечает за интерфейс, содержит общие функции для серии плагинов и готовые шаблоны для быстрого развертывания плагина.
106
+ require_once( WHTM_PLUGIN_DIR . '/libs/factory/core/boot.php' );
107
+ }
108
+
109
+ // Основной класс плагина
110
+ require_once( WHTM_PLUGIN_DIR . '/includes/class.plugin.php' );
111
+
112
+ // Класс WHTM_Plugin создается только, если этот плагин работает, как самостоятельный плагин.
113
+ // Если плагин работает, как аддон, то класс создается родительским плагином.
114
+
115
+ if ( ! defined( 'LOADING_HTML_MINIFY_AS_ADDON' ) ) {
116
+ new WHTM_Plugin( __FILE__, $plugin_info );
117
+ }
118
 
119
 
components/html-minify/languages/html-minify-es_ES.mo ADDED
Binary file
components/html-minify/languages/html-minify-es_ES.po ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of Plugins - Clearfy in Spanish (Spain)
2
+ # This file is distributed under the same license as the Plugins - Clearfy – WordPress optimization plugin and disable ultimate tweaker - Development (trunk) package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: \n"
6
+ "POT-Creation-Date: 2019-04-28 06:28+0300\n"
7
+ "PO-Revision-Date: 2019-04-28 06:28+0300\n"
8
+ "Last-Translator: \n"
9
+ "Language-Team: \n"
10
+ "Language: es\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
15
+ "X-Generator: Poedit 2.1.1\n"
16
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
17
+ "X-Generator: Poedit 2.1.1\n"
18
+ "X-Poedit-Basepath: ..\n"
19
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
20
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
21
+ "X-Poedit-SourceCharset: UTF-8\n"
22
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
23
+ "X-Poedit-SearchPath-0: .\n"
24
+ "X-Poedit-SearchPathExcluded-0: libs\n"
25
+ "X-Poedit-SearchPathExcluded-1: components\n"
26
+ "X-Poedit-SearchPathExcluded-2: cache\n"
27
+
28
+ #: admin/boot.php:23
29
+ msgid ""
30
+ "Clearfy: Html minify component is not compatible with the Autoptimize "
31
+ "plugin, please do not use them together to avoid conflicts. Please disable "
32
+ "the Html minify component"
33
+ msgstr ""
34
+ "Clearfy: el componente html minify no es compatible con el plugin "
35
+ "( Autoptimize ), no los use juntos para evitar conflictos. Por favor "
36
+ "deshabilite el componente html minify"
37
+
38
+ #: admin/boot.php:46 admin/boot.php:96
39
+ msgid "Optimize HTML Code?"
40
+ msgstr "¿Optimizar código HTML?"
41
+
42
+ #: admin/boot.php:52 admin/boot.php:106
43
+ msgid "Keep HTML comments?"
44
+ msgstr "¿Mantener los comentarios HTML?"
45
+
46
+ #: admin/boot.php:69
47
+ msgid "One click optimize html code"
48
+ msgstr "Optimizar html con un Click"
49
+
50
+ #: admin/boot.php:71
51
+ msgid "One click optimize html code and scripts"
52
+ msgstr "Optimizar html y scripts con un Click"
53
+
54
+ #: admin/boot.php:88
55
+ msgid "HTML Options"
56
+ msgstr "Opciones HTML"
57
+
58
+ #: admin/boot.php:88
59
+ msgid ""
60
+ "Ever look at the HTML markup of your website and notice how sloppy and "
61
+ "amateurish it looks? The Minify HTML options cleans up sloppy looking markup "
62
+ "and minifies, which also speeds up download."
63
+ msgstr ""
64
+ "¿Alguna vez has mirado el código HTML de tu sitio web y has notado lo "
65
+ "descuidado y extraño que se ve? Las opciones Minify HTML solventan ese "
66
+ "inconveniente y minimizan, acelerando la carga de su Web."
67
+
68
+ #: admin/boot.php:108
69
+ msgid "Enable this if you want HTML comments to remain in the page."
70
+ msgstr ""
71
+ "Habilita esto si quieres que los comentarios HTML permanezcan en la página."
72
+
73
+ #: admin/pages/settings.php:40 admin/pages/settings.php:63
74
+ msgid "HTML Minify"
75
+ msgstr "Minificar HTML"
76
+
77
+ #: admin/pages/settings.php:64
78
+ msgid "General"
79
+ msgstr "General"
80
+
81
+ #: html-minify.php:102
82
+ msgid "Webcraftic HTML Minify"
83
+ msgstr "Webcraftic HTML Minify"
components/minify-and-combine/admin/pages/settings.php CHANGED
@@ -305,7 +305,7 @@ This can be fully automated for different types of pages with the Мinify And Co
305
 
306
  $options[] = array(
307
  'type' => 'html',
308
- 'html' => '<div class="wbcr-factory-page-group-header"><strong>' . __( 'Cache Info', 'minify-and-combine' ) . '</strong><p>' . __( 'Описание раздела оптимизация', 'minify-and-combine' ) . '</p></div>'
309
  );
310
 
311
  // Произвольный html код
305
 
306
  $options[] = array(
307
  'type' => 'html',
308
+ 'html' => '<div class="wbcr-factory-page-group-header"><strong>' . __( 'Cache Info', 'minify-and-combine' ) . '</strong><p></p></div>'
309
  );
310
 
311
  // Произвольный html код
components/minify-and-combine/includes/classes/class.mac-base.php CHANGED
@@ -368,9 +368,9 @@ abstract class WMAC_PluginBase
368
  $filehash = null;
369
 
370
  // Grab the parts we need.
371
- $parts = explode( $matches[1], '|' );
372
  if ( ! empty( $parts ) ) {
373
- $filepath = isset( $parts[0] ) ? $parts[0] : null;
374
  $filehash = isset( $parts[1] ) ? $parts[1] : null;
375
  }
376
 
368
  $filehash = null;
369
 
370
  // Grab the parts we need.
371
+ $parts = explode( '|', $matches[1] );
372
  if ( ! empty( $parts ) ) {
373
+ $filepath = isset( $parts[0] ) ? base64_decode($parts[0]) : null;
374
  $filehash = isset( $parts[1] ) ? $parts[1] : null;
375
  }
376
 
components/minify-and-combine/includes/classes/class.mac-helper.php CHANGED
@@ -38,28 +38,6 @@ class WMAC_PluginHelper
38
  return $available;
39
  }
40
 
41
- /**
42
- * Returns true when iconv is available.
43
- *
44
- * @param bool|null $override Allows overriding the decision.
45
- *
46
- * @return bool
47
- */
48
- public static function iconvAvailable( $override = null )
49
- {
50
- static $available = null;
51
-
52
- if ( null === $available ) {
53
- $available = \extension_loaded( 'iconv' );
54
- }
55
-
56
- if ( null !== $override ) {
57
- $available = $override;
58
- }
59
-
60
- return $available;
61
- }
62
-
63
  /**
64
  * Multibyte-capable strpos() if support is available on the server.
65
  * If not, it falls back to using \strpos().
@@ -75,8 +53,6 @@ class WMAC_PluginHelper
75
  {
76
  if ( self::mbstringAvailable() ) {
77
  return ( null === $encoding ) ? \mb_strpos( $haystack, $needle, $offset ) : \mb_strlen( $haystack, $needle, $offset, $encoding );
78
- } elseif ( self::iconvAvailable() ) {
79
- return ( null === $encoding ) ? \iconv_strpos( $haystack, $needle, $offset ) : \iconv_strpos( $haystack, $needle, $offset, $encoding );
80
  } else {
81
  return \strpos( $haystack, $needle, $offset );
82
  }
@@ -84,7 +60,7 @@ class WMAC_PluginHelper
84
 
85
  /**
86
  * Attempts to return the number of characters in the given $string if
87
- * mbstring or iconv is available. Returns the number of bytes
88
  * (instead of characters) as fallback.
89
  *
90
  * @param string $string String.
@@ -97,8 +73,6 @@ class WMAC_PluginHelper
97
  {
98
  if ( self::mbstringAvailable() ) {
99
  return ( null === $encoding ) ? \mb_strlen( $string ) : \mb_strlen( $string, $encoding );
100
- } elseif ( self::iconvAvailable() ) {
101
- return ( null === $encoding ) ? @iconv_strlen( $string ) : @iconv_strlen( $string, $encoding );
102
  } else {
103
  return \strlen( $string );
104
  }
@@ -107,7 +81,7 @@ class WMAC_PluginHelper
107
  /**
108
  * Our wrapper around implementations of \substr_replace()
109
  * that attempts to not break things horribly if at all possible.
110
- * Uses mbstring and/or iconv if available, before falling back to regular
111
  * substr_replace() (which works just fine in the majority of cases).
112
  *
113
  * @param string $string String.
@@ -153,70 +127,11 @@ class WMAC_PluginHelper
153
  }
154
 
155
  return "{$leader}{$replacement}{$trailer}";
156
- } elseif ( self::iconvAvailable() ) {
157
- $strlen = self::strlen( $string, $encoding );
158
-
159
- if ( $start < 0 ) {
160
- $start = \max( 0, $strlen + $start );
161
- $start = $strlen + $start;
162
- if ( $start < 0 ) {
163
- $start = 0;
164
- }
165
- } elseif ( $start > $strlen ) {
166
- $start = $strlen;
167
- }
168
-
169
- if ( $length < 0 ) {
170
- $length = \max( 0, $strlen - $start + $length );
171
- } elseif ( null === $length || ( $length > $strlen ) ) {
172
- $length = $strlen;
173
- }
174
-
175
- if ( ( $start + $length ) > $strlen ) {
176
- $length = $strlen - $start;
177
- }
178
-
179
- if ( null === $encoding ) {
180
- return self::iconvSubstr( $string, 0, $start ) . $replacement . self::iconvSubstr( $string, $start + $length, $strlen - $start - $length );
181
- }
182
-
183
- return self::iconvSubstr( $string, 0, $start, $encoding ) . $replacement . self::iconvSubstr( $string, $start + $length, $strlen - $start - $length, $encoding );
184
  }
185
 
186
  return ( null === $length ) ? \substr_replace( $string, $replacement, $start ) : \substr_replace( $string, $replacement, $start, $length );
187
  }
188
 
189
- /**
190
- * Wrapper around iconv_substr().
191
- *
192
- * @param string $s String.
193
- * @param int $start Start offset.
194
- * @param int|null $length Length.
195
- * @param string|null $encoding Encoding.
196
- *
197
- * @return string
198
- */
199
- protected static function iconvSubstr( $s, $start, $length = null, $encoding = null )
200
- {
201
- if ( $start < 0 ) {
202
- $start = self::strlen( $s, $encoding ) + $start;
203
- if ( $start < 0 ) {
204
- $start = 0;
205
- }
206
- }
207
-
208
- if ( null === $length ) {
209
- $length = 2147483647;
210
- } elseif ( $length < 0 ) {
211
- $length = self::strlen( $s, $encoding ) + ( $length - $start );
212
- if ( $length < 0 ) {
213
- return '';
214
- }
215
- }
216
-
217
- return (string) ( null === $encoding ) ? \iconv_substr( $s, $start, $length ) : \iconv_substr( $s, $start, $length, $encoding );
218
- }
219
-
220
  /**
221
  * Decides whether this is a "subdirectory site" or not.
222
  *
38
  return $available;
39
  }
40
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  /**
42
  * Multibyte-capable strpos() if support is available on the server.
43
  * If not, it falls back to using \strpos().
53
  {
54
  if ( self::mbstringAvailable() ) {
55
  return ( null === $encoding ) ? \mb_strpos( $haystack, $needle, $offset ) : \mb_strlen( $haystack, $needle, $offset, $encoding );
 
 
56
  } else {
57
  return \strpos( $haystack, $needle, $offset );
58
  }
60
 
61
  /**
62
  * Attempts to return the number of characters in the given $string if
63
+ * mbstring is available. Returns the number of bytes
64
  * (instead of characters) as fallback.
65
  *
66
  * @param string $string String.
73
  {
74
  if ( self::mbstringAvailable() ) {
75
  return ( null === $encoding ) ? \mb_strlen( $string ) : \mb_strlen( $string, $encoding );
 
 
76
  } else {
77
  return \strlen( $string );
78
  }
81
  /**
82
  * Our wrapper around implementations of \substr_replace()
83
  * that attempts to not break things horribly if at all possible.
84
+ * Uses mbstring if available, before falling back to regular
85
  * substr_replace() (which works just fine in the majority of cases).
86
  *
87
  * @param string $string String.
127
  }
128
 
129
  return "{$leader}{$replacement}{$trailer}";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
  }
131
 
132
  return ( null === $length ) ? \substr_replace( $string, $replacement, $start ) : \substr_replace( $string, $replacement, $start, $length );
133
  }
134
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  /**
136
  * Decides whether this is a "subdirectory site" or not.
137
  *
components/minify-and-combine/includes/classes/class.mac-main.php CHANGED
@@ -79,6 +79,15 @@
79
  if( !defined('WMAC_HASH') ) {
80
  define('WMAC_HASH', wp_hash(WMAC_PluginCache::getCacheUrl()));
81
  }
 
 
 
 
 
 
 
 
 
82
  }
83
 
84
  /**
79
  if( !defined('WMAC_HASH') ) {
80
  define('WMAC_HASH', wp_hash(WMAC_PluginCache::getCacheUrl()));
81
  }
82
+
83
+ // Multibyte-capable string replacements are available with a filter.
84
+ // Also requires 'mbstring' extension.
85
+ $with_mbstring = apply_filters( 'wbcr/mac/main_use_mbstring', false );
86
+ if ( $with_mbstring ) {
87
+ WMAC_PluginHelper::mbstringAvailable( \extensions_loaded( 'mbstring' ) );
88
+ } else {
89
+ WMAC_PluginHelper::mbstringAvailable( false );
90
+ }
91
  }
92
 
93
  /**
components/minify-and-combine/includes/classes/class.mac-styles.php CHANGED
@@ -234,8 +234,8 @@ class WMAC_PluginStyles extends WMAC_PluginBase
234
  "this.onload=null;this.rel='stylesheet'",
235
  $url
236
  );
237
- // Adapt original <link> element for CSS to be preloaded.
238
- $new_tag = str_replace(
239
  array(
240
  "rel='stylesheet'",
241
  'rel="stylesheet"',
@@ -816,29 +816,6 @@ class WMAC_PluginStyles extends WMAC_PluginBase
816
  if ( $this->defer ) {
817
  $preloadCssBlock = '';
818
  $noScriptCssBlock = "<noscript id=\"aonoscrcss\">";
819
-
820
- /*$defer_inline_code = $this->defer_inline;
821
- if ( ! empty( $defer_inline_code ) ) {
822
- if ( apply_filters( 'wmac_filter_css_critcss_minify', true ) ) {
823
- $iCssHash = md5( $defer_inline_code );
824
- $iCssCache = new WMAC_PluginCache( $iCssHash, 'css' );
825
- if ( $iCssCache->check() ) {
826
- // we have the optimized inline CSS in cache.
827
- $defer_inline_code = $iCssCache->retrieve();
828
- } else {
829
- $cssmin = new WMAC_PluginCSSmin();
830
- $tmp_code = trim( $cssmin->run( $defer_inline_code ) );
831
-
832
- if ( ! empty( $tmp_code ) ) {
833
- $defer_inline_code = $tmp_code;
834
- $iCssCache->cache( $defer_inline_code, 'text/css' );
835
- unset( $tmp_code );
836
- }
837
- }
838
- }
839
- $code_out = '<style type="text/css" id="aoatfcss" media="all">' . $defer_inline_code . '</style>';
840
- $this->injectInHtml( $code_out, $replaceTag );
841
- }*/
842
  }
843
 
844
  foreach ( $this->url as $media => $url ) {
@@ -849,7 +826,6 @@ class WMAC_PluginStyles extends WMAC_PluginBase
849
  $preloadCssBlock .= '<link rel="preload" as="style" media="' . $media . '" href="' . $url . '" onload="' . $preloadOnLoad . '" />';
850
  $noScriptCssBlock .= '<link type="text/css" media="' . $media . '" href="' . $url . '" rel="stylesheet" />';
851
  } else {
852
- // $this->inject_in_html('<link type="text/css" media="' . $media . '" href="' . $url . '" rel="stylesheet" />', $replaceTag);
853
  if ( strlen( $this->csscode[$media] ) > $this->cssinlinesize ) {
854
  $this->injectInHtml( '<link type="text/css" media="' . $media . '" href="' . $url . '" rel="stylesheet" />', $replaceTag );
855
  } elseif ( strlen( $this->csscode[$media] ) > 0 ) {
@@ -928,6 +904,7 @@ class WMAC_PluginStyles extends WMAC_PluginBase
928
  * $newurl = preg_replace( '/https?:/', '', str_replace( ' ', '%20', WMAC_PluginMain::getContentUrl() . str_replace( '//', '/', $dir . '/' . $url ) ) );
929
  */
930
  $newurl = preg_replace( '/https?:/', '', str_replace( ' ', '%20', WMAC_WP_ROOT_URL . str_replace( '//', '/', $dir . '/' . $url ) ) );
 
931
 
932
  /**
933
  * Hash the url + whatever was behind potentially for replacement
234
  "this.onload=null;this.rel='stylesheet'",
235
  $url
236
  );
237
+ // Adapt original <link> element for CSS to be preloaded and add <noscript>-version for fallback.
238
+ $new_tag = '<noscript>' . $new_tag . '</noscript>' . str_replace(
239
  array(
240
  "rel='stylesheet'",
241
  'rel="stylesheet"',
816
  if ( $this->defer ) {
817
  $preloadCssBlock = '';
818
  $noScriptCssBlock = "<noscript id=\"aonoscrcss\">";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
819
  }
820
 
821
  foreach ( $this->url as $media => $url ) {
826
  $preloadCssBlock .= '<link rel="preload" as="style" media="' . $media . '" href="' . $url . '" onload="' . $preloadOnLoad . '" />';
827
  $noScriptCssBlock .= '<link type="text/css" media="' . $media . '" href="' . $url . '" rel="stylesheet" />';
828
  } else {
 
829
  if ( strlen( $this->csscode[$media] ) > $this->cssinlinesize ) {
830
  $this->injectInHtml( '<link type="text/css" media="' . $media . '" href="' . $url . '" rel="stylesheet" />', $replaceTag );
831
  } elseif ( strlen( $this->csscode[$media] ) > 0 ) {
904
  * $newurl = preg_replace( '/https?:/', '', str_replace( ' ', '%20', WMAC_PluginMain::getContentUrl() . str_replace( '//', '/', $dir . '/' . $url ) ) );
905
  */
906
  $newurl = preg_replace( '/https?:/', '', str_replace( ' ', '%20', WMAC_WP_ROOT_URL . str_replace( '//', '/', $dir . '/' . $url ) ) );
907
+ $newurl = apply_filters( 'wbcr/mac/css_fixurl_newurl', $newurl );
908
 
909
  /**
910
  * Hash the url + whatever was behind potentially for replacement
components/minify-and-combine/includes/classes/ext/php/yui-php-cssmin-bundled/Minifier.php CHANGED
@@ -1,864 +1,935 @@
1
  <?php
2
 
3
- /*!
4
- * CssMin
5
- * Author: Tubal Martin - http://tubalmartin.me/
6
- * Repo: https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port
7
- *
8
- * This is a PHP port of the CSS minification tool distributed with YUICompressor,
9
- * itself a port of the cssmin utility by Isaac Schlueter - http://foohack.com/
10
- * Permission is hereby granted to use the PHP version under the same
11
- * conditions as the YUICompressor.
12
- */
13
-
14
- /*!
15
- * YUI Compressor
16
- * http://developer.yahoo.com/yui/compressor/
17
- * Author: Julien Lecomte - http://www.julienlecomte.net/
18
- * Copyright (c) 2013 Yahoo! Inc. All rights reserved.
19
- * The copyrights embodied in the content of this file are licensed
20
- * by Yahoo! Inc. under the BSD (revised) open source license.
21
- */
22
-
23
- namespace WMAC\tubalmartin\CssMin;
24
-
25
- if( !defined('ABSPATH') ) {
26
- exit;
27
- }
28
-
29
- class Minifier {
30
-
31
- const QUERY_FRACTION = '_CSSMIN_QF_';
32
- const COMMENT_TOKEN = '_CSSMIN_CMT_%d_';
33
- const COMMENT_TOKEN_START = '_CSSMIN_CMT_';
34
- const RULE_BODY_TOKEN = '_CSSMIN_RBT_%d_';
35
- const PRESERVED_TOKEN = '_CSSMIN_PTK_%d_';
36
-
37
- // Token lists
38
- private $comments = array();
39
- private $ruleBodies = array();
40
- private $preservedTokens = array();
41
-
42
- // Output options
43
- private $keepImportantComments = true;
44
- private $keepSourceMapComment = false;
45
- private $linebreakPosition = 0;
46
-
47
- // PHP ini limits
48
- private $raisePhpLimits;
49
- private $memoryLimit;
50
- private $maxExecutionTime = 60; // 1 min
51
- private $pcreBacktrackLimit;
52
- private $pcreRecursionLimit;
53
-
54
- // Color maps
55
- private $hexToNamedColorsMap;
56
- private $namedToHexColorsMap;
57
-
58
- // Regexes
59
- private $numRegex;
60
- private $charsetRegex = '/@charset [^;]+;/Si';
61
- private $importRegex = '/@import [^;]+;/Si';
62
- private $namespaceRegex = '/@namespace [^;]+;/Si';
63
- private $namedToHexColorsRegex;
64
- private $shortenOneZeroesRegex;
65
- private $shortenTwoZeroesRegex;
66
- private $shortenThreeZeroesRegex;
67
- private $shortenFourZeroesRegex;
68
- private $unitsGroupRegex = '(?:ch|cm|em|ex|gd|in|mm|px|pt|pc|q|rem|vh|vmax|vmin|vw|%)';
69
-
70
- /**
71
- * @param bool|int $raisePhpLimits If true, PHP settings will be raised if needed
72
- */
73
- public function __construct($raisePhpLimits = true)
74
- {
75
- $this->raisePhpLimits = (bool)$raisePhpLimits;
76
- $this->memoryLimit = 128 * 1048576; // 128MB in bytes
77
- $this->pcreBacktrackLimit = 1000 * 1000;
78
- $this->pcreRecursionLimit = 500 * 1000;
79
- $this->hexToNamedColorsMap = Colors::getHexToNamedMap();
80
- $this->namedToHexColorsMap = Colors::getNamedToHexMap();
81
- $this->namedToHexColorsRegex = sprintf('/([:,( ])(%s)( |,|\)|;|$)/Si', implode('|', array_keys($this->namedToHexColorsMap)));
82
- $this->numRegex = sprintf('-?\d*\.?\d+%s?', $this->unitsGroupRegex);
83
- $this->setShortenZeroValuesRegexes();
84
- }
85
-
86
- /**
87
- * Parses & minifies the given input CSS string
88
- * @param string $css
89
- * @return string
90
- */
91
- public function run($css = '')
92
- {
93
- if( empty($css) || !is_string($css) ) {
94
- return '';
95
- }
96
-
97
- $this->resetRunProperties();
98
-
99
- if( $this->raisePhpLimits ) {
100
- $this->doRaisePhpLimits();
101
- }
102
-
103
- return $this->minify($css);
104
- }
105
-
106
- /**
107
- * Sets whether to keep or remove sourcemap special comment.
108
- * Sourcemap comments are removed by default.
109
- * @param bool $keepSourceMapComment
110
- */
111
- public function keepSourceMapComment($keepSourceMapComment = true)
112
- {
113
- $this->keepSourceMapComment = (bool)$keepSourceMapComment;
114
- }
115
-
116
- /**
117
- * Sets whether to keep or remove important comments.
118
- * Important comments outside of a declaration block are kept by default.
119
- * @param bool $removeImportantComments
120
- */
121
- public function removeImportantComments($removeImportantComments = true)
122
- {
123
- $this->keepImportantComments = !(bool)$removeImportantComments;
124
- }
125
-
126
- /**
127
- * Sets the approximate column after which long lines will be splitted in the output
128
- * with a linebreak.
129
- * @param int $position
130
- */
131
- public function setLineBreakPosition($position)
132
- {
133
- $this->linebreakPosition = (int)$position;
134
- }
135
-
136
- /**
137
- * Sets the memory limit for this script
138
- * @param int|string $limit
139
- */
140
- public function setMemoryLimit($limit)
141
- {
142
- $this->memoryLimit = Utils::normalizeInt($limit);
143
- }
144
-
145
- /**
146
- * Sets the maximum execution time for this script
147
- * @param int|string $seconds
148
- */
149
- public function setMaxExecutionTime($seconds)
150
- {
151
- $this->maxExecutionTime = (int)$seconds;
152
- }
153
-
154
- /**
155
- * Sets the PCRE backtrack limit for this script
156
- * @param int $limit
157
- */
158
- public function setPcreBacktrackLimit($limit)
159
- {
160
- $this->pcreBacktrackLimit = (int)$limit;
161
- }
162
-
163
- /**
164
- * Sets the PCRE recursion limit for this script
165
- * @param int $limit
166
- */
167
- public function setPcreRecursionLimit($limit)
168
- {
169
- $this->pcreRecursionLimit = (int)$limit;
170
- }
171
-
172
- /**
173
- * Builds regular expressions needed for shortening zero values
174
- */
175
- private function setShortenZeroValuesRegexes()
176
- {
177
- $zeroRegex = '0' . $this->unitsGroupRegex;
178
- $numOrPosRegex = '(' . $this->numRegex . '|top|left|bottom|right|center) ';
179
- $oneZeroSafeProperties = array(
180
- '(?:line-)?height',
181
- '(?:(?:min|max)-)?width',
182
- 'top',
183
- 'left',
184
- 'background-position',
185
- 'bottom',
186
- 'right',
187
- 'border(?:-(?:top|left|bottom|right))?(?:-width)?',
188
- 'border-(?:(?:top|bottom)-(?:left|right)-)?radius',
189
- 'column-(?:gap|width)',
190
- 'margin(?:-(?:top|left|bottom|right))?',
191
- 'outline-width',
192
- 'padding(?:-(?:top|left|bottom|right))?'
193
- );
194
-
195
- // First zero regex
196
- $regex = '/(^|;)(' . implode('|', $oneZeroSafeProperties) . '):%s/Si';
197
- $this->shortenOneZeroesRegex = sprintf($regex, $zeroRegex);
198
-
199
- // Multiple zeroes regexes
200
- $regex = '/(^|;)(margin|padding|border-(?:width|radius)|background-position):%s/Si';
201
- $this->shortenTwoZeroesRegex = sprintf($regex, $numOrPosRegex . $zeroRegex);
202
- $this->shortenThreeZeroesRegex = sprintf($regex, $numOrPosRegex . $numOrPosRegex . $zeroRegex);
203
- $this->shortenFourZeroesRegex = sprintf($regex, $numOrPosRegex . $numOrPosRegex . $numOrPosRegex . $zeroRegex);
204
- }
205
-
206
- /**
207
- * Resets properties whose value may change between runs
208
- */
209
- private function resetRunProperties()
210
- {
211
- $this->comments = array();
212
- $this->ruleBodies = array();
213
- $this->preservedTokens = array();
214
- }
215
-
216
- /**
217
- * Tries to configure PHP to use at least the suggested minimum settings
218
- * @return void
219
- */
220
- private function doRaisePhpLimits()
221
- {
222
- $phpLimits = array(
223
- 'memory_limit' => $this->memoryLimit,
224
- 'max_execution_time' => $this->maxExecutionTime,
225
- 'pcre.backtrack_limit' => $this->pcreBacktrackLimit,
226
- 'pcre.recursion_limit' => $this->pcreRecursionLimit
227
- );
228
-
229
- // If current settings are higher respect them.
230
- foreach($phpLimits as $name => $suggested) {
231
- $current = Utils::normalizeInt(ini_get($name));
232
-
233
- if( $current >= $suggested ) {
234
- continue;
235
- }
236
-
237
- // memoryLimit exception: allow -1 for "no memory limit".
238
- if( $name === 'memory_limit' && $current === -1 ) {
239
- continue;
240
- }
241
-
242
- // maxExecutionTime exception: allow 0 for "no memory limit".
243
- if( $name === 'max_execution_time' && $current === 0 ) {
244
- continue;
245
- }
246
-
247
- ini_set($name, $suggested);
248
- }
249
- }
250
-
251
- /**
252
- * Registers a preserved token
253
- * @param string $token
254
- * @return string The token ID string
255
- */
256
- private function registerPreservedToken($token)
257
- {
258
- $tokenId = sprintf(self::PRESERVED_TOKEN, count($this->preservedTokens));
259
- $this->preservedTokens[$tokenId] = $token;
260
-
261
- return $tokenId;
262
- }
263
-
264
- /**
265
- * Registers a candidate comment token
266
- * @param string $comment
267
- * @return string The comment token ID string
268
- */
269
- private function registerCommentToken($comment)
270
- {
271
- $tokenId = sprintf(self::COMMENT_TOKEN, count($this->comments));
272
- $this->comments[$tokenId] = $comment;
273
-
274
- return $tokenId;
275
- }
276
-
277
- /**
278
- * Registers a rule body token
279
- * @param string $body the minified rule body
280
- * @return string The rule body token ID string
281
- */
282
- private function registerRuleBodyToken($body)
283
- {
284
- if( empty($body) ) {
285
- return '';
286
- }
287
-
288
- $tokenId = sprintf(self::RULE_BODY_TOKEN, count($this->ruleBodies));
289
- $this->ruleBodies[$tokenId] = $body;
290
-
291
- return $tokenId;
292
- }
293
-
294
- /**
295
- * Parses & minifies the given input CSS string
296
- * @param string $css
297
- * @return string
298
- */
299
- private function minify($css)
300
- {
301
- // Process data urls
302
- $css = $this->processDataUrls($css);
303
-
304
- // Process comments
305
- $css = preg_replace_callback('/(?<!\\\\)\/\*(.*?)\*(?<!\\\\)\//Ss', array(
306
- $this,
307
- 'processCommentsCallback'
308
- ), $css);
309
-
310
- // IE7: Process Microsoft matrix filters (whitespaces between Matrix parameters). Can contain strings inside.
311
- $css = preg_replace_callback('/filter:\s*progid:DXImageTransform\.Microsoft\.Matrix\(([^)]+)\)/Ss', array(
312
- $this,
313
- 'processOldIeSpecificMatrixDefinitionCallback'
314
- ), $css);
315
-
316
- // Process quoted unquotable attribute selectors to unquote them. Covers most common cases.
317
- // Likelyhood of a quoted attribute selector being a substring in a string: Very very low.
318
- $css = preg_replace('/\[\s*([a-z][a-z-]+)\s*([\*\|\^\$~]?=)\s*[\'"](-?[a-z_][a-z0-9-_]+)[\'"]\s*\]/Ssi', '[$1$2$3]', $css);
319
-
320
- // Process strings so their content doesn't get accidentally minified
321
- $css = preg_replace_callback('/(?:"(?:[^\\\\"]|\\\\.|\\\\)*")|' . "(?:'(?:[^\\\\']|\\\\.|\\\\)*')/S", array(
322
- $this,
323
- 'processStringsCallback'
324
- ), $css);
325
-
326
- // Normalize all whitespace strings to single spaces. Easier to work with that way.
327
- $css = preg_replace('/\s+/S', ' ', $css);
328
-
329
- // Process import At-rules with unquoted URLs so URI reserved characters such as a semicolon may be used safely.
330
- $css = preg_replace_callback('/@import url\(([^\'"]+?)\)( |;)/Si', array(
331
- $this,
332
- 'processImportUnquotedUrlAtRulesCallback'
333
- ), $css);
334
-
335
- // Process comments
336
- $css = $this->processComments($css);
337
-
338
- // Process rule bodies
339
- $css = $this->processRuleBodies($css);
340
-
341
- // Process at-rules and selectors
342
- $css = $this->processAtRulesAndSelectors($css);
343
-
344
- // Restore preserved rule bodies before splitting
345
- $css = strtr($css, $this->ruleBodies);
346
-
347
- // Split long lines in output if required
348
- $css = $this->processLongLineSplitting($css);
349
-
350
- // Restore preserved comments and strings
351
- $css = strtr($css, $this->preservedTokens);
352
-
353
- return trim($css);
354
- }
355
-
356
- /**
357
- * Searches & replaces all data urls with tokens before we start compressing,
358
- * to avoid performance issues running some of the subsequent regexes against large string chunks.
359
- * @param string $css
360
- * @return string
361
- */
362
- private function processDataUrls($css)
363
- {
364
- $ret = '';
365
- $searchOffset = $substrOffset = 0;
366
-
367
- // Since we need to account for non-base64 data urls, we need to handle
368
- // ' and ) being part of the data string.
369
- while( preg_match('/url\(\s*(["\']?)data:/Si', $css, $m, PREG_OFFSET_CAPTURE, $searchOffset) ) {
370
- $matchStartIndex = $m[0][1];
371
- $dataStartIndex = $matchStartIndex + 4; // url( length
372
- $searchOffset = $matchStartIndex + strlen($m[0][0]);
373
- $terminator = $m[1][0]; // ', " or empty (not quoted)
374
- $terminatorRegex = '/(?<!\\\\)' . (strlen($terminator) === 0
375
- ? ''
376
- : $terminator . '\s*') . '(\))/S';
377
-
378
- $ret .= substr($css, $substrOffset, $matchStartIndex - $substrOffset);
379
-
380
- // Terminator found
381
- if( preg_match($terminatorRegex, $css, $matches, PREG_OFFSET_CAPTURE, $searchOffset) ) {
382
- $matchEndIndex = $matches[1][1];
383
- $searchOffset = $matchEndIndex + 1;
384
- $token = substr($css, $dataStartIndex, $matchEndIndex - $dataStartIndex);
385
-
386
- // Remove all spaces only for base64 encoded URLs.
387
- if( stripos($token, 'base64,') !== false ) {
388
- $token = preg_replace('/\s+/S', '', $token);
389
- }
390
-
391
- $ret .= 'url(' . $this->registerPreservedToken(trim($token)) . ')';
392
- // No end terminator found, re-add the whole match. Should we throw/warn here?
393
- } else {
394
- $ret .= substr($css, $matchStartIndex, $searchOffset - $matchStartIndex);
395
- }
396
-
397
- $substrOffset = $searchOffset;
398
- }
399
-
400
- $ret .= substr($css, $substrOffset);
401
-
402
- return $ret;
403
- }
404
-
405
- /**
406
- * Registers all comments found as candidates to be preserved.
407
- * @param array $matches
408
- * @return string
409
- */
410
- private function processCommentsCallback($matches)
411
- {
412
- return '/*' . $this->registerCommentToken($matches[1]) . '*/';
413
- }
414
-
415
- /**
416
- * Preserves old IE Matrix string definition
417
- * @param array $matches
418
- * @return string
419
- */
420
- private function processOldIeSpecificMatrixDefinitionCallback($matches)
421
- {
422
- return 'filter:progid:DXImageTransform.Microsoft.Matrix(' . $this->registerPreservedToken($matches[1]) . ')';
423
- }
424
-
425
- /**
426
- * Preserves strings found
427
- * @param array $matches
428
- * @return string
429
- */
430
- private function processStringsCallback($matches)
431
- {
432
- $match = $matches[0];
433
- $quote = substr($match, 0, 1);
434
- $match = substr($match, 1, -1);
435
-
436
- // maybe the string contains a comment-like substring?
437
- // one, maybe more? put'em back then
438
- if( strpos($match, self::COMMENT_TOKEN_START) !== false ) {
439
- $match = strtr($match, $this->comments);
440
- }
441
-
442
- // minify alpha opacity in filter strings
443
- $match = str_ireplace('progid:DXImageTransform.Microsoft.Alpha(Opacity=', 'alpha(opacity=', $match);
444
-
445
- return $quote . $this->registerPreservedToken($match) . $quote;
446
- }
447
-
448
- /**
449
- * Searches & replaces all import at-rule unquoted urls with tokens so URI reserved characters such as a semicolon
450
- * may be used safely in a URL.
451
- * @param array $matches
452
- * @return string
453
- */
454
- private function processImportUnquotedUrlAtRulesCallback($matches)
455
- {
456
- return '@import url(' . $this->registerPreservedToken($matches[1]) . ')' . $matches[2];
457
- }
458
-
459
- /**
460
- * Preserves or removes comments found.
461
- * @param string $css
462
- * @return string
463
- */
464
- private function processComments($css)
465
- {
466
- foreach($this->comments as $commentId => $comment) {
467
- $commentIdString = '/*' . $commentId . '*/';
468
-
469
- // ! in the first position of the comment means preserve
470
- // so push to the preserved tokens keeping the !
471
- if( $this->keepImportantComments && strpos($comment, '!') === 0 ) {
472
- $preservedTokenId = $this->registerPreservedToken($comment);
473
- // Put new lines before and after /*! important comments
474
- $css = str_replace($commentIdString, "\n/*$preservedTokenId*/\n", $css);
475
- continue;
476
- }
477
-
478
- // # sourceMappingURL= in the first position of the comment means sourcemap
479
- // so push to the preserved tokens if {$this->keepSourceMapComment} is truthy.
480
- if( $this->keepSourceMapComment && strpos($comment, '# sourceMappingURL=') === 0 ) {
481
- $preservedTokenId = $this->registerPreservedToken($comment);
482
- // Add new line before the sourcemap comment
483
- $css = str_replace($commentIdString, "\n/*$preservedTokenId*/", $css);
484
- continue;
485
- }
486
-
487
- // Keep empty comments after child selectors (IE7 hack)
488
- // e.g. html >/**/ body
489
- if( strlen($comment) === 0 && strpos($css, '>/*' . $commentId) !== false ) {
490
- $css = str_replace($commentId, $this->registerPreservedToken(''), $css);
491
- continue;
492
- }
493
-
494
- // in all other cases kill the comment
495
- $css = str_replace($commentIdString, '', $css);
496
- }
497
-
498
- // Normalize whitespace again
499
- $css = preg_replace('/ +/S', ' ', $css);
500
-
501
- return $css;
502
- }
503
-
504
- /**
505
- * Finds, minifies & preserves all rule bodies.
506
- * @param string $css the whole stylesheet.
507
- * @return string
508
- */
509
- private function processRuleBodies($css)
510
- {
511
- $ret = '';
512
- $searchOffset = $substrOffset = 0;
513
-
514
- while( ($blockStartPos = strpos($css, '{', $searchOffset)) !== false ) {
515
- $blockEndPos = strpos($css, '}', $blockStartPos);
516
- $nextBlockStartPos = strpos($css, '{', $blockStartPos + 1);
517
- $ret .= substr($css, $substrOffset, $blockStartPos - $substrOffset);
518
-
519
- if( $nextBlockStartPos !== false && $nextBlockStartPos < $blockEndPos ) {
520
- $ret .= substr($css, $blockStartPos, $nextBlockStartPos - $blockStartPos);
521
- $searchOffset = $nextBlockStartPos;
522
- } else {
523
- $ruleBody = substr($css, $blockStartPos + 1, $blockEndPos - $blockStartPos - 1);
524
- $ruleBodyToken = $this->registerRuleBodyToken($this->processRuleBody($ruleBody));
525
- $ret .= '{' . $ruleBodyToken . '}';
526
- $searchOffset = $blockEndPos + 1;
527
- }
528
-
529
- $substrOffset = $searchOffset;
530
- }
531
-
532
- $ret .= substr($css, $substrOffset);
533
-
534
- return $ret;
535
- }
536
-
537
- /**
538
- * Compresses non-group rule bodies.
539
- * @param string $body The rule body without curly braces
540
- * @return string
541
- */
542
- private function processRuleBody($body)
543
- {
544
- $body = trim($body);
545
-
546
- // Remove spaces before the things that should not have spaces before them.
547
- $body = preg_replace('/ ([:=,)*\/;\n])/S', '$1', $body);
548
-
549
- // Remove the spaces after the things that should not have spaces after them.
550
- $body = preg_replace('/([:=,(*\/!;\n]) /S', '$1', $body);
551
-
552
- // Replace multiple semi-colons in a row by a single one
553
- $body = preg_replace('/;;+/S', ';', $body);
554
-
555
- // Remove semicolon before closing brace except when:
556
- // - The last property is prefixed with a `*` (lte IE7 hack) to avoid issues on Symbian S60 3.x browsers.
557
- if( !preg_match('/\*[a-z0-9-]+:[^;]+;$/Si', $body) ) {
558
- $body = rtrim($body, ';');
559
- }
560
-
561
- // Remove important comments inside a rule body (because they make no sense here).
562
- if( strpos($body, '/*') !== false ) {
563
- $body = preg_replace('/\n?\/\*[A-Z0-9_]+\*\/\n?/S', '', $body);
564
- }
565
-
566
- // Empty rule body? Exit :)
567
- if( empty($body) ) {
568
- return '';
569
- }
570
-
571
- // Shorten font-weight values
572
- $body = preg_replace(array('/(font-weight:)bold\b/Si', '/(font-weight:)normal\b/Si'), array(
573
- '${1}700',
574
- '${1}400'
575
- ), $body);
576
-
577
- // Shorten background property
578
- $body = preg_replace('/(background:)(?:none|transparent)( !|;|$)/Si', '${1}0 0$2', $body);
579
-
580
- // Shorten opacity IE filter
581
- $body = str_ireplace('progid:DXImageTransform.Microsoft.Alpha(Opacity=', 'alpha(opacity=', $body);
582
-
583
- // Shorten colors from rgb(51,102,153) to #336699, rgb(100%,0%,0%) to #ff0000 (sRGB color space)
584
- // Shorten colors from hsl(0, 100%, 50%) to #ff0000 (sRGB color space)
585
- // This makes it more likely that it'll get further compressed in the next step.
586
- $body = preg_replace_callback('/(rgb|hsl)\(([0-9,.% -]+)\)(.|$)/Si', array(
587
- $this,
588
- 'shortenHslAndRgbToHexCallback'
589
- ), $body);
590
-
591
- // Shorten colors from #AABBCC to #ABC or shorter color name:
592
- // - Look for hex colors which don't have a "=" in front of them (to avoid MSIE filters)
593
- $body = preg_replace_callback('/(?<!=)#([0-9a-f]{3,6})( |,|\)|;|$)/Si', array(
594
- $this,
595
- 'shortenHexColorsCallback'
596
- ), $body);
597
-
598
- // Shorten long named colors with a shorter HEX counterpart: white -> #fff.
599
- // Run at least 2 times to cover most cases
600
- $body = preg_replace_callback(array(
601
- $this->namedToHexColorsRegex,
602
- $this->namedToHexColorsRegex
603
- ), array($this, 'shortenNamedColorsCallback'), $body);
604
-
605
- // Replace positive sign from numbers before the leading space is removed.
606
- // +1.2em to 1.2em, +.8px to .8px, +2% to 2%
607
- $body = preg_replace('/([ :,(])\+(\.?\d+)/S', '$1$2', $body);
608
-
609
- // shorten ms to s
610
- $body = preg_replace_callback('/([ :,(])(-?)(\d{3,})ms/Si', function ($matches) {
611
- return $matches[1] . $matches[2] . ((int)$matches[3] / 1000) . 's';
612
- }, $body);
613
-
614
- // Remove leading zeros from integer and float numbers.
615
- // 000.6 to .6, -0.8 to -.8, 0050 to 50, -01.05 to -1.05
616
- $body = preg_replace('/([ :,(])(-?)0+([1-9]?\.?\d+)/S', '$1$2$3', $body);
617
-
618
- // Remove trailing zeros from float numbers.
619
- // -6.0100em to -6.01em, .0100 to .01, 1.200px to 1.2px
620
- $body = preg_replace('/([ :,(])(-?\d?\.\d+?)0+([^\d])/S', '$1$2$3', $body);
621
-
622
- // Remove trailing .0 -> -9.0 to -9
623
- $body = preg_replace('/([ :,(])(-?\d+)\.0([^\d])/S', '$1$2$3', $body);
624
-
625
- // Replace 0 length numbers with 0
626
- $body = preg_replace('/([ :,(])-?\.?0+([^\d])/S', '${1}0$2', $body);
627
-
628
- // Shorten zero values for safe properties only
629
- $body = preg_replace(array(
630
- $this->shortenOneZeroesRegex,
631
- $this->shortenTwoZeroesRegex,
632
- $this->shortenThreeZeroesRegex,
633
- $this->shortenFourZeroesRegex
634
- ), array(
635
- '$1$2:0',
636
- '$1$2:$3 0',
637
- '$1$2:$3 $4 0',
638
- '$1$2:$3 $4 $5 0'
639
- ), $body);
640
-
641
- // Replace 0 0 0; or 0 0 0 0; with 0 0 for background-position property.
642
- $body = preg_replace('/(background-position):0(?: 0){2,3}( !|;|$)/Si', '$1:0 0$2', $body);
643
-
644
- // Shorten suitable shorthand properties with repeated values
645
- $body = preg_replace(array(
646
- '/(margin|padding|border-(?:width|radius)):(' . $this->numRegex . ')(?: \2)+( !|;|$)/Si',
647
- '/(border-(?:style|color)):([#a-z0-9]+)(?: \2)+( !|;|$)/Si'
648
- ), '$1:$2$3', $body);
649
- $body = preg_replace(array(
650
- '/(margin|padding|border-(?:width|radius)):' . '(' . $this->numRegex . ') (' . $this->numRegex . ') \2 \3( !|;|$)/Si',
651
- '/(border-(?:style|color)):([#a-z0-9]+) ([#a-z0-9]+) \2 \3( !|;|$)/Si'
652
- ), '$1:$2 $3$4', $body);
653
- $body = preg_replace(array(
654
- '/(margin|padding|border-(?:width|radius)):' . '(' . $this->numRegex . ') (' . $this->numRegex . ') (' . $this->numRegex . ') \3( !|;|$)/Si',
655
- '/(border-(?:style|color)):([#a-z0-9]+) ([#a-z0-9]+) ([#a-z0-9]+) \3( !|;|$)/Si'
656
- ), '$1:$2 $3 $4$5', $body);
657
-
658
- // Lowercase some common functions that can be values
659
- $body = preg_replace_callback('/(?:attr|blur|brightness|circle|contrast|cubic-bezier|drop-shadow|ellipse|from|grayscale|' . 'hsla?|hue-rotate|inset|invert|local|minmax|opacity|perspective|polygon|rgba?|rect|repeat|saturate|sepia|' . 'steps|to|url|var|-webkit-gradient|' . '(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?(?:calc|(?:repeating-)?(?:linear|radial)-gradient))\(/Si', array(
660
- $this,
661
- 'strtolowerCallback'
662
- ), $body);
663
-
664
- // Lowercase all uppercase properties
665
- $body = preg_replace_callback('/(?:^|;)[A-Z-]+:/S', array($this, 'strtolowerCallback'), $body);
666
-
667
- return $body;
668
- }
669
-
670
- /**
671
- * Compresses At-rules and selectors.
672
- * @param string $css the whole stylesheet with rule bodies tokenized.
673
- * @return string
674
- */
675
- private function processAtRulesAndSelectors($css)
676
- {
677
- $charset = '';
678
- $imports = '';
679
- $namespaces = '';
680
-
681
- // Remove spaces before the things that should not have spaces before them.
682
- $css = preg_replace('/ ([@{};>+)\]~=,\/\n])/S', '$1', $css);
683
-
684
- // Remove the spaces after the things that should not have spaces after them.
685
- $css = preg_replace('/([{}:;>+(\[~=,\/\n]) /S', '$1', $css);
686
-
687
- // Shorten shortable double colon (CSS3) pseudo-elements to single colon (CSS2)
688
- $css = preg_replace('/::(before|after|first-(?:line|letter))(\{|,)/Si', ':$1$2', $css);
689
-
690
- // Retain space for special IE6 cases
691
- $css = preg_replace_callback('/:first-(line|letter)(\{|,)/Si', function ($matches) {
692
- return ':first-' . strtolower($matches[1]) . ' ' . $matches[2];
693
- }, $css);
694
-
695
- // Find a fraction that may used in some @media queries such as: (min-aspect-ratio: 1/1)
696
- // Add token to add the "/" back in later
697
- $css = preg_replace('/\(([a-z-]+):([0-9]+)\/([0-9]+)\)/Si', '($1:$2' . self::QUERY_FRACTION . '$3)', $css);
698
-
699
- // Remove empty rule blocks up to 2 levels deep.
700
- $css = preg_replace(array_fill(0, 2, '/(\{)[^{};\/\n]+\{\}/S'), '$1', $css);
701
- $css = preg_replace('/[^{};\/\n]+\{\}/S', '', $css);
702
-
703
- // Two important comments next to each other? Remove extra newline.
704
- if( $this->keepImportantComments ) {
705
- $css = str_replace("\n\n", "\n", $css);
706
- }
707
-
708
- // Restore fraction
709
- $css = str_replace(self::QUERY_FRACTION, '/', $css);
710
-
711
- // Lowercase some popular @directives
712
- $css = preg_replace_callback('/(?<!\\\\)@(?:charset|document|font-face|import|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?keyframes|media|' . 'namespace|page|supports|viewport)/Si', array(
713
- $this,
714
- 'strtolowerCallback'
715
- ), $css);
716
-
717
- // Lowercase some popular media types
718
- $css = preg_replace_callback('/[ ,](?:all|aural|braille|handheld|print|projection|screen|tty|tv|embossed|speech)[ ,;{]/Si', array(
719
- $this,
720
- 'strtolowerCallback'
721
- ), $css);
722
-
723
- // Lowercase some common pseudo-classes & pseudo-elements
724
- $css = preg_replace_callback('/(?<!\\\\):(?:active|after|before|checked|default|disabled|empty|enabled|first-(?:child|of-type)|' . 'focus(?:-within)?|hover|indeterminate|in-range|invalid|lang\(|last-(?:child|of-type)|left|link|not\(|' . 'nth-(?:child|of-type)\(|nth-last-(?:child|of-type)\(|only-(?:child|of-type)|optional|out-of-range|' . 'read-(?:only|write)|required|right|root|:selection|target|valid|visited)/Si', array(
725
- $this,
726
- 'strtolowerCallback'
727
- ), $css);
728
-
729
- // @charset handling
730
- if( preg_match($this->charsetRegex, $css, $matches) ) {
731
- // Keep the first @charset at-rule found
732
- $charset = $matches[0];
733
- // Delete all @charset at-rules
734
- $css = preg_replace($this->charsetRegex, '', $css);
735
- }
736
-
737
- // @import handling
738
- $css = preg_replace_callback($this->importRegex, function ($matches) use (&$imports) {
739
- // Keep all @import at-rules found for later
740
- $imports .= $matches[0];
741
-
742
- // Delete all @import at-rules
743
- return '';
744
- }, $css);
745
-
746
- // @namespace handling
747
- $css = preg_replace_callback($this->namespaceRegex, function ($matches) use (&$namespaces) {
748
- // Keep all @namespace at-rules found for later
749
- $namespaces .= $matches[0];
750
-
751
- // Delete all @namespace at-rules
752
- return '';
753
- }, $css);
754
-
755
- // Order critical at-rules:
756
- // 1. @charset first
757
- // 2. @imports below @charset
758
- // 3. @namespaces below @imports
759
- $css = $charset . $imports . $namespaces . $css;
760
-
761
- return $css;
762
- }
763
-
764
- /**
765
- * Splits long lines after a specific column.
766
- *
767
- * Some source control tools don't like it when files containing lines longer
768
- * than, say 8000 characters, are checked in. The linebreak option is used in
769
- * that case to split long lines after a specific column.
770
- *
771
- * @param string $css the whole stylesheet.
772
- * @return string
773
- */
774
- private function processLongLineSplitting($css)
775
- {
776
- if( $this->linebreakPosition > 0 ) {
777
- $l = strlen($css);
778
- $offset = $this->linebreakPosition;
779
- while( preg_match('/(?<!\\\\)\}(?!\n)/S', $css, $matches, PREG_OFFSET_CAPTURE, $offset) ) {
780
- $matchIndex = $matches[0][1];
781
- $css = substr_replace($css, "\n", $matchIndex + 1, 0);
782
- $offset = $matchIndex + 2 + $this->linebreakPosition;
783
- $l += 1;
784
- if( $offset > $l ) {
785
- break;
786
- }
787
- }
788
- }
789
-
790
- return $css;
791
- }
792
-
793
- /**
794
- * Converts hsl() & rgb() colors to HEX format.
795
- * @param $matches
796
- * @return string
797
- */
798
- private function shortenHslAndRgbToHexCallback($matches)
799
- {
800
- $type = $matches[1];
801
- $values = explode(',', $matches[2]);
802
- $terminator = $matches[3];
803
-
804
- if( $type === 'hsl' ) {
805
- $values = Utils::hslToRgb($values);
806
- }
807
-
808
- $hexColors = Utils::rgbToHex($values);
809
-
810
- // Restore space after rgb() or hsl() function in some cases such as:
811
- // background-image: linear-gradient(to bottom, rgb(210,180,140) 10%, rgb(255,0,0) 90%);
812
- if( !empty($terminator) && !preg_match('/[ ,);]/S', $terminator) ) {
813
- $terminator = ' ' . $terminator;
814
- }
815
-
816
- return '#' . implode('', $hexColors) . $terminator;
817
- }
818
-
819
- /**
820
- * Compresses HEX color values of the form #AABBCC to #ABC or short color name.
821
- * @param $matches
822
- * @return string
823
- */
824
- private function shortenHexColorsCallback($matches)
825
- {
826
- $hex = $matches[1];
827
-
828
- // Shorten suitable 6 chars HEX colors
829
- if( strlen($hex) === 6 && preg_match('/^([0-9a-f])\1([0-9a-f])\2([0-9a-f])\3$/Si', $hex, $m) ) {
830
- $hex = $m[1] . $m[2] . $m[3];
831
- }
832
-
833
- // Lowercase
834
- $hex = '#' . strtolower($hex);
835
-
836
- // Replace Hex colors with shorter color names
837
- $color = array_key_exists($hex, $this->hexToNamedColorsMap)
838
- ? $this->hexToNamedColorsMap[$hex]
839
- : $hex;
840
-
841
- return $color . $matches[2];
842
- }
843
-
844
- /**
845
- * Shortens all named colors with a shorter HEX counterpart for a set of safe properties
846
- * e.g. white -> #fff
847
- * @param array $matches
848
- * @return string
849
- */
850
- private function shortenNamedColorsCallback($matches)
851
- {
852
- return $matches[1] . $this->namedToHexColorsMap[strtolower($matches[2])] . $matches[3];
853
- }
854
-
855
- /**
856
- * Makes a string lowercase
857
- * @param array $matches
858
- * @return string
859
- */
860
- private function strtolowerCallback($matches)
861
- {
862
- return strtolower($matches[0]);
863
- }
864
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
 
3
+ /*!
4
+ * CssMin
5
+ * Author: Tubal Martin - http://tubalmartin.me/
6
+ * Repo: https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port
7
+ *
8
+ * This is a PHP port of the CSS minification tool distributed with YUICompressor,
9
+ * itself a port of the cssmin utility by Isaac Schlueter - http://foohack.com/
10
+ * Permission is hereby granted to use the PHP version under the same
11
+ * conditions as the YUICompressor.
12
+ */
13
+
14
+ /*!
15
+ * YUI Compressor
16
+ * http://developer.yahoo.com/yui/compressor/
17
+ * Author: Julien Lecomte - http://www.julienlecomte.net/
18
+ * Copyright (c) 2013 Yahoo! Inc. All rights reserved.
19
+ * The copyrights embodied in the content of this file are licensed
20
+ * by Yahoo! Inc. under the BSD (revised) open source license.
21
+ */
22
+
23
+ namespace WMAC\tubalmartin\CssMin;
24
+
25
+ class Minifier
26
+ {
27
+ const QUERY_FRACTION = '_CSSMIN_QF_';
28
+ const COMMENT_TOKEN = '_CSSMIN_CMT_%d_';
29
+ const COMMENT_TOKEN_START = '_CSSMIN_CMT_';
30
+ const RULE_BODY_TOKEN = '_CSSMIN_RBT_%d_';
31
+ const PRESERVED_TOKEN = '_CSSMIN_PTK_%d_';
32
+ const UNQUOTED_FONT_TOKEN = '_CSSMIN_UFT_%d_';
33
+
34
+ // Token lists
35
+ private $comments = array();
36
+ private $ruleBodies = array();
37
+ private $preservedTokens = array();
38
+ private $unquotedFontTokens = array();
39
+
40
+ // Output options
41
+ private $keepImportantComments = true;
42
+ private $keepSourceMapComment = false;
43
+ private $linebreakPosition = 0;
44
+
45
+ // PHP ini limits
46
+ private $raisePhpLimits;
47
+ private $memoryLimit;
48
+ private $maxExecutionTime = 60; // 1 min
49
+ private $pcreBacktrackLimit;
50
+ private $pcreRecursionLimit;
51
+
52
+ // Color maps
53
+ private $hexToNamedColorsMap;
54
+ private $namedToHexColorsMap;
55
+
56
+ // Regexes
57
+ private $numRegex;
58
+ private $charsetRegex = '/@charset [^;]+;/Si';
59
+ private $importRegex = '/@import [^;]+;/Si';
60
+ private $namespaceRegex = '/@namespace [^;]+;/Si';
61
+ private $namedToHexColorsRegex;
62
+ private $shortenOneZeroesRegex;
63
+ private $shortenTwoZeroesRegex;
64
+ private $shortenThreeZeroesRegex;
65
+ private $shortenFourZeroesRegex;
66
+ private $unitsGroupRegex = '(?:ch|cm|em|ex|gd|in|mm|px|pt|pc|q|rem|vh|vmax|vmin|vw|%)';
67
+ private $unquotedFontsRegex = '/(font-family:|font:)([^\'"]+?)[^};]*/Si';
68
+
69
+ /**
70
+ * @param bool|int $raisePhpLimits If true, PHP settings will be raised if needed
71
+ */
72
+ public function __construct($raisePhpLimits = true)
73
+ {
74
+ $this->raisePhpLimits = (bool) $raisePhpLimits;
75
+ $this->memoryLimit = 128 * 1048576; // 128MB in bytes
76
+ $this->pcreBacktrackLimit = 1000 * 1000;
77
+ $this->pcreRecursionLimit = 500 * 1000;
78
+ $this->hexToNamedColorsMap = Colors::getHexToNamedMap();
79
+ $this->namedToHexColorsMap = Colors::getNamedToHexMap();
80
+ $this->namedToHexColorsRegex = sprintf(
81
+ '/([:,( ])(%s)( |,|\)|;|$)/Si',
82
+ implode('|', array_keys($this->namedToHexColorsMap))
83
+ );
84
+ $this->numRegex = sprintf('-?\d*\.?\d+%s?', $this->unitsGroupRegex);
85
+ $this->setShortenZeroValuesRegexes();
86
+ }
87
+
88
+ /**
89
+ * Parses & minifies the given input CSS string
90
+ * @param string $css
91
+ * @return string
92
+ */
93
+ public function run($css = '')
94
+ {
95
+ if (empty($css) || !is_string($css)) {
96
+ return '';
97
+ }
98
+
99
+ $this->resetRunProperties();
100
+
101
+ if ($this->raisePhpLimits) {
102
+ $this->doRaisePhpLimits();
103
+ }
104
+
105
+ return $this->minify($css);
106
+ }
107
+
108
+ /**
109
+ * Sets whether to keep or remove sourcemap special comment.
110
+ * Sourcemap comments are removed by default.
111
+ * @param bool $keepSourceMapComment
112
+ */
113
+ public function keepSourceMapComment($keepSourceMapComment = true)
114
+ {
115
+ $this->keepSourceMapComment = (bool) $keepSourceMapComment;
116
+ }
117
+
118
+ /**
119
+ * Sets whether to keep or remove important comments.
120
+ * Important comments outside of a declaration block are kept by default.
121
+ * @param bool $removeImportantComments
122
+ */
123
+ public function removeImportantComments($removeImportantComments = true)
124
+ {
125
+ $this->keepImportantComments = !(bool) $removeImportantComments;
126
+ }
127
+
128
+ /**
129
+ * Sets the approximate column after which long lines will be splitted in the output
130
+ * with a linebreak.
131
+ * @param int $position
132
+ */
133
+ public function setLineBreakPosition($position)
134
+ {
135
+ $this->linebreakPosition = (int) $position;
136
+ }
137
+
138
+ /**
139
+ * Sets the memory limit for this script
140
+ * @param int|string $limit
141
+ */
142
+ public function setMemoryLimit($limit)
143
+ {
144
+ $this->memoryLimit = Utils::normalizeInt($limit);
145
+ }
146
+
147
+ /**
148
+ * Sets the maximum execution time for this script
149
+ * @param int|string $seconds
150
+ */
151
+ public function setMaxExecutionTime($seconds)
152
+ {
153
+ $this->maxExecutionTime = (int) $seconds;
154
+ }
155
+
156
+ /**
157
+ * Sets the PCRE backtrack limit for this script
158
+ * @param int $limit
159
+ */
160
+ public function setPcreBacktrackLimit($limit)
161
+ {
162
+ $this->pcreBacktrackLimit = (int) $limit;
163
+ }
164
+
165
+ /**
166
+ * Sets the PCRE recursion limit for this script
167
+ * @param int $limit
168
+ */
169
+ public function setPcreRecursionLimit($limit)
170
+ {
171
+ $this->pcreRecursionLimit = (int) $limit;
172
+ }
173
+
174
+ /**
175
+ * Builds regular expressions needed for shortening zero values
176
+ */
177
+ private function setShortenZeroValuesRegexes()
178
+ {
179
+ $zeroRegex = '0'. $this->unitsGroupRegex;
180
+ $numOrPosRegex = '('. $this->numRegex .'|top|left|bottom|right|center) ';
181
+ $oneZeroSafeProperties = array(
182
+ '(?:line-)?height',
183
+ '(?:(?:min|max)-)?width',
184
+ 'top',
185
+ 'left',
186
+ 'background-position',
187
+ 'bottom',
188
+ 'right',
189
+ 'border(?:-(?:top|left|bottom|right))?(?:-width)?',
190
+ 'border-(?:(?:top|bottom)-(?:left|right)-)?radius',
191
+ 'column-(?:gap|width)',
192
+ 'margin(?:-(?:top|left|bottom|right))?',
193
+ 'outline-width',
194
+ 'padding(?:-(?:top|left|bottom|right))?'
195
+ );
196
+
197
+ // First zero regex
198
+ $regex = '/(^|;)('. implode('|', $oneZeroSafeProperties) .'):%s/Si';
199
+ $this->shortenOneZeroesRegex = sprintf($regex, $zeroRegex);
200
+
201
+ // Multiple zeroes regexes
202
+ $regex = '/(^|;)(margin|padding|border-(?:width|radius)|background-position):%s/Si';
203
+ $this->shortenTwoZeroesRegex = sprintf($regex, $numOrPosRegex . $zeroRegex);
204
+ $this->shortenThreeZeroesRegex = sprintf($regex, $numOrPosRegex . $numOrPosRegex . $zeroRegex);
205
+ $this->shortenFourZeroesRegex = sprintf($regex, $numOrPosRegex . $numOrPosRegex . $numOrPosRegex . $zeroRegex);
206
+ }
207
+
208
+ /**
209
+ * Resets properties whose value may change between runs
210
+ */
211
+ private function resetRunProperties()
212
+ {
213
+ $this->comments = array();
214
+ $this->ruleBodies = array();
215
+ $this->preservedTokens = array();
216
+ }
217
+
218
+ /**
219
+ * Tries to configure PHP to use at least the suggested minimum settings
220
+ * @return void
221
+ */
222
+ private function doRaisePhpLimits()
223
+ {
224
+ $phpLimits = array(
225
+ 'memory_limit' => $this->memoryLimit,
226
+ 'max_execution_time' => $this->maxExecutionTime,
227
+ 'pcre.backtrack_limit' => $this->pcreBacktrackLimit,
228
+ 'pcre.recursion_limit' => $this->pcreRecursionLimit
229
+ );
230
+
231
+ // If current settings are higher respect them.
232
+ foreach ($phpLimits as $name => $suggested) {
233
+ $current = Utils::normalizeInt(ini_get($name));
234
+
235
+ if ($current >= $suggested) {
236
+ continue;
237
+ }
238
+
239
+ // memoryLimit exception: allow -1 for "no memory limit".
240
+ if ($name === 'memory_limit' && $current === -1) {
241
+ continue;
242
+ }
243
+
244
+ // maxExecutionTime exception: allow 0 for "no memory limit".
245
+ if ($name === 'max_execution_time' && $current === 0) {
246
+ continue;
247
+ }
248
+
249
+ ini_set($name, $suggested);
250
+ }
251
+ }
252
+
253
+ /**
254
+ * Registers a preserved token
255
+ * @param string $token
256
+ * @return string The token ID string
257
+ */
258
+ private function registerPreservedToken($token)
259
+ {
260
+ $tokenId = sprintf(self::PRESERVED_TOKEN, count($this->preservedTokens));
261
+ $this->preservedTokens[$tokenId] = $token;
262
+ return $tokenId;
263
+ }
264
+
265
+ /**
266
+ * Registers a candidate comment token
267
+ * @param string $comment
268
+ * @return string The comment token ID string
269
+ */
270
+ private function registerCommentToken($comment)
271
+ {
272
+ $tokenId = sprintf(self::COMMENT_TOKEN, count($this->comments));
273
+ $this->comments[$tokenId] = $comment;
274
+ return $tokenId;
275
+ }
276
+
277
+ /**
278
+ * Registers a rule body token
279
+ * @param string $body the minified rule body
280
+ * @return string The rule body token ID string
281
+ */
282
+ private function registerRuleBodyToken($body)
283
+ {
284
+ if (empty($body)) {
285
+ return '';
286
+ }
287
+
288
+ $tokenId = sprintf(self::RULE_BODY_TOKEN, count($this->ruleBodies));
289
+ $this->ruleBodies[$tokenId] = $body;
290
+ return $tokenId;
291
+ }
292
+
293
+ private function registerUnquotedFontToken($body)
294
+ {
295
+ if (empty($body)) {
296
+ return '';
297
+ }
298
+
299
+ $tokenId = sprintf(self::UNQUOTED_FONT_TOKEN, count($this->unquotedFontTokens));
300
+ $this->unquotedFontTokens[$tokenId] = $body;
301
+ return $tokenId;
302
+ }
303
+
304
+ /**
305
+ * Parses & minifies the given input CSS string
306
+ * @param string $css
307
+ * @return string
308
+ */
309
+ private function minify($css)
310
+ {
311
+ // Process data urls
312
+ $css = $this->processDataUrls($css);
313
+
314
+ // Process comments
315
+ $css = preg_replace_callback(
316
+ '/(?<!\\\\)\/\*(.*?)\*(?<!\\\\)\//Ss',
317
+ array($this, 'processCommentsCallback'),
318
+ $css
319
+ );
320
+
321
+ // IE7: Process Microsoft matrix filters (whitespaces between Matrix parameters). Can contain strings inside.
322
+ $css = preg_replace_callback(
323
+ '/filter:\s*progid:DXImageTransform\.Microsoft\.Matrix\(([^)]+)\)/Ss',
324
+ array($this, 'processOldIeSpecificMatrixDefinitionCallback'),
325
+ $css
326
+ );
327
+
328
+ // Process quoted unquotable attribute selectors to unquote them. Covers most common cases.
329
+ // Likelyhood of a quoted attribute selector being a substring in a string: Very very low.
330
+ $css = preg_replace(
331
+ '/\[\s*([a-z][a-z-]+)\s*([\*\|\^\$~]?=)\s*[\'"](-?[a-z_][a-z0-9-_]+)[\'"]\s*\]/Ssi',
332
+ '[$1$2$3]',
333
+ $css
334
+ );
335
+
336
+ // Process strings so their content doesn't get accidentally minified
337
+ $css = preg_replace_callback(
338
+ '/(?:"(?:[^\\\\"]|\\\\.|\\\\)*")|'."(?:'(?:[^\\\\']|\\\\.|\\\\)*')/S",
339
+ array($this, 'processStringsCallback'),
340
+ $css
341
+ );
342
+
343
+ // Normalize all whitespace strings to single spaces. Easier to work with that way.
344
+ $css = preg_replace('/\s+/S', ' ', $css);
345
+
346
+ // Process import At-rules with unquoted URLs so URI reserved characters such as a semicolon may be used safely.
347
+ $css = preg_replace_callback(
348
+ '/@import url\(([^\'"]+?)\)( |;)/Si',
349
+ array($this, 'processImportUnquotedUrlAtRulesCallback'),
350
+ $css
351
+ );
352
+
353
+ // Process comments
354
+ $css = $this->processComments($css);
355
+
356
+ // Process rule bodies
357
+ $css = $this->processRuleBodies($css);
358
+
359
+ // Process at-rules and selectors
360
+ $css = $this->processAtRulesAndSelectors($css);
361
+
362
+ // Restore preserved rule bodies before splitting
363
+ $css = strtr($css, $this->ruleBodies);
364
+
365
+ // Split long lines in output if required
366
+ $css = $this->processLongLineSplitting($css);
367
+
368
+ // Restore preserved comments and strings
369
+ $css = strtr($css, $this->preservedTokens);
370
+
371
+ return trim($css);
372
+ }
373
+
374
+ /**
375
+ * Searches & replaces all data urls with tokens before we start compressing,
376
+ * to avoid performance issues running some of the subsequent regexes against large string chunks.
377
+ * @param string $css
378
+ * @return string
379
+ */
380
+ private function processDataUrls($css)
381
+ {
382
+ $ret = '';
383
+ $searchOffset = $substrOffset = 0;
384
+
385
+ // Since we need to account for non-base64 data urls, we need to handle
386
+ // ' and ) being part of the data string.
387
+ while (preg_match('/url\(\s*(["\']?)data:/Si', $css, $m, PREG_OFFSET_CAPTURE, $searchOffset)) {
388
+ $matchStartIndex = $m[0][1];
389
+ $dataStartIndex = $matchStartIndex + 4; // url( length
390
+ $searchOffset = $matchStartIndex + strlen($m[0][0]);
391
+ $terminator = $m[1][0]; // ', " or empty (not quoted)
392
+ $terminatorRegex = '/(?<!\\\\)'. (strlen($terminator) === 0 ? '' : $terminator.'\s*') .'(\))/S';
393
+
394
+ $ret .= substr($css, $substrOffset, $matchStartIndex - $substrOffset);
395
+
396
+ // Terminator found
397
+ if (preg_match($terminatorRegex, $css, $matches, PREG_OFFSET_CAPTURE, $searchOffset)) {
398
+ $matchEndIndex = $matches[1][1];
399
+ $searchOffset = $matchEndIndex + 1;
400
+ $token = substr($css, $dataStartIndex, $matchEndIndex - $dataStartIndex);
401
+
402
+ // Remove all spaces only for base64 encoded URLs.
403
+ if (stripos($token, 'base64,') !== false) {
404
+ $token = preg_replace('/\s+/S', '', $token);
405
+ }
406
+
407
+ $ret .= 'url('. $this->registerPreservedToken(trim($token)) .')';
408
+ // No end terminator found, re-add the whole match. Should we throw/warn here?
409
+ } else {
410
+ $ret .= substr($css, $matchStartIndex, $searchOffset - $matchStartIndex);
411
+ }
412
+
413
+ $substrOffset = $searchOffset;
414
+ }
415
+
416
+ $ret .= substr($css, $substrOffset);
417
+
418
+ return $ret;
419
+ }
420
+
421
+ /**
422
+ * Registers all comments found as candidates to be preserved.
423
+ * @param array $matches
424
+ * @return string
425
+ */
426
+ private function processCommentsCallback($matches)
427
+ {
428
+ return '/*'. $this->registerCommentToken($matches[1]) .'*/';
429
+ }
430
+
431
+ /**
432
+ * Preserves old IE Matrix string definition
433
+ * @param array $matches
434
+ * @return string
435
+ */
436
+ private function processOldIeSpecificMatrixDefinitionCallback($matches)
437
+ {
438
+ return 'filter:progid:DXImageTransform.Microsoft.Matrix('. $this->registerPreservedToken($matches[1]) .')';
439
+ }
440
+
441
+ /**
442
+ * Preserves strings found
443
+ * @param array $matches
444
+ * @return string
445
+ */
446
+ private function processStringsCallback($matches)
447
+ {
448
+ $match = $matches[0];
449
+ $quote = substr($match, 0, 1);
450
+ $match = substr($match, 1, -1);
451
+
452
+ // maybe the string contains a comment-like substring?
453
+ // one, maybe more? put'em back then
454
+ if (strpos($match, self::COMMENT_TOKEN_START) !== false) {
455
+ $match = strtr($match, $this->comments);
456
+ }
457
+
458
+ // minify alpha opacity in filter strings
459
+ $match = str_ireplace('progid:DXImageTransform.Microsoft.Alpha(Opacity=', 'alpha(opacity=', $match);
460
+
461
+ return $quote . $this->registerPreservedToken($match) . $quote;
462
+ }
463
+
464
+ /**
465
+ * Searches & replaces all import at-rule unquoted urls with tokens so URI reserved characters such as a semicolon
466
+ * may be used safely in a URL.
467
+ * @param array $matches
468
+ * @return string
469
+ */
470
+ private function processImportUnquotedUrlAtRulesCallback($matches)
471
+ {
472
+ return '@import url('. $this->registerPreservedToken($matches[1]) .')'. $matches[2];
473
+ }
474
+
475
+ /**
476
+ * Preserves or removes comments found.
477
+ * @param string $css
478
+ * @return string
479
+ */
480
+ private function processComments($css)
481
+ {
482
+ foreach ($this->comments as $commentId => $comment) {
483
+ $commentIdString = '/*'. $commentId .'*/';
484
+
485
+ // ! in the first position of the comment means preserve
486
+ // so push to the preserved tokens keeping the !
487
+ if ($this->keepImportantComments && strpos($comment, '!') === 0) {
488
+ $preservedTokenId = $this->registerPreservedToken($comment);
489
+ // Put new lines before and after /*! important comments
490
+ $css = str_replace($commentIdString, "\n/*$preservedTokenId*/\n", $css);
491
+ continue;
492
+ }
493
+
494
+ // # sourceMappingURL= in the first position of the comment means sourcemap
495
+ // so push to the preserved tokens if {$this->keepSourceMapComment} is truthy.
496
+ if ($this->keepSourceMapComment && strpos($comment, '# sourceMappingURL=') === 0) {
497
+ $preservedTokenId = $this->registerPreservedToken($comment);
498
+ // Add new line before the sourcemap comment
499
+ $css = str_replace($commentIdString, "\n/*$preservedTokenId*/", $css);
500
+ continue;
501
+ }
502
+
503
+ // Keep empty comments after child selectors (IE7 hack)
504
+ // e.g. html >/**/ body
505
+ if (strlen($comment) === 0 && strpos($css, '>/*'.$commentId) !== false) {
506
+ $css = str_replace($commentId, $this->registerPreservedToken(''), $css);
507
+ continue;
508
+ }
509
+
510
+ // in all other cases kill the comment
511
+ $css = str_replace($commentIdString, '', $css);
512
+ }
513
+
514
+ // Normalize whitespace again
515
+ $css = preg_replace('/ +/S', ' ', $css);
516
+
517
+ return $css;
518
+ }
519
+
520
+ /**
521
+ * Finds, minifies & preserves all rule bodies.
522
+ * @param string $css the whole stylesheet.
523
+ * @return string
524
+ */
525
+ private function processRuleBodies($css)
526
+ {
527
+ $ret = '';
528
+ $searchOffset = $substrOffset = 0;
529
+
530
+ while (($blockStartPos = strpos($css, '{', $searchOffset)) !== false) {
531
+ $blockEndPos = strpos($css, '}', $blockStartPos);
532
+ // When ending curly brace is missing, let's
533
+ // behave like there was one at the end of the block...
534
+ if ( false === $blockEndPos ) {
535
+ $blockEndPos = strlen($css) - 1;
536
+ }
537
+ $nextBlockStartPos = strpos($css, '{', $blockStartPos + 1);
538
+ $ret .= substr($css, $substrOffset, $blockStartPos - $substrOffset);
539
+
540
+ if ($nextBlockStartPos !== false && $nextBlockStartPos < $blockEndPos) {
541
+ $ret .= substr($css, $blockStartPos, $nextBlockStartPos - $blockStartPos);
542
+ $searchOffset = $nextBlockStartPos;
543
+ } else {
544
+ $ruleBody = substr($css, $blockStartPos + 1, $blockEndPos - $blockStartPos - 1);
545
+ $ruleBodyToken = $this->registerRuleBodyToken($this->processRuleBody($ruleBody));
546
+ $ret .= '{'. $ruleBodyToken .'}';
547
+ $searchOffset = $blockEndPos + 1;
548
+ }
549
+
550
+ $substrOffset = $searchOffset;
551
+ }
552
+
553
+ $ret .= substr($css, $substrOffset);
554
+
555
+ return $ret;
556
+ }
557
+
558
+ /**
559
+ * Compresses non-group rule bodies.
560
+ * @param string $body The rule body without curly braces
561
+ * @return string
562
+ */
563
+ private function processRuleBody($body)
564
+ {
565
+ $body = trim($body);
566
+
567
+ // Remove spaces before the things that should not have spaces before them.
568
+ $body = preg_replace('/ ([:=,)*\/;\n])/S', '$1', $body);
569
+
570
+ // Remove the spaces after the things that should not have spaces after them.
571
+ $body = preg_replace('/([:=,(*\/!;\n]) /S', '$1', $body);
572
+
573
+ // Replace multiple semi-colons in a row by a single one
574
+ $body = preg_replace('/;;+/S', ';', $body);
575
+
576
+ // Remove semicolon before closing brace except when:
577
+ // - The last property is prefixed with a `*` (lte IE7 hack) to avoid issues on Symbian S60 3.x browsers.
578
+ if (!preg_match('/\*[a-z0-9-]+:[^;]+;$/Si', $body)) {
579
+ $body = rtrim($body, ';');
580
+ }
581
+
582
+ // Remove important comments inside a rule body (because they make no sense here).
583
+ if (strpos($body, '/*') !== false) {
584
+ $body = preg_replace('/\n?\/\*[A-Z0-9_]+\*\/\n?/S', '', $body);
585
+ }
586
+
587
+ // Empty rule body? Exit :)
588
+ if (empty($body)) {
589
+ return '';
590
+ }
591
+
592
+ // Shorten font-weight values
593
+ $body = preg_replace(
594
+ array('/(font-weight:)bold\b/Si', '/(font-weight:)normal\b/Si'),
595
+ array('${1}700', '${1}400'),
596
+ $body
597
+ );
598
+
599
+ // Shorten background property
600
+ $body = preg_replace('/(background:)(?:none|transparent)( !|;|$)/Si', '${1}0 0$2', $body);
601
+
602
+ // Shorten opacity IE filter
603
+ $body = str_ireplace('progid:DXImageTransform.Microsoft.Alpha(Opacity=', 'alpha(opacity=', $body);
604
+
605
+ // Shorten colors from rgb(51,102,153) to #336699, rgb(100%,0%,0%) to #ff0000 (sRGB color space)
606
+ // Shorten colors from hsl(0, 100%, 50%) to #ff0000 (sRGB color space)
607
+ // This makes it more likely that it'll get further compressed in the next step.
608
+ $body = preg_replace_callback(
609
+ '/(rgb|hsl)\(([0-9,.% -]+)\)(.|$)/Si',
610
+ array($this, 'shortenHslAndRgbToHexCallback'),
611
+ $body
612
+ );
613
+
614
+ // Shorten colors from #AABBCC to #ABC or shorter color name:
615
+ // - Look for hex colors which don't have a "=" in front of them (to avoid MSIE filters)
616
+ $body = preg_replace_callback(
617
+ '/(?<!=)#([0-9a-f]{3,6})( |,|\)|;|$)/Si',
618
+ array($this, 'shortenHexColorsCallback'),
619
+ $body
620
+ );
621
+
622
+ // Tokenize unquoted font names in order to hide them from
623
+ // color name replacements.
624
+ $body = preg_replace_callback(
625
+ $this->unquotedFontsRegex,
626
+ array($this, 'preserveUnquotedFontTokens'),
627
+ $body
628
+ );
629
+
630
+ // Shorten long named colors with a shorter HEX counterpart: white -> #fff.
631
+ // Run at least 2 times to cover most cases
632
+ $body = preg_replace_callback(
633
+ array($this->namedToHexColorsRegex, $this->namedToHexColorsRegex),
634
+ array($this, 'shortenNamedColorsCallback'),
635
+ $body
636
+ );
637
+
638
+ // Restore unquoted font tokens now after colors have been changed.
639
+ $body = $this->restoreUnquotedFontTokens($body);
640
+
641
+ // Replace positive sign from numbers before the leading space is removed.
642
+ // +1.2em to 1.2em, +.8px to .8px, +2% to 2%
643
+ $body = preg_replace('/([ :,(])\+(\.?\d+)/S', '$1$2', $body);
644
+
645
+ // shorten ms to s
646
+ $body = preg_replace_callback('/([ :,(])(-?)(\d{3,})ms/Si', function ($matches) {
647
+ return $matches[1] . $matches[2] . ((int) $matches[3] / 1000) .'s';
648
+ }, $body);
649
+
650
+ // Remove leading zeros from integer and float numbers.
651
+ // 000.6 to .6, -0.8 to -.8, 0050 to 50, -01.05 to -1.05
652
+ $body = preg_replace('/([ :,(])(-?)0+([1-9]?\.?\d+)/S', '$1$2$3', $body);
653
+
654
+ // Remove trailing zeros from float numbers.
655
+ // -6.0100em to -6.01em, .0100 to .01, 1.200px to 1.2px
656
+ $body = preg_replace('/([ :,(])(-?\d?\.\d+?)0+([^\d])/S', '$1$2$3', $body);
657
+
658
+ // Remove trailing .0 -> -9.0 to -9
659
+ $body = preg_replace('/([ :,(])(-?\d+)\.0([^\d])/S', '$1$2$3', $body);
660
+
661
+ // Replace 0 length numbers with 0
662
+ $body = preg_replace('/([ :,(])-?\.?0+([^\d])/S', '${1}0$2', $body);
663
+
664
+ // Shorten zero values for safe properties only
665
+ $body = preg_replace(
666
+ array(
667
+ $this->shortenOneZeroesRegex,
668
+ $this->shortenTwoZeroesRegex,
669
+ $this->shortenThreeZeroesRegex,
670
+ $this->shortenFourZeroesRegex
671
+ ),
672
+ array(
673
+ '$1$2:0',
674
+ '$1$2:$3 0',
675
+ '$1$2:$3 $4 0',
676
+ '$1$2:$3 $4 $5 0'
677
+ ),
678
+ $body
679
+ );
680
+
681
+ // Replace 0 0 0; or 0 0 0 0; with 0 0 for background-position property.
682
+ $body = preg_replace('/(background-position):0(?: 0){2,3}( !|;|$)/Si', '$1:0 0$2', $body);
683
+
684
+ // Shorten suitable shorthand properties with repeated values
685
+ $body = preg_replace(
686
+ array(
687
+ '/(margin|padding|border-(?:width|radius)):('.$this->numRegex.')(?: \2)+( !|;|$)/Si',
688
+ '/(border-(?:style|color)):([#a-z0-9]+)(?: \2)+( !|;|$)/Si'
689
+ ),
690
+ '$1:$2$3',
691
+ $body
692
+ );
693
+ $body = preg_replace(
694
+ array(
695
+ '/(margin|padding|border-(?:width|radius)):'.
696
+ '('.$this->numRegex.') ('.$this->numRegex.') \2 \3( !|;|$)/Si',
697
+ '/(border-(?:style|color)):([#a-z0-9]+) ([#a-z0-9]+) \2 \3( !|;|$)/Si'
698
+ ),
699
+ '$1:$2 $3$4',
700
+ $body
701
+ );
702
+ $body = preg_replace(
703
+ array(
704
+ '/(margin|padding|border-(?:width|radius)):'.
705
+ '('.$this->numRegex.') ('.$this->numRegex.') ('.$this->numRegex.') \3( !|;|$)/Si',
706
+ '/(border-(?:style|color)):([#a-z0-9]+) ([#a-z0-9]+) ([#a-z0-9]+) \3( !|;|$)/Si'
707
+ ),
708
+ '$1:$2 $3 $4$5',
709
+ $body
710
+ );
711
+
712
+ // Lowercase some common functions that can be values
713
+ $body = preg_replace_callback(
714
+ '/(?:attr|blur|brightness|circle|contrast|cubic-bezier|drop-shadow|ellipse|from|grayscale|'.
715
+ 'hsla?|hue-rotate|inset|invert|local|minmax|opacity|perspective|polygon|rgba?|rect|repeat|saturate|sepia|'.
716
+ 'steps|to|url|var|-webkit-gradient|'.
717
+ '(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?(?:calc|(?:repeating-)?(?:linear|radial)-gradient))\(/Si',
718
+ array($this, 'strtolowerCallback'),
719
+ $body
720
+ );
721
+
722
+ // Lowercase all uppercase properties
723
+ $body = preg_replace_callback('/(?:^|;)[A-Z-]+:/S', array($this, 'strtolowerCallback'), $body);
724
+
725
+ return $body;
726
+ }
727
+
728
+ private function preserveUnquotedFontTokens($matches)
729
+ {
730
+ return $this->registerUnquotedFontToken($matches[0]);
731
+ }
732
+
733
+ private function restoreUnquotedFontTokens($body)
734
+ {
735
+ return strtr($body, $this->unquotedFontTokens);
736
+ }
737
+
738
+ /**
739
+ * Compresses At-rules and selectors.
740
+ * @param string $css the whole stylesheet with rule bodies tokenized.
741
+ * @return string
742
+ */
743
+ private function processAtRulesAndSelectors($css)
744
+ {
745
+ $charset = '';
746
+ $imports = '';
747
+ $namespaces = '';
748
+
749
+ // Remove spaces before the things that should not have spaces before them.
750
+ $css = preg_replace('/ ([@{};>+)\]~=,\/\n])/S', '$1', $css);
751
+
752
+ // Remove the spaces after the things that should not have spaces after them.
753
+ $css = preg_replace('/([{}:;>+(\[~=,\/\n]) /S', '$1', $css);
754
+
755
+ // Shorten shortable double colon (CSS3) pseudo-elements to single colon (CSS2)
756
+ $css = preg_replace('/::(before|after|first-(?:line|letter))(\{|,)/Si', ':$1$2', $css);
757
+
758
+ // Retain space for special IE6 cases
759
+ $css = preg_replace_callback('/:first-(line|letter)(\{|,)/Si', function ($matches) {
760
+ return ':first-'. strtolower($matches[1]) .' '. $matches[2];
761
+ }, $css);
762
+
763
+ // Find a fraction that may used in some @media queries such as: (min-aspect-ratio: 1/1)
764
+ // Add token to add the "/" back in later
765
+ $css = preg_replace('/\(([a-z-]+):([0-9]+)\/([0-9]+)\)/Si', '($1:$2'. self::QUERY_FRACTION .'$3)', $css);
766
+
767
+ // Remove empty rule blocks up to 2 levels deep.
768
+ $css = preg_replace(array_fill(0, 2, '/(\{)[^{};\/\n]+\{\}/S'), '$1', $css);
769
+ $css = preg_replace('/[^{};\/\n]+\{\}/S', '', $css);
770
+
771
+ // Two important comments next to each other? Remove extra newline.
772
+ if ($this->keepImportantComments) {
773
+ $css = str_replace("\n\n", "\n", $css);
774
+ }
775
+
776
+ // Restore fraction
777
+ $css = str_replace(self::QUERY_FRACTION, '/', $css);
778
+
779
+ // Lowercase some popular @directives
780
+ $css = preg_replace_callback(
781
+ '/(?<!\\\\)@(?:charset|document|font-face|import|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?keyframes|media|'.
782
+ 'namespace|page|supports|viewport)/Si',
783
+ array($this, 'strtolowerCallback'),
784
+ $css
785
+ );
786
+
787
+ // Lowercase some popular media types
788
+ $css = preg_replace_callback(
789
+ '/[ ,](?:all|aural|braille|handheld|print|projection|screen|tty|tv|embossed|speech)[ ,;{]/Si',
790
+ array($this, 'strtolowerCallback'),
791
+ $css
792
+ );
793
+
794
+ // Lowercase some common pseudo-classes & pseudo-elements
795
+ $css = preg_replace_callback(
796
+ '/(?<!\\\\):(?:active|after|before|checked|default|disabled|empty|enabled|first-(?:child|of-type)|'.
797
+ 'focus(?:-within)?|hover|indeterminate|in-range|invalid|lang\(|last-(?:child|of-type)|left|link|not\(|'.
798
+ 'nth-(?:child|of-type)\(|nth-last-(?:child|of-type)\(|only-(?:child|of-type)|optional|out-of-range|'.
799
+ 'read-(?:only|write)|required|right|root|:selection|target|valid|visited)/Si',
800
+ array($this, 'strtolowerCallback'),
801
+ $css
802
+ );
803
+
804
+ // @charset handling
805
+ if (preg_match($this->charsetRegex, $css, $matches)) {
806
+ // Keep the first @charset at-rule found
807
+ $charset = $matches[0];
808
+ // Delete all @charset at-rules
809
+ $css = preg_replace($this->charsetRegex, '', $css);
810
+ }
811
+
812
+ // @import handling
813
+ $css = preg_replace_callback($this->importRegex, function ($matches) use (&$imports) {
814
+ // Keep all @import at-rules found for later
815
+ $imports .= $matches[0];
816
+ // Delete all @import at-rules
817
+ return '';
818
+ }, $css);
819
+
820
+ // @namespace handling
821
+ $css = preg_replace_callback($this->namespaceRegex, function ($matches) use (&$namespaces) {
822
+ // Keep all @namespace at-rules found for later
823
+ $namespaces .= $matches[0];
824
+ // Delete all @namespace at-rules
825
+ return '';
826
+ }, $css);
827
+
828
+ // Order critical at-rules:
829
+ // 1. @charset first
830
+ // 2. @imports below @charset
831
+ // 3. @namespaces below @imports
832
+ $css = $charset . $imports . $namespaces . $css;
833
+
834
+ return $css;
835
+ }
836
+
837
+ /**
838
+ * Splits long lines after a specific column.
839
+ *
840
+ * Some source control tools don't like it when files containing lines longer
841
+ * than, say 8000 characters, are checked in. The linebreak option is used in
842
+ * that case to split long lines after a specific column.
843
+ *
844
+ * @param string $css the whole stylesheet.
845
+ * @return string
846
+ */
847
+ private function processLongLineSplitting($css)
848
+ {
849
+ if ($this->linebreakPosition > 0) {
850
+ $l = strlen($css);
851
+ $offset = $this->linebreakPosition;
852
+ while (preg_match('/(?<!\\\\)\}(?!\n)/S', $css, $matches, PREG_OFFSET_CAPTURE, $offset)) {
853
+ $matchIndex = $matches[0][1];
854
+ $css = substr_replace($css, "\n", $matchIndex + 1, 0);
855
+ $offset = $matchIndex + 2 + $this->linebreakPosition;
856
+ $l += 1;
857
+ if ($offset > $l) {
858
+ break;
859
+ }
860
+ }
861
+ }
862
+
863
+ return $css;
864
+ }
865
+
866
+ /**
867
+ * Converts hsl() & rgb() colors to HEX format.
868
+ * @param $matches
869
+ * @return string
870
+ */
871
+ private function shortenHslAndRgbToHexCallback($matches)
872
+ {
873
+ $type = $matches[1];
874
+ $values = explode(',', $matches[2]);
875
+ $terminator = $matches[3];
876
+
877
+ if ($type === 'hsl') {
878
+ $values = Utils::hslToRgb($values);
879
+ }
880
+
881
+ $hexColors = Utils::rgbToHex($values);
882
+
883
+ // Restore space after rgb() or hsl() function in some cases such as:
884
+ // background-image: linear-gradient(to bottom, rgb(210,180,140) 10%, rgb(255,0,0) 90%);
885
+ if (!empty($terminator) && !preg_match('/[ ,);]/S', $terminator)) {
886
+ $terminator = ' '. $terminator;
887
+ }
888
+
889
+ return '#'. implode('', $hexColors) . $terminator;
890
+ }
891
+
892
+ /**
893
+ * Compresses HEX color values of the form #AABBCC to #ABC or short color name.
894
+ * @param $matches
895
+ * @return string
896
+ */
897
+ private function shortenHexColorsCallback($matches)
898
+ {
899
+ $hex = $matches[1];
900
+
901
+ // Shorten suitable 6 chars HEX colors
902
+ if (strlen($hex) === 6 && preg_match('/^([0-9a-f])\1([0-9a-f])\2([0-9a-f])\3$/Si', $hex, $m)) {
903
+ $hex = $m[1] . $m[2] . $m[3];
904
+ }
905
+
906
+ // Lowercase
907
+ $hex = '#'. strtolower($hex);
908
+
909
+ // Replace Hex colors with shorter color names
910
+ $color = array_key_exists($hex, $this->hexToNamedColorsMap) ? $this->hexToNamedColorsMap[$hex] : $hex;
911
+
912
+ return $color . $matches[2];
913
+ }
914
+
915
+ /**
916
+ * Shortens all named colors with a shorter HEX counterpart for a set of safe properties
917
+ * e.g. white -> #fff
918
+ * @param array $matches
919
+ * @return string
920
+ */
921
+ private function shortenNamedColorsCallback($matches)
922
+ {
923
+ return $matches[1] . $this->namedToHexColorsMap[strtolower($matches[2])] . $matches[3];
924
+ }
925
+
926
+ /**
927
+ * Makes a string lowercase
928
+ * @param array $matches
929
+ * @return string
930
+ */
931
+ private function strtolowerCallback($matches)
932
+ {
933
+ return strtolower($matches[0]);
934
+ }
935
+ }
components/minify-and-combine/languages/minify-and-combine-es_ES.mo ADDED
Binary file
components/minify-and-combine/languages/minify-and-combine-es_ES.po ADDED
@@ -0,0 +1,273 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of Plugins - Clearfy in Spanish (Spain)
2
+ # This file is distributed under the same license as the Plugins - Clearfy – WordPress optimization plugin and disable ultimate tweaker - Development (trunk) package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: \n"
6
+ "POT-Creation-Date: 2019-04-28 06:29+0300\n"
7
+ "PO-Revision-Date: 2019-04-28 06:29+0300\n"
8
+ "Last-Translator: \n"
9
+ "Language-Team: \n"
10
+ "Language: es\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
15
+ "X-Generator: Poedit 2.1.1\n"
16
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
17
+ "X-Generator: Poedit 2.1.1\n"
18
+ "X-Poedit-Basepath: ..\n"
19
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
20
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
21
+ "X-Poedit-SourceCharset: UTF-8\n"
22
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
23
+ "X-Poedit-SearchPath-0: .\n"
24
+ "X-Poedit-SearchPathExcluded-0: libs\n"
25
+ "X-Poedit-SearchPathExcluded-1: components\n"
26
+ "X-Poedit-SearchPathExcluded-2: cache\n"
27
+
28
+ #: admin/boot.php:23
29
+ msgid ""
30
+ "Clearfy: Minify and Combine component is not compatible with the Autoptimize "
31
+ "plugin, please do not use them together to avoid conflicts. Please disable "
32
+ "the Minify and Combine component"
33
+ msgstr ""
34
+ "Clearfy: Nuestro componente Minify and Combine no es compatible con el "
35
+ "plugin ( Autoptimize ), no los use juntos para evitar conflictos. Por favor "
36
+ "deshabilite el componente Minify y Combine"
37
+
38
+ #: admin/boot.php:50 admin/pages/settings.php:103
39
+ msgid "Optimize JavaScript Code?"
40
+ msgstr "¿Optimizar código JavaScript?"
41
+
42
+ #: admin/boot.php:55 admin/pages/settings.php:124
43
+ msgid "Aggregate JS-files?"
44
+ msgstr "¿Agregar archivos JS?"
45
+
46
+ #: admin/boot.php:60 admin/pages/settings.php:145
47
+ msgid "Also aggregate inline JS?"
48
+ msgstr "¿También agregar inline JS?"
49
+
50
+ #: admin/boot.php:65 admin/pages/settings.php:166
51
+ msgid "Force JavaScript in &lt;head&gt;?"
52
+ msgstr "Forzar JavaScript en &lt;head&gt;?"
53
+
54
+ #: admin/boot.php:70 admin/pages/settings.php:175
55
+ msgid "Exclude scripts from Мinify And Combine:"
56
+ msgstr "Excluir scripts de Мinify And Combine:"
57
+
58
+ #: admin/boot.php:75 admin/pages/settings.php:185
59
+ msgid "Add try-catch wrapping?"
60
+ msgstr "¿Añadir envoltura try-catch?"
61
+
62
+ #: admin/boot.php:83 admin/pages/settings.php:206
63
+ msgid "Optimize CSS Code?"
64
+ msgstr "¿Optimizar código CSS?"
65
+
66
+ #: admin/boot.php:89 admin/pages/settings.php:222
67
+ msgid "Aggregate CSS-files?"
68
+ msgstr "¿Agregar archivos CSS?"
69
+
70
+ #: admin/boot.php:95 admin/pages/settings.php:243
71
+ msgid "Also aggregate inline CSS?"
72
+ msgstr "¿También agregar inline CSS?"
73
+
74
+ #: admin/boot.php:101 admin/pages/settings.php:264
75
+ msgid "Generate data: URIs for images?"
76
+ msgstr "Generar datos: ¿URIs para imágenes?"
77
+
78
+ #: admin/boot.php:107 admin/pages/settings.php:274
79
+ msgid "Inline and Defer CSS?"
80
+ msgstr "¿Inline y aplazar CSS?"
81
+
82
+ #: admin/boot.php:113 admin/pages/settings.php:285
83
+ msgid "Inline all CSS?"
84
+ msgstr "¿Inline todo el CSS?"
85
+
86
+ #: admin/boot.php:119
87
+ msgid "Exclude CSS from Мinify And Combine"
88
+ msgstr "Excluir CSS de Мinify And Combine"
89
+
90
+ #: admin/boot.php:135
91
+ msgid "One click optimize scripts (js, css)"
92
+ msgstr "Optimizar scripts con un clik (js, css)"
93
+
94
+ #: admin/boot.php:137
95
+ msgid "One click optimize html code and scripts"
96
+ msgstr "Optimizar html y scripts con un Click"
97
+
98
+ #: admin/pages/settings.php:39
99
+ msgid "Minify (JS/CSS)"
100
+ msgstr "Minificar (JS/CSS)"
101
+
102
+ #: admin/pages/settings.php:60
103
+ msgid "Minify (Html/JS/CSS)"
104
+ msgstr "Minificar (Html/JS/CSS)"
105
+
106
+ #: admin/pages/settings.php:60
107
+ msgid "General"
108
+ msgstr "General"
109
+
110
+ #: admin/pages/settings.php:78
111
+ msgid "The cache has been successfully cleaned."
112
+ msgstr "El caché se ha limpiado con éxito."
113
+
114
+ #: admin/pages/settings.php:96
115
+ msgid "JavaScript Options"
116
+ msgstr "Opciones de JavaScript"
117
+
118
+ #: admin/pages/settings.php:126
119
+ msgid ""
120
+ "Aggregate all linked JS-files to have them loaded non-render blocking? If "
121
+ "this option is off, the individual JS-files will remain in place but will be "
122
+ "minified."
123
+ msgstr ""
124
+ "¿Agregar todos los archivos JS vinculados para que sean cargados sin "
125
+ "procesamiento? Si esta opción está desactivada, los archivos JS individuales "
126
+ "permanecerán en su lugar pero se minimizarán."
127
+
128
+ #: admin/pages/settings.php:147
129
+ msgid ""
130
+ "Let Мinify And Combine also extract JS from the HTML. Warning: this can make "
131
+ "Мinify And Combine's cache size grow quickly, so only enable this if you "
132
+ "know what you're doing."
133
+ msgstr ""
134
+ "Deje que Мinify And Combine también extraiga JS del HTML. Advertencia: esto "
135
+ "puede hacer que el tamaño del caché de Мinify And Combine crezca "
136
+ "rápidamente, así que habilítelo solo si sabe lo que está haciendo."
137
+
138
+ #: admin/pages/settings.php:168
139
+ msgid ""
140
+ "Load JavaScript early, this can potentially fix some JS-errors, but makes "
141
+ "the JS render blocking."
142
+ msgstr ""
143
+ "Cargar primero JavaScript puede corregir algunos errores potenciales de JS, "
144
+ "pero hace que JS renderice el bloqueo."
145
+
146
+ #: admin/pages/settings.php:177
147
+ msgid ""
148
+ "A comma-separated list of scripts you want to exclude from being optimized, "
149
+ "for example 'whatever.js, another.js' (without the quotes) to exclude those "
150
+ "scripts from being aggregated and minimized by Мinify And Combine."
151
+ msgstr ""
152
+ "Lista de scripts separados por comas para ser excluídos de la optimización, "
153
+ "ejemplo, 'whatever.js, another.js' (sin las comillas) excluir estos scripts "
154
+ "de ser agregados para minimizarlos por Мinify And Combine."
155
+
156
+ #: admin/pages/settings.php:187 admin/pages/settings.php:208
157
+ msgid ""
158
+ "If your scripts break because of a JS-error, you might want to try this."
159
+ msgstr "Si sus scripts se rompen debido a un error de JS, intente esto."
160
+
161
+ #: admin/pages/settings.php:199
162
+ msgid "CSS Options"
163
+ msgstr "Opciones de CSS"
164
+
165
+ #: admin/pages/settings.php:224
166
+ msgid ""
167
+ "Aggregate all linked CSS-files? If this option is off, the individual CSS-"
168
+ "files will remain in place but will be minified."
169
+ msgstr ""
170
+ "¿Agregar todos los archivos CSS vinculados? Si esta opción es desactivada, "
171
+ "los archivos CSS individuales permanecerán en su lugar pero se minimizarán."
172
+
173
+ #: admin/pages/settings.php:245
174
+ msgid ""
175
+ "Check this option for Мinify And Combine to also aggregate CSS in the HTML."
176
+ msgstr ""
177
+ "Marque esta opción para Мinificar y combinar asi como agregar también CSS en "
178
+ "el HTML."
179
+
180
+ #: admin/pages/settings.php:266
181
+ msgid ""
182
+ "Enable this to include small background-images in the CSS itself instead of "
183
+ "as separate downloads."
184
+ msgstr ""
185
+ "Habilite esto para incluir pequeñas imágenes de fondo en el CSS, "
186
+ "descarguelas de forma separada."
187
+
188
+ #: admin/pages/settings.php:276
189
+ msgid ""
190
+ "Inline \"above the fold CSS\" while loading the main auto optimized CSS only "
191
+ "after page load. Check the FAQ for more info.\n"
192
+ "This can be fully automated for different types of pages with the Мinify And "
193
+ "Combine CriticalCSS Power-Up."
194
+ msgstr ""
195
+ "En línea \"above the fold CSS\" mientras se carga el auto optimizado de CSS "
196
+ "principal. Consulte FAQ para obtener más información.\n"
197
+ "Esto puede automatizarse completamente para diferentes tipos de páginas con "
198
+ "la función de \"Мinify And Combine CriticalCSS\"."
199
+
200
+ #: admin/pages/settings.php:287
201
+ msgid ""
202
+ "Inlining all CSS can improve performance for sites with a low pageviews/ "
203
+ "visitor-rate, but may slow down performance otherwise."
204
+ msgstr ""
205
+ "La incorporación de todo el CSS puede mejorar el rendimiento de los sitios "
206
+ "con un bajo pageviews/ visitor-rate, pero también podría relentizar el "
207
+ "rendimiento."
208
+
209
+ #: admin/pages/settings.php:294
210
+ msgid "Exclude CSS from Мinify And Combine:"
211
+ msgstr "Excluir CSS de Мinify And Combine:"
212
+
213
+ #: admin/pages/settings.php:296
214
+ msgid "A comma-separated list of CSS you want to exclude from being optimized."
215
+ msgstr "Lista de CSS separada por comas para ser excluídas de la optimización."
216
+
217
+ #: admin/pages/settings.php:308
218
+ msgid "Cache Info"
219
+ msgstr "Información de caché"
220
+
221
+ #: admin/pages/settings.php:368 includes/boot.php:52 includes/boot.php:71
222
+ msgid "Clear cache"
223
+ msgstr "Limpiar cache"
224
+
225
+ #: admin/pages/settings.php:386
226
+ msgid ""
227
+ "<b>This could break things!</b><br>If you notice any errors on your website "
228
+ "after having activated this setting, just deactivate it again, and your site "
229
+ "will be back to normal."
230
+ msgstr ""
231
+ "<b>¡Esto podría dañar algo!</b> <br> Si observa algún error en su sitio web "
232
+ "después de haber activado esta configuración, simplemente desactívela "
233
+ "nuevamente y su sitio volverá a la normalidad."
234
+
235
+ #: includes/classes/class.mac-cache-checker.php:84
236
+ msgid "Мinify And Combine cache size warning"
237
+ msgstr "Advertencia de tamaño Мinify And Combine en Cache"
238
+
239
+ #: includes/classes/class.mac-cache-checker.php:85
240
+ msgid ""
241
+ "Мinify And Combine's cache size is getting big, consider purging the cache. "
242
+ "Have a look at https://wordpress.org/plugins/ to see how you can keep the "
243
+ "cache size under control."
244
+ msgstr ""
245
+ "El tamaño del caché de Мinify And Combine está incrementándose, considere "
246
+ "purgar el caché. Busque en https://wordpress.org/plugins/ para ver cómo "
247
+ "puedes mantener el tamaño del caché bajo control."
248
+
249
+ #: includes/classes/class.mac-cache-checker.php:107
250
+ msgid ""
251
+ "<strong>Мinify And Combine's cache size is getting big</strong>, consider "
252
+ "purging the cache. Have a look at <a href=\"https://wordpress.org/plugins/\" "
253
+ "target=\"_blank\" rel=\"noopener noreferrer\">the Мinify And Combine FAQ</a> "
254
+ "to see how you can keep the cache size under control."
255
+ msgstr ""
256
+ "<strong>El tamaño del caché de Мinify And Combine está incrementándose</"
257
+ "strong>, considere purgar el caché. Vea cómo hacerlo: <a href=\"https://"
258
+ "wordpress.org/plugins/\" target=\"_blank\" rel=\"noopener noreferrer\">the "
259
+ "Мinify And Combine FAQ</a> para saber cómo mantener el tamaño de caché bajo "
260
+ "control."
261
+
262
+ #: includes/classes/class.mac-main.php:426
263
+ #, php-format
264
+ msgid ""
265
+ "Мinify And Combine cannot write to the cache directory (%s), please fix to "
266
+ "enable CSS/ JS optimization!"
267
+ msgstr ""
268
+ "Мinify And Combine no puede escribir en el directorio de caché (% s), "
269
+ "corríjalo para habilitar la optimización CSS / JS."
270
+
271
+ #: minify-and-combine.php:101
272
+ msgid "Webcraftic minify and combine"
273
+ msgstr "Webcraftic minify and combine"
components/minify-and-combine/minify-and-combine.php CHANGED
@@ -1,98 +1,118 @@
1
  <?php
2
- /**
3
- * Plugin Name: Мinify And Combine
4
- * Plugin URI: https://clearfy.pro/minify-and-combine/
5
- * Description: Optimizes your website, concatenating the CSS and JavaScript code, and compressing it.
6
- * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
- * Version: 1.0.1
8
- * Text Domain: minify-and-combine
9
- * Domain Path: /languages/
10
- * Author URI: https://clearfy.pro
11
- * Framework Version: FACTORY_409_VERSION
12
- */
13
-
14
- /*
15
- * #### CREDITS ####
16
- * This plugin is based on the plugin Autoptimize by the author Frank Goossens, we have finalized this code for our project and our goals.
17
- * Many thanks to Frank Goossens for the quality solution for optimizing scripts in Wordpress.
18
- *
19
- * Public License is a GPLv2 compatible license allowing you to change and use this version of the plugin for free.
20
- */
21
-
22
- // Exit if accessed directly
23
- if( !defined('ABSPATH') ) {
24
- exit;
25
- }
26
-
27
- define('WMAC_PLUGIN_VERSION', '1.0.1');
28
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  // Директория плагина
30
- define('WMAC_PLUGIN_DIR', dirname(__FILE__));
31
-
 
32
  // Относительный путь к плагину
33
- define('WMAC_PLUGIN_BASE', plugin_basename(__FILE__));
34
-
 
35
  // Ссылка к директории плагина
36
- define('WMAC_PLUGIN_URL', plugins_url(null, __FILE__));
37
-
38
-
39
-
40
- if( !defined('LOADING_MINIFY_AND_COMBINE_AS_ADDON') ) {
41
- require_once(WMAC_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php');
42
- require_once(WMAC_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php');
43
- }
44
-
45
- $plugin_info = array(
46
- 'prefix' => 'wbcr_mac_', // префикс для базы данных и полей формы
47
- 'plugin_name' => 'wbcr_minify_and_combine', // имя плагина, как уникальный идентификатор
48
- 'plugin_title' => __('Webcraftic minify and combine', 'minify-and-combine'), // заголовок плагина
49
- 'plugin_version' => WMAC_PLUGIN_VERSION, // текущая версия плагина
50
- 'plugin_build' => 'free', // сборка плагина
51
- //'updates' => WMAC_PLUGIN_DIR . '/updates/' в этой папке хранятся миграции для разных версий плагина
52
- );
53
-
54
- /**
55
- * Проверяет совместимость с Wordpress, php и другими плагинами.
56
- */
57
-
58
- $compatibility = new Wbcr_FactoryClearfy_Compatibility(array_merge($plugin_info, array(
59
- 'plugin_already_activate' => defined('WMAC_PLUGIN_ACTIVE'),
60
- 'plugin_as_component' => defined('LOADING_MINIFY_AND_COMBINE_AS_ADDON'),
61
- 'plugin_dir' => WMAC_PLUGIN_DIR,
62
- 'plugin_base' => WMAC_PLUGIN_BASE,
63
- 'plugin_url' => WMAC_PLUGIN_URL,
64
- 'required_php_version' => '5.4',
65
- 'required_wp_version' => '4.2.0',
66
- 'required_clearfy_check_component' => true
67
- )));
68
-
69
- /**
70
- * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
71
- * а пользователь получит предупреждение.
72
- */
73
- if( !$compatibility->check() ) {
74
- return;
75
- }
76
-
77
- // Устанавливаем контстанту, что плагин уже используется
78
- define('WMAC_PLUGIN_ACTIVE', true);
79
-
80
- // Этот плагин может быть аддоном плагина Clearfy, если он загружен, как аддон, то мы не подключаем фреймворк,
81
- // а наследуем функции фреймворка от плагина Clearfy. Если плагин скомпилирован, как отдельный плагин, то он использует собственный фреймворк для работы.
82
- // Константа LOADING_MINIFY_AND_COMBINE_AS_ADDON утсанавливается в классе libs/factory/core/includes/Wbcr_Factory409_Plugin
83
-
84
- if( !defined('LOADING_MINIFY_AND_COMBINE_AS_ADDON') ) {
85
- // Фреймворк - отвечает за интерфейс, содержит общие функции для серии плагинов и готовые шаблоны для быстрого развертывания плагина.
86
- require_once(WMAC_PLUGIN_DIR . '/libs/factory/core/boot.php');
87
- }
88
-
89
- // Основной класс плагина
90
- require_once(WMAC_PLUGIN_DIR . '/includes/class.plugin.php');
91
-
92
- // Класс WMAC_Plugin создается только, если этот плагин работает, как самостоятельный плагин.
93
- // Если плагин работает, как аддон, то класс создается родительским плагином.
94
-
95
- if( !defined('LOADING_MINIFY_AND_COMBINE_AS_ADDON') ) {
96
- new WMAC_Plugin(__FILE__, $plugin_info);
97
- }
 
 
98
 
1
  <?php
2
+ /**
3
+ * Plugin Name: Мinify And Combine
4
+ * Plugin URI: https://clearfy.pro/minify-and-combine/
5
+ * Description: Optimizes your website, concatenating the CSS and JavaScript code, and compressing it.
6
+ * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
+ * Version: 1.0.1
8
+ * Text Domain: minify-and-combine
9
+ * Domain Path: /languages/
10
+ * Author URI: https://clearfy.pro
11
+ * Framework Version: FACTORY_409_VERSION
12
+ */
13
+
14
+ /*
15
+ * #### CREDITS ####
16
+ * This plugin is based on the plugin Autoptimize by the author Frank Goossens, we have finalized this code for our project and our goals.
17
+ * Many thanks to Frank Goossens for the quality solution for optimizing scripts in Wordpress.
18
+ *
19
+ * Public License is a GPLv2 compatible license allowing you to change and use this version of the plugin for free.
20
+ */
21
+
22
+ // Exit if accessed directly
23
+ if ( ! defined( 'ABSPATH' ) ) {
24
+ exit;
25
+ }
26
+
27
+ if ( ! defined( 'WMAC_PLUGIN_VERSION' ) ) {
28
+ define( 'WMAC_PLUGIN_VERSION', '1.0.1' );
29
+ }
30
+
31
+ // Fix for ithemes sync. When the ithemes sync plugin accepts the request, set the WP_ADMIN constant,
32
+ // after which the plugin Clearfy begins to create errors, and how the logic of its work is broken.
33
+ // Solution to simply terminate the plugin if there is a request from ithemes sync
34
+ // --------------------------------------
35
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'ithemes_sync_request' ) {
36
+ return;
37
+ }
38
+
39
+ if ( isset( $_GET['ithemes-sync-request'] ) && ! empty( $_GET['ithemes-sync-request'] ) ) {
40
+ return;
41
+ }
42
+ // ----------------------------------------
43
+
44
+ if ( ! defined( 'WMAC_PLUGIN_DIR' ) ) {
45
  // Директория плагина
46
+ define( 'WMAC_PLUGIN_DIR', dirname( __FILE__ ) );
47
+ }
48
+ if ( ! defined( 'WMAC_PLUGIN_BASE' ) ) {
49
  // Относительный путь к плагину
50
+ define( 'WMAC_PLUGIN_BASE', plugin_basename( __FILE__ ) );
51
+ }
52
+ if ( ! defined( 'WMAC_PLUGIN_URL' ) ) {
53
  // Ссылка к директории плагина
54
+ define( 'WMAC_PLUGIN_URL', plugins_url( null, __FILE__ ) );
55
+ }
56
+
57
+
58
+
59
+ if ( ! defined( 'LOADING_MINIFY_AND_COMBINE_AS_ADDON' ) ) {
60
+ require_once( WMAC_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php' );
61
+ require_once( WMAC_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php' );
62
+ }
63
+
64
+ $plugin_info = array(
65
+ 'prefix' => 'wbcr_mac_', // префикс для базы данных и полей формы
66
+ 'plugin_name' => 'wbcr_minify_and_combine', // имя плагина, как уникальный идентификатор
67
+ 'plugin_title' => __( 'Webcraftic minify and combine', 'minify-and-combine' ), // заголовок плагина
68
+ 'plugin_version' => WMAC_PLUGIN_VERSION, // текущая версия плагина
69
+ 'plugin_build' => 'free', // сборка плагина
70
+ //'updates' => WMAC_PLUGIN_DIR . '/updates/' в этой папке хранятся миграции для разных версий плагина
71
+ );
72
+
73
+ /**
74
+ * Проверяет совместимость с Wordpress, php и другими плагинами.
75
+ */
76
+
77
+ $compatibility = new Wbcr_FactoryClearfy_Compatibility( array_merge( $plugin_info, array(
78
+ 'factory_version' => 'FACTORY_409_VERSION',
79
+ 'plugin_already_activate' => defined( 'WMAC_PLUGIN_ACTIVE' ),
80
+ 'plugin_as_component' => defined( 'LOADING_MINIFY_AND_COMBINE_AS_ADDON' ),
81
+ 'plugin_dir' => WMAC_PLUGIN_DIR,
82
+ 'plugin_base' => WMAC_PLUGIN_BASE,
83
+ 'plugin_url' => WMAC_PLUGIN_URL,
84
+ 'required_php_version' => '5.4',
85
+ 'required_wp_version' => '4.2.0',
86
+ 'required_clearfy_check_component' => true
87
+ ) ) );
88
+
89
+ /**
90
+ * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
91
+ * а пользователь получит предупреждение.
92
+ */
93
+ if ( ! $compatibility->check() ) {
94
+ return;
95
+ }
96
+
97
+ // Устанавливаем контстанту, что плагин уже используется
98
+ define( 'WMAC_PLUGIN_ACTIVE', true );
99
+
100
+ // Этот плагин может быть аддоном плагина Clearfy, если он загружен, как аддон, то мы не подключаем фреймворк,
101
+ // а наследуем функции фреймворка от плагина Clearfy. Если плагин скомпилирован, как отдельный плагин, то он использует собственный фреймворк для работы.
102
+ // Константа LOADING_MINIFY_AND_COMBINE_AS_ADDON утсанавливается в классе libs/factory/core/includes/Wbcr_Factory409_Plugin
103
+
104
+ if ( ! defined( 'LOADING_MINIFY_AND_COMBINE_AS_ADDON' ) ) {
105
+ // Фреймворк - отвечает за интерфейс, содержит общие функции для серии плагинов и готовые шаблоны для быстрого развертывания плагина.
106
+ require_once( WMAC_PLUGIN_DIR . '/libs/factory/core/boot.php' );
107
+ }
108
+
109
+ // Основной класс плагина
110
+ require_once( WMAC_PLUGIN_DIR . '/includes/class.plugin.php' );
111
+
112
+ // Класс WMAC_Plugin создается только, если этот плагин работает, как самостоятельный плагин.
113
+ // Если плагин работает, как аддон, то класс создается родительским плагином.
114
+
115
+ if ( ! defined( 'LOADING_MINIFY_AND_COMBINE_AS_ADDON' ) ) {
116
+ new WMAC_Plugin( __FILE__, $plugin_info );
117
+ }
118
 
components/updates-manager/admin/assets/css/general.css CHANGED
@@ -1,155 +1,155 @@
1
- /**
2
- * General styles
3
- * @author Alex Kovalev <alex.kovalevv@gmail.com>
4
- * @copyright Alex Kovalev 23.08.2017
5
- */
6
- #WBCR {
7
- /* upm */
8
- }
9
- #WBCR .wp-list-table th,
10
- #WBCR .wp-list-table .plugin-name {
11
- font-size: 13px;
12
- font-weight: 600;
13
- }
14
- #WBCR .wp-list-table.wbcr-upm-list-table-pro.wbcr-upm-column-premium td {
15
- background: #f9f2f0 !important;
16
- }
17
- #WBCR .wp-list-table.wbcr-upm-list-table-pro.wbcr-upm-column-premium td .factory-buttons-way,
18
- #WBCR .wp-list-table.wbcr-upm-list-table-pro.wbcr-upm-column-premium td input[type="checkbox"] {
19
- border-color: #fff;
20
- background: #fff;
21
- }
22
- #WBCR .wp-list-table th.wbcr-upm-column-premium,
23
- #WBCR .wp-list-table td.wbcr-upm-column-premium {
24
- background: #f9f2f0 !important;
25
- }
26
- #WBCR .wp-list-table th.wbcr-upm-column-premium .factory-buttons-way,
27
- #WBCR .wp-list-table td.wbcr-upm-column-premium .factory-buttons-way,
28
- #WBCR .wp-list-table th.wbcr-upm-column-premium input[type="checkbox"],
29
- #WBCR .wp-list-table td.wbcr-upm-column-premium input[type="checkbox"] {
30
- border-color: #fff;
31
- background: #fff;
32
- }
33
- #WBCR .wp-list-table .plugin-update-tr.active td,
34
- #WBCR .wp-list-table.plugins .active th.check-column {
35
- border-left: 4px solid #e6e6e6 !important;
36
- padding-left: 8px !important;
37
- }
38
- #WBCR .wp-list-table.plugins .row-actions,
39
- #WBCR .wp-list-table.plugins .second {
40
- padding: 0 0 5px;
41
- color: #949292;
42
- }
43
- #WBCR .wp-list-table.plugins .active td,
44
- #WBCR .wp-list-table.plugins .active th {
45
- background-color: #ffffff;
46
- }
47
- #WBCR .wp-list-table.plugins,
48
- #WBCR .wp-list-table.plugins td,
49
- #WBCR .wp-list-table.plugins th,
50
- #WBCR .wp-list-table .row-actions .network_active,
51
- #WBCR .wp-list-table .row-actions .network_only {
52
- color: #777;
53
- }
54
- #WBCR .wp-list-table .widefat ol,
55
- #WBCR .wp-list-table .widefat p,
56
- #WBCR .wp-list-table .widefat tfoot tr td,
57
- #WBCR .wp-list-table .widefat tfoot tr th,
58
- #WBCR .wp-list-table .widefat thead tr td,
59
- #WBCR .wp-list-table .widefat thead tr th,
60
- #WBCR .wp-list-table .widefat ul {
61
- color: #7d7d7d;
62
- }
63
- #WBCR .wp-list-table #disable_updates,
64
- #WBCR .wp-list-table #disable_auto_updates,
65
- #WBCR .wp-list-table #disable_translation_updates,
66
- #WBCR .wp-list-table #hide_item {
67
- width: 100px;
68
- }
69
- #WBCR .column-flags .factory-checkbox {
70
- display: inline-flex;
71
- }
72
- #WBCR .wp-list-table.autoupdate th {
73
- white-space: normal !important;
74
- }
75
- #WBCR .wp-list-table.autoupdate .plugin-title {
76
- white-space: normal !important;
77
- }
78
- #WBCR .wp-list-table__plugins .plugin-title {
79
- max-width: 12rem;
80
- }
81
- #WBCR .wbcr-upm-group-header-pro {
82
- position: relative;
83
- display: inline-block;
84
- }
85
- #WBCR .wbcr-upm-group-header-pro:after {
86
- display: inline-block;
87
- position: relative;
88
- content: 'PRO';
89
- background: #ff5722;
90
- border-radius: 4px;
91
- color: #fff;
92
- font-size: 10px;
93
- line-height: 1;
94
- font-style: normal;
95
- padding: 4px 6px;
96
- margin-left: 4px;
97
- vertical-align: top;
98
- top: 0;
99
- left: auto;
100
- right: 0;
101
- z-index: 11;
102
- }
103
- #WBCR #disable_translation_updates,
104
- #WBCR #hide_item {
105
- position: relative;
106
- }
107
- #WBCR #disable_translation_updates.wbcr-upm-column-pro:after,
108
- #WBCR #hide_item.wbcr-upm-column-pro:after {
109
- display: inline-block;
110
- position: absolute;
111
- content: 'PRO';
112
- background: #ff5722;
113
- border-radius: 4px;
114
- color: #fff;
115
- font-size: 10px;
116
- line-height: 1;
117
- font-style: normal;
118
- padding: 4px 6px;
119
- margin-left: 4px;
120
- vertical-align: top;
121
- top: -10px;
122
- left: auto;
123
- right: 0;
124
- z-index: 11;
125
- }
126
- #WBCR .factory-checkbox.wbcr-upm-icon-pro:after {
127
- display: inline-block;
128
- position: relative;
129
- content: 'PRO';
130
- background: #ff5722;
131
- border-radius: 4px;
132
- color: #fff;
133
- font-size: 10px;
134
- line-height: 1;
135
- font-style: normal;
136
- padding: 4px 6px;
137
- margin-left: 4px;
138
- vertical-align: top;
139
- top: -8px;
140
- left: -10px;
141
- right: auto;
142
- z-index: 11;
143
- }
144
- #WBCR .wp-list-table.autoupdate .check-column {
145
- padding: 10px 9px;
146
- }
147
- .factory-checkbox-disabled input,
148
- .factory-checkbox-disabled button {
149
- pointer-events: none;
150
- cursor: not-allowed;
151
- opacity: .65;
152
- filter: alpha(opacity=65);
153
- -webkit-box-shadow: none;
154
- box-shadow: none;
155
- }
1
+ /**
2
+ * General styles
3
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>
4
+ * @copyright Alex Kovalev 23.08.2017
5
+ */
6
+ #WBCR {
7
+ /* upm */
8
+ }
9
+ #WBCR .wp-list-table th,
10
+ #WBCR .wp-list-table .plugin-name {
11
+ font-size: 13px;
12
+ font-weight: 600;
13
+ }
14
+ #WBCR .wp-list-table.wbcr-upm-list-table-pro.wbcr-upm-column-premium td {
15
+ background: #f9f2f0 !important;
16
+ }
17
+ #WBCR .wp-list-table.wbcr-upm-list-table-pro.wbcr-upm-column-premium td .factory-buttons-way,
18
+ #WBCR .wp-list-table.wbcr-upm-list-table-pro.wbcr-upm-column-premium td input[type="checkbox"] {
19
+ border-color: #fff;
20
+ background: #fff;
21
+ }
22
+ #WBCR .wp-list-table th.wbcr-upm-column-premium,
23
+ #WBCR .wp-list-table td.wbcr-upm-column-premium {
24
+ background: #f9f2f0 !important;
25
+ }
26
+ #WBCR .wp-list-table th.wbcr-upm-column-premium .factory-buttons-way,
27
+ #WBCR .wp-list-table td.wbcr-upm-column-premium .factory-buttons-way,
28
+ #WBCR .wp-list-table th.wbcr-upm-column-premium input[type="checkbox"],
29
+ #WBCR .wp-list-table td.wbcr-upm-column-premium input[type="checkbox"] {
30
+ border-color: #fff;
31
+ background: #fff;
32
+ }
33
+ #WBCR .wp-list-table .plugin-update-tr.active td,
34
+ #WBCR .wp-list-table.plugins .active th.check-column {
35
+ border-left: 4px solid #e6e6e6 !important;
36
+ padding-left: 8px !important;
37
+ }
38
+ #WBCR .wp-list-table.plugins .row-actions,
39
+ #WBCR .wp-list-table.plugins .second {
40
+ padding: 0 0 5px;
41
+ color: #949292;
42
+ }
43
+ #WBCR .wp-list-table.plugins .active td,
44
+ #WBCR .wp-list-table.plugins .active th {
45
+ background-color: #ffffff;
46
+ }
47
+ #WBCR .wp-list-table.plugins,
48
+ #WBCR .wp-list-table.plugins td,
49
+ #WBCR .wp-list-table.plugins th,
50
+ #WBCR .wp-list-table .row-actions .network_active,
51
+ #WBCR .wp-list-table .row-actions .network_only {
52
+ color: #777;
53
+ }
54
+ #WBCR .wp-list-table .widefat ol,
55
+ #WBCR .wp-list-table .widefat p,
56
+ #WBCR .wp-list-table .widefat tfoot tr td,
57
+ #WBCR .wp-list-table .widefat tfoot tr th,
58
+ #WBCR .wp-list-table .widefat thead tr td,
59
+ #WBCR .wp-list-table .widefat thead tr th,
60
+ #WBCR .wp-list-table .widefat ul {
61
+ color: #7d7d7d;
62
+ }
63
+ #WBCR .wp-list-table #disable_updates,
64
+ #WBCR .wp-list-table #disable_auto_updates,
65
+ #WBCR .wp-list-table #disable_translation_updates,
66
+ #WBCR .wp-list-table #hide_item {
67
+ width: 100px;
68
+ }
69
+ #WBCR .column-flags .factory-checkbox {
70
+ display: inline-flex;
71
+ }
72
+ #WBCR .wp-list-table.autoupdate th {
73
+ white-space: normal !important;
74
+ }
75
+ #WBCR .wp-list-table.autoupdate .plugin-title {
76
+ white-space: normal !important;
77
+ }
78
+ #WBCR .wp-list-table__plugins .plugin-title {
79
+ max-width: 12rem;
80
+ }
81
+ #WBCR .wbcr-upm-group-header-pro {
82
+ position: relative;
83
+ display: inline-block;
84
+ }
85
+ #WBCR .wbcr-upm-group-header-pro:after {
86
+ display: inline-block;
87
+ position: relative;
88
+ content: 'PRO';
89
+ background: #ff5722;
90
+ border-radius: 4px;
91
+ color: #fff;
92
+ font-size: 10px;
93
+ line-height: 1;
94
+ font-style: normal;
95
+ padding: 4px 6px;
96
+ margin-left: 4px;
97
+ vertical-align: top;
98
+ top: 0;
99
+ left: auto;
100
+ right: 0;
101
+ z-index: 11;
102
+ }
103
+ #WBCR #disable_translation_updates,
104
+ #WBCR #hide_item {
105
+ position: relative;
106
+ }
107
+ #WBCR #disable_translation_updates.wbcr-upm-column-pro:after,
108
+ #WBCR #hide_item.wbcr-upm-column-pro:after {
109
+ display: inline-block;
110
+ position: absolute;
111
+ content: 'PRO';
112
+ background: #ff5722;
113
+ border-radius: 4px;
114
+ color: #fff;
115
+ font-size: 10px;
116
+ line-height: 1;
117
+ font-style: normal;
118
+ padding: 4px 6px;
119
+ margin-left: 4px;
120
+ vertical-align: top;
121
+ top: -10px;
122
+ left: auto;
123
+ right: 0;
124
+ z-index: 11;
125
+ }
126
+ #WBCR .factory-checkbox.wbcr-upm-icon-pro:after {
127
+ display: inline-block;
128
+ position: relative;
129
+ content: 'PRO';
130
+ background: #ff5722;
131
+ border-radius: 4px;
132
+ color: #fff;
133
+ font-size: 10px;
134
+ line-height: 1;
135
+ font-style: normal;
136
+ padding: 4px 6px;
137
+ margin-left: 4px;
138
+ vertical-align: top;
139
+ top: -8px;
140
+ left: -10px;
141
+ right: auto;
142
+ z-index: 11;
143
+ }
144
+ #WBCR .wp-list-table.autoupdate .check-column {
145
+ padding: 10px 9px;
146
+ }
147
+ .factory-checkbox-disabled input,
148
+ .factory-checkbox-disabled button {
149
+ pointer-events: none;
150
+ cursor: not-allowed;
151
+ opacity: .65;
152
+ filter: alpha(opacity=65);
153
+ -webkit-box-shadow: none;
154
+ box-shadow: none;
155
+ }
components/updates-manager/admin/assets/css/themes.css CHANGED
@@ -1,20 +1,20 @@
1
- /* update manager button */
2
- /*#wpbody .search-form:not(.hide-placeholder):before {
3
- display: inline-block;
4
- content: 'Update manager';
5
- margin-left: 4px;
6
- padding: 4px 8px;
7
- position: relative;
8
- top: -3px;
9
- text-decoration: none;
10
- border: 1px solid #ccc;
11
- border-radius: 2px;
12
- background: #f7f7f7;
13
- text-shadow: none;
14
- font-weight: 600;
15
- font-size: 13px;
16
- line-height: normal;
17
- color: #0073aa;
18
- cursor: pointer;
19
- outline: 0;
20
- }*/
1
+ /* update manager button */
2
+ /*#wpbody .search-form:not(.hide-placeholder):before {
3
+ display: inline-block;
4
+ content: 'Update manager';
5
+ margin-left: 4px;
6
+ padding: 4px 8px;
7
+ position: relative;
8
+ top: -3px;
9
+ text-decoration: none;
10
+ border: 1px solid #ccc;
11
+ border-radius: 2px;
12
+ background: #f7f7f7;
13
+ text-shadow: none;
14
+ font-weight: 600;
15
+ font-size: 13px;
16
+ line-height: normal;
17
+ color: #0073aa;
18
+ cursor: pointer;
19
+ outline: 0;
20
+ }*/
components/updates-manager/includes/classes/class.configurate-updates.php CHANGED
@@ -1,339 +1,382 @@
1
  <?php
2
-
3
- /**
4
- * This class configures the parameters seo
5
- * @author Webcraftic <wordpress.webraftic@gmail.com>
6
- * @copyright (c) 2017 Webraftic Ltd
7
- * @version 1.0
8
- */
9
 
10
- // Exit if accessed directly
11
- if( !defined('ABSPATH') ) {
12
- exit;
13
- }
 
 
 
14
 
15
- require_once WUPM_PLUGIN_DIR . '/admin/includes/class.plugin-filters.php';
16
-
17
- class WUPM_ConfigUpdates extends Wbcr_FactoryClearfy206_Configurate {
18
-
19
- public function registerActionsAndFilters()
20
- {
21
- /**
22
- * Plugin updates
23
- */
24
- $plugins_update = $this->getPopulateOption('plugin_updates');
25
-
26
- switch( $this->getPopulateOption('plugin_updates') ) {
27
- case 'disable_plugin_updates':
28
- // and disable version check
29
- add_filter('site_transient_update_plugins', array($this, 'lastCheckedNow'), 50);
30
- add_action('admin_init', array($this, 'adminInitForPlugins'));
31
- add_filter('auto_update_plugin', '__return_false');
32
- break;
33
- case 'enable_plugin_auto_updates':
34
- // exclude some plugins in update list
35
- add_filter('auto_update_plugin', array($this, 'pluginsAutoUpdate'), 50, 2);
36
- break;
37
- }
38
 
39
- if( $plugins_update != 'disable_plugin_updates' ) {
40
- add_filter('site_transient_update_plugins', array($this, 'disablePluginNotifications'), 50);
41
- add_filter('http_request_args', array($this, 'httpRequestArgsRemovePlugins'), 5, 2);
42
- }
43
-
44
- /**
45
- * Theme updates
46
- */
47
- switch( $this->getPopulateOption('theme_updates') ) {
48
- case 'disable_theme_updates':
49
- add_filter('site_transient_update_themes', array($this, 'lastCheckedNow'), 50);
50
- add_action('admin_init', array($this, 'adminInitForThemes'));
51
- add_filter('auto_update_theme', '__return_false');
52
- break;
53
- case 'enable_theme_auto_updates':
54
- add_filter('auto_update_theme', '__return_true', 1);
55
- break;
56
- }
57
 
58
- /**
59
- * disable wp default translation update
60
- */
61
 
62
- if( $this->getPopulateOption('auto_tran_update') ) {
63
- add_filter('auto_update_translation', '__return_false', 1);
64
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
 
66
- /**
67
- * control WP Auto core update
68
- */
69
-
70
- switch( $this->getPopulateOption('wp_update_core') ) {
71
- case 'disable_core_updates':
72
- $this->disableAllCoreUpdates();
73
- break;
74
- case 'disable_core_auto_updates':
75
- add_filter('allow_major_auto_core_updates', '__return_false');
76
- add_filter('allow_dev_auto_core_updates', '__return_false');
77
- add_filter('allow_minor_auto_core_updates', '__return_false');
78
- break;
79
- case 'major':
80
- add_filter('allow_major_auto_core_updates', '__return_true');
81
- break;
82
- case 'development':
83
- add_filter('allow_dev_auto_core_updates', '__return_true');
84
- break;
85
- default:
86
- add_filter('allow_minor_auto_core_updates', '__return_true');
87
- break;
88
- }
89
 
90
- /**
91
- * disable wp default translation update
92
- */
93
- if( $this->getPopulateOption('enable_update_vcs') ) {
94
- add_filter('automatic_updates_is_vcs_checkout', '__return_false', 1);
95
- }
 
 
 
 
 
 
 
96
 
97
- /**
98
- * disable updates nags for all users except admin
99
- */
100
- if( $this->getPopulateOption('updates_nags_only_for_admin') && !current_user_can('update_core') ) {
101
- remove_action('admin_notices', 'update_nag', 3);
102
- }
103
 
104
- add_action('schedule_event', array($this, 'filterCronEvents'));
 
105
  }
106
 
107
  /**
108
- * Filter cron events
109
- * @param $event
110
- * @return bool
111
  */
112
- public function filterCronEvents($event)
113
- {
114
- $core_updates = $this->getPopulateOption('wp_update_core') == 'disable_core_updates';
115
- //$plugins_updates = $this->getPopulateOption('plugin_updates') == 'disable_plugin_updates';
116
- $themes_updates = $this->getPopulateOption('theme_updates') == 'disable_theme_updates';
117
-
118
- if( !is_object($event) || empty($event->hook) ) {
119
- return $event;
120
- }
121
 
122
- switch( $event->hook ) {
123
- case 'wp_version_check':
124
- $event = $core_updates ? false : $event;
125
- break;
126
-
127
- case 'wp_update_themes':
128
- $event = $themes_updates ? false : $event;
129
- break;
130
- case 'wp_maybe_auto_update':
131
- $event = $core_updates ? false : $event;
132
- break;
133
- }
 
 
 
 
 
 
 
134
 
135
- return $event;
 
 
 
 
136
  }
137
 
138
  /**
139
- * Enables plugin automatic updates on an individual basis.
140
- *
141
- * @param bool $update Whether the item has automatic updates enabled
142
- * @param object $item Object holding the asset to be updated
143
- * @return bool True of automatic updates enabled, false if not
144
  */
145
- public function pluginsAutoUpdate($update, $item)
146
- {
147
- $slug_parts = explode('/', $item->plugin);
148
- $actual_slug = array_shift($slug_parts);
149
 
150
- $pluginFilters = new WUPM_PluginFilters($this->plugin);
151
- $filters = $pluginFilters->getFilters(array($actual_slug));
152
 
153
- if( !empty($filters) ) {
154
- if( isset($filters['disable_auto_updates'][$actual_slug]) and $filters['disable_auto_updates'][$actual_slug] ) {
155
- return false;
156
- }
157
- }
 
 
 
 
 
 
158
 
159
- return true;
 
160
  }
161
 
162
- /**
163
- * Disables plugin updates on an individual basis.
164
- *
165
- * @param object $plugins Plugins that may have update notifications
166
- * @return object Updated plugins list with updates
167
- */
168
- public function disablePluginNotifications($plugins)
169
- {
170
- if( !isset($plugins->response) || empty($plugins->response) ) {
171
- return $plugins;
172
- }
 
 
 
 
173
 
174
- $pluginFilters = new WUPM_PluginFilters($this->plugin);
 
 
 
 
 
 
 
 
175
 
176
- foreach((array)$plugins->response as $slug => $plugin) {
177
- $slug_parts = explode('/', $slug);
178
- $actual_slug = array_shift($slug_parts);
 
 
179
 
180
- $filters = $pluginFilters->getPlugins(array($actual_slug));
 
181
 
182
- if( isset($filters['disable_updates'][$actual_slug]) && $filters['disable_updates'][$actual_slug] ) {
183
- unset($plugins->response[$slug]);
184
- }
 
 
 
185
  }
 
186
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  return $plugins;
188
  }
189
 
190
- /**
191
- * Disables plugin http requests on an individual basis.
192
- *
193
- * @param array $r Request array
194
- * @param string $url URL requested
195
- * @return array Updated Request array
196
- */
197
- public function httpRequestArgsRemovePlugins($r, $url)
198
- {
199
- if( !is_string($url) || 0 !== strpos($url, 'https://api.wordpress.org/plugins/update-check/1.1/') ) {
200
- return $r;
201
  }
 
 
 
 
202
 
203
- if( isset($r['body']['plugins']) ) {
204
- $r_plugins = json_decode($r['body']['plugins'], true);
205
- $pluginFilters = new WUPM_PluginFilters($this->plugin);
 
 
 
 
 
 
 
 
 
206
 
207
- if( isset($r_plugins['plugins']) && !empty($r_plugins['plugins']) ) {
208
- foreach($r_plugins['plugins'] as $slug => $plugin) {
209
- $slug_parts = explode('/', $slug);
210
- $actual_slug = array_shift($slug_parts);
211
 
212
- $filters = $pluginFilters->getPlugins(array($actual_slug));
 
 
 
213
 
214
- if( isset($filters['disable_updates'][$actual_slug]) and $filters['disable_updates'][$actual_slug] ) {
215
- unset($r_plugins['plugins'][$slug]);
216
 
217
- if( false !== $key = array_search($slug, $r_plugins['active']) ) {
218
- unset($r_plugins['active'][$key]);
219
- $r_plugins['active'] = array_values($r_plugins['active']);
220
- }
 
 
221
  }
222
  }
223
  }
224
- $r['body']['plugins'] = json_encode($r_plugins);
225
  }
226
-
227
- return $r;
228
  }
229
 
 
 
230
 
231
- public function disableAllCoreUpdates()
232
- {
233
- add_action('admin_init', array($this, 'adminInitForCore'));
234
- add_action('admin_init', array($this, 'disableUpdateNag'));
235
-
236
- /*
237
- * Disable All Automatic Updates
238
- * 3.7+
239
- *
240
- * @author sLa NGjI's @ slangji.wordpress.com
241
- */
242
- add_filter('automatic_updater_disabled', '__return_true');
243
- add_filter('allow_minor_auto_core_updates', '__return_false');
244
- add_filter('allow_major_auto_core_updates', '__return_false');
245
- add_filter('allow_dev_auto_core_updates', '__return_false');
246
- add_filter('auto_update_core', '__return_false');
247
- add_filter('wp_auto_update_core', '__return_false');
248
- add_filter('auto_core_update_send_email', '__return_false');
249
- add_filter('send_core_update_notification_email', '__return_false');
250
- add_filter('automatic_updates_send_debug_email', '__return_false');
251
- add_filter('automatic_updates_is_vcs_checkout', '__return_true');
252
- }
253
 
254
- /**
255
- * callback for action "admin_init"
256
- * remove update nag in admin pages
 
 
 
 
 
 
257
  */
258
- function disableUpdateNag()
259
- {
260
- remove_action('admin_notices', 'update_nag', 3);
261
- remove_action('admin_notices', 'maintenance_nag');
262
- remove_action('network_admin_notices', 'update_nag', 3);
263
- }
 
 
 
 
 
 
 
 
 
264
 
265
- /**
266
- * Initialize and load the plugin stuff
267
- * @author scripts@schloebe.de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
268
  */
269
- function adminInitForPlugins()
270
- {
271
- /*
272
- * 2.8 to 3.0
273
- */
274
- remove_action('load-plugins.php', 'wp_update_plugins');
275
- remove_action('load-update.php', 'wp_update_plugins');
276
- remove_action('admin_init', '_maybe_update_plugins');
277
- remove_action('wp_update_plugins', 'wp_update_plugins');
278
- wp_clear_scheduled_hook('wp_update_plugins');
279
-
280
- /*
281
- * 3.0
282
- */
283
- remove_action('load-update-core.php', 'wp_update_plugins');
284
- wp_clear_scheduled_hook('wp_update_plugins');
285
- }
286
 
287
- function adminInitForThemes()
288
- {
289
- /*
290
- * 2.8 to 3.0
291
- */
292
- remove_action('load-themes.php', 'wp_update_themes');
293
- remove_action('load-update.php', 'wp_update_themes');
294
- remove_action('admin_init', '_maybe_update_themes');
295
- remove_action('wp_update_themes', 'wp_update_themes');
296
- wp_clear_scheduled_hook('wp_update_themes');
297
-
298
- /*
299
- * 3.0
300
- */
301
- remove_action('load-update-core.php', 'wp_update_themes');
302
- wp_clear_scheduled_hook('wp_update_themes');
303
- }
304
 
305
- /**
306
- * Initialize and load the plugin stuff
307
- * @author scripts@schloebe.de
 
 
 
 
 
308
  */
309
- function adminInitForCore()
310
- {
311
- /*
312
- * 2.8 to 3.0
313
- */
314
- remove_action('wp_version_check', 'wp_version_check');
315
- remove_action('admin_init', '_maybe_update_core');
316
- wp_clear_scheduled_hook('wp_version_check');
317
-
318
- /*
319
- * 3.7+
320
- */
321
- remove_action('wp_maybe_auto_update', 'wp_maybe_auto_update');
322
- remove_action('admin_init', 'wp_maybe_auto_update');
323
- remove_action('admin_init', 'wp_auto_update_core');
324
- wp_clear_scheduled_hook('wp_maybe_auto_update');
325
- }
326
 
327
- public function lastCheckedNow($transient)
328
- {
329
- global $wp_version;
330
 
331
- include ABSPATH . WPINC . '/version.php';
332
- $current = new stdClass;
333
- $current->updates = array();
334
- $current->version_checked = $wp_version;
335
- $current->last_checked = time();
 
 
 
336
 
337
- return $current;
 
 
 
 
 
 
 
 
 
 
 
 
 
338
  }
339
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
 
 
 
 
 
 
 
2
 
3
+ /**
4
+ * This class configures the parameters seo
5
+ *
6
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
7
+ * @copyright (c) 2017 Webraftic Ltd
8
+ * @version 1.0
9
+ */
10
 
11
+ // Exit if accessed directly
12
+ if ( ! defined( 'ABSPATH' ) ) {
13
+ exit;
14
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
+ require_once WUPM_PLUGIN_DIR . '/admin/includes/class.plugin-filters.php';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
+ class WUPM_ConfigUpdates extends Wbcr_FactoryClearfy206_Configurate {
 
 
19
 
20
+ public function registerActionsAndFilters() {
21
+ /**
22
+ * Plugin updates
23
+ */
24
+ $plugins_update = $this->getPopulateOption( 'plugin_updates' );
25
+
26
+ switch ( $this->getPopulateOption( 'plugin_updates' ) ) {
27
+ case 'disable_plugin_updates':
28
+ // and disable version check
29
+ add_filter( 'site_transient_update_plugins', [ $this, 'lastCheckedNow' ], 50 );
30
+ add_action( 'admin_init', [ $this, 'adminInitForPlugins' ] );
31
+ add_filter( 'auto_update_plugin', '__return_false' );
32
+ break;
33
+ case 'enable_plugin_auto_updates':
34
+ // exclude some plugins in update list
35
+ add_filter( 'auto_update_plugin', [ $this, 'pluginsAutoUpdate' ], 50, 2 );
36
+ break;
37
+ }
38
 
39
+ if ( $plugins_update != 'disable_plugin_updates' ) {
40
+ add_filter( 'site_transient_update_plugins', [ $this, 'disablePluginNotifications' ], 50 );
41
+ add_filter( 'http_request_args', [ $this, 'httpRequestArgsRemovePlugins' ], 5, 2 );
42
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
 
44
+ /**
45
+ * Theme updates
46
+ */
47
+ switch ( $this->getPopulateOption( 'theme_updates' ) ) {
48
+ case 'disable_theme_updates':
49
+ add_filter( 'site_transient_update_themes', [ $this, 'lastCheckedNow' ], 50 );
50
+ add_action( 'admin_init', [ $this, 'adminInitForThemes' ] );
51
+ add_filter( 'auto_update_theme', '__return_false' );
52
+ break;
53
+ case 'enable_theme_auto_updates':
54
+ add_filter( 'auto_update_theme', '__return_true', 1 );
55
+ break;
56
+ }
57
 
58
+ /**
59
+ * disable wp default translation update
60
+ */
 
 
 
61
 
62
+ if ( $this->getPopulateOption( 'auto_tran_update' ) ) {
63
+ add_filter( 'auto_update_translation', '__return_false', 1 );
64
  }
65
 
66
  /**
67
+ * control WP Auto core update
 
 
68
  */
 
 
 
 
 
 
 
 
 
69
 
70
+ switch ( $this->getPopulateOption( 'wp_update_core' ) ) {
71
+ case 'disable_core_updates':
72
+ $this->disableAllCoreUpdates();
73
+ break;
74
+ case 'disable_core_auto_updates':
75
+ add_filter( 'allow_major_auto_core_updates', '__return_false' );
76
+ add_filter( 'allow_dev_auto_core_updates', '__return_false' );
77
+ add_filter( 'allow_minor_auto_core_updates', '__return_false' );
78
+ break;
79
+ case 'major':
80
+ add_filter( 'allow_major_auto_core_updates', '__return_true' );
81
+ break;
82
+ case 'development':
83
+ add_filter( 'allow_dev_auto_core_updates', '__return_true' );
84
+ break;
85
+ default:
86
+ add_filter( 'allow_minor_auto_core_updates', '__return_true' );
87
+ break;
88
+ }
89
 
90
+ /**
91
+ * disable wp default translation update
92
+ */
93
+ if ( $this->getPopulateOption( 'enable_update_vcs' ) ) {
94
+ add_filter( 'automatic_updates_is_vcs_checkout', '__return_false', 1 );
95
  }
96
 
97
  /**
98
+ * disable updates nags for all users except admin
 
 
 
 
99
  */
100
+ if ( $this->getPopulateOption( 'updates_nags_only_for_admin' ) && ! current_user_can( 'update_core' ) ) {
101
+ remove_action( 'admin_notices', 'update_nag', 3 );
102
+ }
 
103
 
104
+ add_action( 'schedule_event', [ $this, 'filterCronEvents' ] );
105
+ }
106
 
107
+ /**
108
+ * Filter cron events
109
+ *
110
+ * @param $event
111
+ *
112
+ * @return bool
113
+ */
114
+ public function filterCronEvents( $event ) {
115
+ $core_updates = $this->getPopulateOption( 'wp_update_core' ) == 'disable_core_updates';
116
+ //$plugins_updates = $this->getPopulateOption('plugin_updates') == 'disable_plugin_updates';
117
+ $themes_updates = $this->getPopulateOption( 'theme_updates' ) == 'disable_theme_updates';
118
 
119
+ if ( ! is_object( $event ) || empty( $event->hook ) ) {
120
+ return $event;
121
  }
122
 
123
+ switch ( $event->hook ) {
124
+ case 'wp_version_check':
125
+ $event = $core_updates ? false : $event;
126
+ break;
127
+
128
+ case 'wp_update_themes':
129
+ $event = $themes_updates ? false : $event;
130
+ break;
131
+ case 'wp_maybe_auto_update':
132
+ $event = $core_updates ? false : $event;
133
+ break;
134
+ }
135
+
136
+ return $event;
137
+ }
138
 
139
+ /**
140
+ * Enables plugin automatic updates on an individual basis.
141
+ *
142
+ * @param bool $update Whether the item has automatic updates enabled
143
+ * @param object $item Object holding the asset to be updated
144
+ *
145
+ * @return bool True of automatic updates enabled, false if not
146
+ */
147
+ public function pluginsAutoUpdate( $update, $item ) {
148
 
149
+ // Fix php warnings UM-29:
150
+ // Some users submit reports on php notifications "Undefined property: stdClass::$plugin"
151
+ if ( ! is_object( $item ) || ! isset( $item->plugin ) ) {
152
+ return false;
153
+ }
154
 
155
+ $slug_parts = explode( '/', $item->plugin );
156
+ $actual_slug = array_shift( $slug_parts );
157
 
158
+ $pluginFilters = new WUPM_PluginFilters( $this->plugin );
159
+ $filters = $pluginFilters->getFilters( [ $actual_slug ] );
160
+
161
+ if ( ! empty( $filters ) ) {
162
+ if ( isset( $filters['disable_auto_updates'][ $actual_slug ] ) and $filters['disable_auto_updates'][ $actual_slug ] ) {
163
+ return false;
164
  }
165
+ }
166
 
167
+ return true;
168
+ }
169
+
170
+ /**
171
+ * Disables plugin updates on an individual basis.
172
+ *
173
+ * @param object $plugins Plugins that may have update notifications
174
+ *
175
+ * @return object Updated plugins list with updates
176
+ */
177
+ public function disablePluginNotifications( $plugins ) {
178
+ if ( ! isset( $plugins->response ) || empty( $plugins->response ) ) {
179
  return $plugins;
180
  }
181
 
182
+ $pluginFilters = new WUPM_PluginFilters( $this->plugin );
183
+
184
+ foreach ( (array) $plugins->response as $slug => $plugin ) {
185
+ $slug_parts = explode( '/', $slug );
186
+ $actual_slug = array_shift( $slug_parts );
187
+
188
+ $filters = $pluginFilters->getPlugins( [ $actual_slug ] );
189
+
190
+ if ( isset( $filters['disable_updates'][ $actual_slug ] ) && $filters['disable_updates'][ $actual_slug ] ) {
191
+ unset( $plugins->response[ $slug ] );
 
192
  }
193
+ }
194
+
195
+ return $plugins;
196
+ }
197
 
198
+ /**
199
+ * Disables plugin http requests on an individual basis.
200
+ *
201
+ * @param array $r Request array
202
+ * @param string $url URL requested
203
+ *
204
+ * @return array Updated Request array
205
+ */
206
+ public function httpRequestArgsRemovePlugins( $r, $url ) {
207
+ if ( ! is_string( $url ) || 0 !== strpos( $url, 'https://api.wordpress.org/plugins/update-check/1.1/' ) ) {
208
+ return $r;
209
+ }
210
 
211
+ if ( isset( $r['body']['plugins'] ) ) {
212
+ $r_plugins = json_decode( $r['body']['plugins'], true );
213
+ $pluginFilters = new WUPM_PluginFilters( $this->plugin );
 
214
 
215
+ if ( isset( $r_plugins['plugins'] ) && ! empty( $r_plugins['plugins'] ) ) {
216
+ foreach ( $r_plugins['plugins'] as $slug => $plugin ) {
217
+ $slug_parts = explode( '/', $slug );
218
+ $actual_slug = array_shift( $slug_parts );
219
 
220
+ $filters = $pluginFilters->getPlugins( [ $actual_slug ] );
 
221
 
222
+ if ( isset( $filters['disable_updates'][ $actual_slug ] ) and $filters['disable_updates'][ $actual_slug ] ) {
223
+ unset( $r_plugins['plugins'][ $slug ] );
224
+
225
+ if ( false !== $key = array_search( $slug, $r_plugins['active'] ) ) {
226
+ unset( $r_plugins['active'][ $key ] );
227
+ $r_plugins['active'] = array_values( $r_plugins['active'] );
228
  }
229
  }
230
  }
 
231
  }
232
+ $r['body']['plugins'] = json_encode( $r_plugins );
 
233
  }
234
 
235
+ return $r;
236
+ }
237
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
238
 
239
+ public function disableAllCoreUpdates() {
240
+ add_action( 'admin_init', [ $this, 'adminInitForCore' ] );
241
+ add_action( 'admin_init', [ $this, 'disableUpdateNag' ] );
242
+
243
+ /*
244
+ * Disable All Automatic Updates
245
+ * 3.7+
246
+ *
247
+ * @author sLa NGjI's @ slangji.wordpress.com
248
  */
249
+ add_filter( 'automatic_updater_disabled', '__return_true' );
250
+ add_filter( 'allow_minor_auto_core_updates', '__return_false' );
251
+ add_filter( 'allow_major_auto_core_updates', '__return_false' );
252
+ add_filter( 'allow_dev_auto_core_updates', '__return_false' );
253
+ add_filter( 'auto_update_core', '__return_false' );
254
+ add_filter( 'wp_auto_update_core', '__return_false' );
255
+ add_filter( 'auto_core_update_send_email', '__return_false' );
256
+ add_filter( 'send_core_update_notification_email', '__return_false' );
257
+ add_filter( 'automatic_updates_send_debug_email', '__return_false' );
258
+ add_filter( 'automatic_updates_is_vcs_checkout', '__return_true' );
259
+
260
+ // change update nag
261
+ add_filter( 'wp_get_update_data', [ $this, 'updateCounter' ], 10, 2 );
262
+ add_filter( 'site_transient_update_core', [ $this, 'hideCoreUpdateForm' ], 10, 2 );
263
+ }
264
 
265
+ /**
266
+ * callback for action "admin_init"
267
+ * remove update nag in admin pages
268
+ */
269
+ function disableUpdateNag() {
270
+ remove_action( 'admin_notices', 'update_nag', 3 );
271
+ remove_action( 'admin_notices', 'maintenance_nag' );
272
+ remove_action( 'network_admin_notices', 'update_nag', 3 );
273
+ }
274
+
275
+ /**
276
+ * Initialize and load the plugin stuff
277
+ *
278
+ * @author scripts@schloebe.de
279
+ */
280
+ function adminInitForPlugins() {
281
+ /*
282
+ * 2.8 to 3.0
283
  */
284
+ remove_action( 'load-plugins.php', 'wp_update_plugins' );
285
+ remove_action( 'load-update.php', 'wp_update_plugins' );
286
+ remove_action( 'admin_init', '_maybe_update_plugins' );
287
+ remove_action( 'wp_update_plugins', 'wp_update_plugins' );
288
+ wp_clear_scheduled_hook( 'wp_update_plugins' );
289
+
290
+ /*
291
+ * 3.0
292
+ */
293
+ remove_action( 'load-update-core.php', 'wp_update_plugins' );
294
+ wp_clear_scheduled_hook( 'wp_update_plugins' );
295
+ }
 
 
 
 
 
296
 
297
+ function adminInitForThemes() {
298
+ /*
299
+ * 2.8 to 3.0
300
+ */
301
+ remove_action( 'load-themes.php', 'wp_update_themes' );
302
+ remove_action( 'load-update.php', 'wp_update_themes' );
303
+ remove_action( 'admin_init', '_maybe_update_themes' );
304
+ remove_action( 'wp_update_themes', 'wp_update_themes' );
305
+ wp_clear_scheduled_hook( 'wp_update_themes' );
306
+
307
+ /*
308
+ * 3.0
309
+ */
310
+ remove_action( 'load-update-core.php', 'wp_update_themes' );
311
+ wp_clear_scheduled_hook( 'wp_update_themes' );
312
+ }
 
313
 
314
+ /**
315
+ * Initialize and load the plugin stuff
316
+ *
317
+ * @author scripts@schloebe.de
318
+ */
319
+ function adminInitForCore() {
320
+ /*
321
+ * 2.8 to 3.0
322
  */
323
+ remove_action( 'wp_version_check', 'wp_version_check' );
324
+ remove_action( 'admin_init', '_maybe_update_core' );
325
+ wp_clear_scheduled_hook( 'wp_version_check' );
326
+
327
+ /*
328
+ * 3.7+
329
+ */
330
+ remove_action( 'wp_maybe_auto_update', 'wp_maybe_auto_update' );
331
+ remove_action( 'admin_init', 'wp_maybe_auto_update' );
332
+ remove_action( 'admin_init', 'wp_auto_update_core' );
333
+ wp_clear_scheduled_hook( 'wp_maybe_auto_update' );
334
+ }
 
 
 
 
 
335
 
336
+ public function lastCheckedNow( $transient ) {
337
+ global $wp_version;
 
338
 
339
+ include ABSPATH . WPINC . '/version.php';
340
+ $current = new stdClass;
341
+ $current->updates = [];
342
+ $current->version_checked = $wp_version;
343
+ $current->last_checked = time();
344
+
345
+ return $current;
346
+ }
347
 
348
+ /**
349
+ * callback for filter wp_get_update_data
350
+ * If disableAllCoreUpdates recalc the update badge
351
+ *
352
+ * @param $update_data
353
+ * @param $titles
354
+ *
355
+ * @return mixed $update_data
356
+ */
357
+ function updateCounter( $update_data, $titles ) {
358
+ if ( $update_data['counts']['wordpress'] > 0 ) {
359
+ $new_num = $update_data['counts']['total'] = $update_data['counts']['total'] - $update_data['counts']['wordpress'];
360
+ preg_replace( '/[0-9]+/', $new_num, $titles['wordpress'] );
361
+ $update_data['counts']['wordpress'] = 0;
362
  }
363
+
364
+ return $update_data;
365
+ }
366
+
367
+ /** Modify data about core available updates
368
+ * Hide update buttons on update page and dashboard home page
369
+ *
370
+ * @param $val
371
+ * @param $transient
372
+ *
373
+ * @return mixed $val
374
+ */
375
+ function hideCoreUpdateForm( $val, $transient ) {
376
+ if ( is_object( $val ) ) {
377
+ $val->updates = [];
378
+ }
379
+
380
+ return $val;
381
+ }
382
+ }
components/updates-manager/languages/webcraftic-updates-manager-es_ES.mo ADDED
Binary file
components/updates-manager/languages/webcraftic-updates-manager-es_ES.po ADDED
@@ -0,0 +1,478 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of Plugins - Clearfy in Spanish (Spain)
2
+ # This file is distributed under the same license as the Plugins - Clearfy – WordPress optimization plugin and disable ultimate tweaker - Development (trunk) package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: \n"
6
+ "POT-Creation-Date: 2019-04-28 06:31+0300\n"
7
+ "PO-Revision-Date: 2019-04-28 06:31+0300\n"
8
+ "Last-Translator: \n"
9
+ "Language-Team: \n"
10
+ "Language: es\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
15
+ "X-Generator: Poedit 2.1.1\n"
16
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
17
+ "X-Generator: Poedit 2.1.1\n"
18
+ "X-Poedit-Basepath: ..\n"
19
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
20
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
21
+ "X-Poedit-SourceCharset: UTF-8\n"
22
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
23
+ "X-Poedit-SearchPath-0: .\n"
24
+ "X-Poedit-SearchPathExcluded-0: libs\n"
25
+ "X-Poedit-SearchPathExcluded-1: components\n"
26
+ "X-Poedit-SearchPathExcluded-2: cache\n"
27
+
28
+ #: admin/ajax/change-flag.php:26
29
+ msgid "Required arguments of slug, flag is empty!"
30
+ msgstr "Argumentos requeridos de slug, bandera está vacía!"
31
+
32
+ #: admin/ajax/change-flag.php:38
33
+ #, php-format
34
+ msgid "Method %s is not found!"
35
+ msgstr "¡El método %s no se encuentra!"
36
+
37
+ #: admin/boot.php:55
38
+ #, php-format
39
+ msgid ""
40
+ "We found that you have the plugin %s installed. The functions of this plugin "
41
+ "already exist in %s. Please deactivate plugin %s to avoid conflicts between "
42
+ "plugins' functions."
43
+ msgstr ""
44
+ "Usted tiene el plugin %s instalado. Las funciones de este complemento ya "
45
+ "existen en %s. Desactive el complemento %s para evitar conflictos entre las "
46
+ "funciones ambos plugin."
47
+
48
+ #: admin/boot.php:56
49
+ #, php-format
50
+ msgid ""
51
+ "If you do not want to deactivate the plugin %s for some reason, we strongly "
52
+ "recommend do not use the same plugins' functions at the same time!"
53
+ msgstr ""
54
+ "Si no desea desactivar el plugin %s por algún motivo, le recomendamos que no "
55
+ "utilice las mismas funciones de ambos plugin al mismo tiempo."
56
+
57
+ #: admin/boot.php:100
58
+ msgid "Disable plugin updates"
59
+ msgstr "Deshabilitar actualizaciones de plugin"
60
+
61
+ #: admin/boot.php:106
62
+ msgid "Disable theme updates"
63
+ msgstr "Deshabilitar actualizaciones de temas"
64
+
65
+ #: admin/boot.php:112 admin/pages/updates.php:128
66
+ msgid "Disable Automatic Translation Updates"
67
+ msgstr "Deshabilitar actualizaciones de traducción automática"
68
+
69
+ #: admin/boot.php:117
70
+ msgid "Disable wordPress core updates"
71
+ msgstr "Deshabilitar las actualizaciones del Core WordPress."
72
+
73
+ #: admin/boot.php:123 admin/pages/updates.php:180
74
+ msgid "Enable updates for VCS Installations"
75
+ msgstr "Habilitar actualizaciones para instalaciones VCS"
76
+
77
+ #: admin/boot.php:128
78
+ msgid "Plugin filters"
79
+ msgstr "Filtros de plugin"
80
+
81
+ #: admin/boot.php:133 admin/pages/updates.php:190
82
+ msgid "Updates nags only for Admin"
83
+ msgstr "Actualizaciones de nags solo para admin"
84
+
85
+ #: admin/boot.php:138 admin/pages/updates.php:238 admin/pages/updates.php:245
86
+ msgid "Core notifications"
87
+ msgstr "Notificaciones genéricas"
88
+
89
+ #: admin/boot.php:143
90
+ msgid "Notify me when update successful installed"
91
+ msgstr "Notificarme cuando la actualización sea exitosa"
92
+
93
+ #: admin/boot.php:148 admin/pages/updates.php:229
94
+ msgid "Email address"
95
+ msgstr "Dirección de correo electrónico"
96
+
97
+ #: admin/boot.php:160
98
+ msgid "One click disable all updates"
99
+ msgstr "Deshabilitar todas las actualizaciones con un click"
100
+
101
+ #: admin/boot.php:181
102
+ msgid "Get ultimate plugin free"
103
+ msgstr "Obtener el ultimate plugin gratis"
104
+
105
+ #: admin/boot.php:230 admin/boot.php:275
106
+ msgid "Update manager"
107
+ msgstr "Gestor de actualizaciones"
108
+
109
+ #: admin/boot.php:238
110
+ msgid "Auto-update disabled"
111
+ msgstr "Actualización automática deshabilitada"
112
+
113
+ #: admin/boot.php:239
114
+ msgid "Auto-update enabled"
115
+ msgstr "Actualización automática habilitada"
116
+
117
+ #: admin/boot.php:240
118
+ msgid "Update disabled"
119
+ msgstr "Actualización deshabilitada"
120
+
121
+ #: admin/boot.php:241
122
+ msgid "Translation update disabled"
123
+ msgstr "Actualización de traducción desactivada"
124
+
125
+ #: admin/pages/advanced.php:43
126
+ msgid "Advanced"
127
+ msgstr "Avanzado"
128
+
129
+ #: admin/pages/advanced.php:71
130
+ msgid "Please, wait 90 sec. to see the forced automatic update result."
131
+ msgstr ""
132
+ "Por favor, espera 90 Seg. para ver resultados de la actualizacion automática "
133
+ "forzada."
134
+
135
+ #: admin/pages/advanced.php:81
136
+ msgid "Force Automatic Updates"
137
+ msgstr "Forzar actualizaciones automáticas"
138
+
139
+ #: admin/pages/advanced.php:83
140
+ msgid ""
141
+ "This will attempt to force automatic updates. This is useful for debugging."
142
+ msgstr ""
143
+ "Esto intentará forzar actualizaciones automáticas. Esto es útil para la "
144
+ "depuración."
145
+
146
+ #: admin/pages/advanced.php:84
147
+ msgid "Force update"
148
+ msgstr "Forzar actualización"
149
+
150
+ #: admin/pages/plugins.php:72
151
+ msgid "Plugins"
152
+ msgstr "Plugins"
153
+
154
+ #: admin/pages/plugins.php:91
155
+ msgid ""
156
+ "- To disable updates individually choose the “Manual or automatic plugin "
157
+ "updates” option then save settings and comeback to this page."
158
+ msgstr ""
159
+ "- Para deshabilitar las actualizaciones individualmente, elija la opción "
160
+ "\"Actualizaciones de plugins manuales o automáticas\", luego guarde las "
161
+ "configuraciones y vuelva a esta página."
162
+
163
+ #: admin/pages/plugins.php:95
164
+ msgid ""
165
+ "- To configure plugin auto updates individually, choose the “Enable auto "
166
+ "updates” option then save settings and comeback to this page."
167
+ msgstr ""
168
+ "- Para configurar las actualizaciones automáticas de plugin de forma "
169
+ "individual, elija la opción \"Habilitar actualizaciones automáticas\" y "
170
+ "luego guarde la configuración y vuelva a esta página."
171
+
172
+ #: admin/pages/plugins.php:326
173
+ msgid "Plugins list"
174
+ msgstr "Lista de plugins"
175
+
176
+ #: admin/pages/plugins.php:329
177
+ msgid "This page you can individually disable plugin updates and auto updates."
178
+ msgstr ""
179
+ "Esta página puede deshabilitar individualmente las actualizaciones de "
180
+ "complementos y actualizaciones automáticas."
181
+
182
+ #: admin/pages/plugins.php:345 admin/pages/themes.php:321
183
+ msgid "Bulk actions"
184
+ msgstr "Acciones a granel"
185
+
186
+ #: admin/pages/plugins.php:346 admin/pages/plugins.php:366
187
+ #: admin/pages/themes.php:322 admin/pages/themes.php:340
188
+ #: admin/pages/updates.php:102 admin/pages/updates.php:117
189
+ #: admin/pages/updates.php:139
190
+ msgid "Disable updates"
191
+ msgstr "Deshabilitar actualizaciones"
192
+
193
+ #: admin/pages/plugins.php:347 admin/pages/themes.php:323
194
+ msgid "Enable updates"
195
+ msgstr "Activar actualizaciones"
196
+
197
+ #: admin/pages/plugins.php:348 admin/pages/themes.php:324
198
+ msgid "Enable auto-updates"
199
+ msgstr "Activar auto actualizaciones"
200
+
201
+ #: admin/pages/plugins.php:349 admin/pages/themes.php:325
202
+ msgid "Disable auto-updates"
203
+ msgstr "Deshabilitar las actualizaciones automáticas"
204
+
205
+ #: admin/pages/plugins.php:350 admin/pages/themes.php:326
206
+ msgid "Disable translation updates"
207
+ msgstr "Deshabilitar actualizaciones de traducción"
208
+
209
+ #: admin/pages/plugins.php:351 admin/pages/themes.php:327
210
+ msgid "Enable translation updates"
211
+ msgstr "Habilitar actualizaciones de traducción"
212
+
213
+ #: admin/pages/plugins.php:352 admin/pages/plugins.php:375
214
+ msgid "Hide plugin"
215
+ msgstr "Ocultar plugin"
216
+
217
+ #: admin/pages/plugins.php:353
218
+ msgid "Show plugin"
219
+ msgstr "Mostrar plugin"
220
+
221
+ #: admin/pages/plugins.php:355 admin/pages/themes.php:329
222
+ msgid "Apply"
223
+ msgstr "Aplicar"
224
+
225
+ #: admin/pages/plugins.php:364
226
+ msgid "Plugin"
227
+ msgstr "Plugin"
228
+
229
+ #: admin/pages/plugins.php:369 admin/pages/themes.php:343
230
+ msgid "Auto-updates"
231
+ msgstr "Actualizaciones automáticas"
232
+
233
+ #: admin/pages/plugins.php:372 admin/pages/themes.php:346
234
+ msgid "Translation updates"
235
+ msgstr "Actualizaciones de traducción"
236
+
237
+ #: admin/pages/plugins.php:441 admin/pages/themes.php:396
238
+ msgid "Select"
239
+ msgstr "Seleccionar"
240
+
241
+ #: admin/pages/plugins.php:469 admin/pages/plugins.php:486
242
+ #: admin/pages/plugins.php:502 admin/pages/plugins.php:518
243
+ #: admin/pages/themes.php:420 admin/pages/themes.php:439
244
+ #: admin/pages/themes.php:458
245
+ msgid "On"
246
+ msgstr "On"
247
+
248
+ #: admin/pages/plugins.php:470 admin/pages/plugins.php:487
249
+ #: admin/pages/plugins.php:503 admin/pages/plugins.php:519
250
+ #: admin/pages/themes.php:421 admin/pages/themes.php:440
251
+ #: admin/pages/themes.php:459
252
+ msgid "Off"
253
+ msgstr "Off"
254
+
255
+ #: admin/pages/themes.php:69
256
+ msgid "Themes"
257
+ msgstr "Plantillas"
258
+
259
+ #: admin/pages/themes.php:88
260
+ msgid ""
261
+ "- To disable updates individually choose the “Manual or automatic theme "
262
+ "updates” option then save settings and comeback to this page."
263
+ msgstr ""
264
+ "- Para deshabilitar las actualizaciones por separado, elija la opción "
265
+ "“Actualizaciones de temas manuales o automáticas”, luego guarde las "
266
+ "configuraciones y vuelva a esta página."
267
+
268
+ #: admin/pages/themes.php:92
269
+ msgid ""
270
+ "- To configure theme auto updates individually, choose the “Enable auto "
271
+ "updates” option then save settings and comeback to this page."
272
+ msgstr ""
273
+ "- Para configurar las actualizaciones automáticas del tema individualmente, "
274
+ "elija la opción \"Habilitar actualizaciones automáticas\" y luego guarde la "
275
+ "configuración y vuelva a esta página."
276
+
277
+ #: admin/pages/themes.php:302
278
+ msgid "Themes list"
279
+ msgstr "Listado de Plantillas"
280
+
281
+ #: admin/pages/themes.php:305
282
+ msgid "This page you can individually disable theme updates and auto updates."
283
+ msgstr ""
284
+ "En esta página puedes deshabilitar individualmente las actualizaciones de "
285
+ "temas y actualizaciones automáticas."
286
+
287
+ #: admin/pages/themes.php:338
288
+ msgid "Theme"
289
+ msgstr "Plantilla"
290
+
291
+ #: admin/pages/updates.php:43
292
+ msgid "Updates manager"
293
+ msgstr "Gestor de actualizaciones"
294
+
295
+ #: admin/pages/updates.php:44
296
+ msgid "Manage all site updates"
297
+ msgstr "Administrar todas las actualizaciones del sitio"
298
+
299
+ #: admin/pages/updates.php:57
300
+ msgid "Updates"
301
+ msgstr "Actualizaciones"
302
+
303
+ #: admin/pages/updates.php:57
304
+ msgid "General"
305
+ msgstr "General"
306
+
307
+ #: admin/pages/updates.php:91
308
+ msgid "General settings for WordPress, plugins and themes updates"
309
+ msgstr ""
310
+ "Configuraciones generales para WordPress, complementos y actualizaciones de "
311
+ "temas."
312
+
313
+ #: admin/pages/updates.php:91
314
+ msgid ""
315
+ "This page, you can enable or disable automatic updates. To test the "
316
+ "automatic updates, click the \"Advanced\" tab."
317
+ msgstr ""
318
+ "En esta página, puede habilitar o deshabilitar actualizaciones automáticas. "
319
+ "Para probar las actualizaciones automáticas, haga clic en la pestaña "
320
+ "\"Avanzado \"."
321
+
322
+ #: admin/pages/updates.php:98
323
+ msgid "Plugin Updates"
324
+ msgstr "Actualizaciones de plugins"
325
+
326
+ #: admin/pages/updates.php:100 admin/pages/updates.php:115
327
+ msgid "Manual updates"
328
+ msgstr "Actualizaciones manuales"
329
+
330
+ #: admin/pages/updates.php:101 admin/pages/updates.php:116
331
+ msgid "Enable auto updates"
332
+ msgstr "Habilitar actualizaciones automáticas"
333
+
334
+ #: admin/pages/updates.php:105
335
+ msgid ""
336
+ "You can disable all plugin updates or choose manual or automatic update mode."
337
+ msgstr ""
338
+ "Puede deshabilitar todas las actualizaciones de plugins o elegir el modo de "
339
+ "actualización manual o automática."
340
+
341
+ #: admin/pages/updates.php:113
342
+ msgid "Theme Updates"
343
+ msgstr "Actualizaciones del tema"
344
+
345
+ #: admin/pages/updates.php:120
346
+ msgid ""
347
+ "You can disable all themes updates or choose manual or automatic update mode."
348
+ msgstr ""
349
+ "Puede desactivar todas las actualizaciones de temas o elegir el modo de "
350
+ "actualización manual o automática."
351
+
352
+ #: admin/pages/updates.php:137
353
+ msgid "WordPress Core Updates"
354
+ msgstr "Actualizaciones del Core WordPress"
355
+
356
+ #: admin/pages/updates.php:140
357
+ msgid "Disable auto updates"
358
+ msgstr "Deshabilitar actualizaciones automáticas"
359
+
360
+ #: admin/pages/updates.php:143
361
+ msgid "Allow minor auto updates"
362
+ msgstr "Permitir actualizaciones automáticas menores"
363
+
364
+ #: admin/pages/updates.php:147
365
+ msgid "Allow major auto updates"
366
+ msgstr "Permitir actualizaciones automáticas importantes"
367
+
368
+ #: admin/pages/updates.php:151
369
+ msgid "Allow development auto updates"
370
+ msgstr "Permitir actualizaciones automáticas de desarrollo"
371
+
372
+ #: admin/pages/updates.php:155
373
+ msgid ""
374
+ "You can disable all core WordPress updates, or disable only automatic "
375
+ "updates. Also you can select the update mode. By default (minor)"
376
+ msgstr ""
377
+ "deshabilitar actualizaciones básicas de WordPress o deshabilitar solo las "
378
+ "actualizaciones automáticas. También puede seleccionar el modo de "
379
+ "actualización. Por defecto (menor)"
380
+
381
+ #: admin/pages/updates.php:155
382
+ msgid "Major - automatically update to major releases (e.g., 4.1, 4.2, 4.3)."
383
+ msgstr ""
384
+ "Mayor - se actualiza automáticamente a las versiones principales (por "
385
+ "ejemplo, 4.1, 4.2, 4.3)."
386
+
387
+ #: admin/pages/updates.php:155
388
+ msgid ""
389
+ "Minor - automatically update to minor releases (e.g., 4.1.1, 4.1.2, 4.1.3).."
390
+ msgstr ""
391
+ "Menor - se actualiza automáticamente a versiones menores (por ejemplo, "
392
+ "4.1.1, 4.1.2, 4.1.3).."
393
+
394
+ #: admin/pages/updates.php:155
395
+ msgid "Development - update automatically to Bleeding Edge releases."
396
+ msgstr ""
397
+ "Desarrollo - actualizar automáticamente a las versiones de Bleeding Edge."
398
+
399
+ #: admin/pages/updates.php:182
400
+ msgid ""
401
+ "Enable Automatic Updates even if a VCS folder (.git, .hg, .svn) was found in "
402
+ "the WordPress directory"
403
+ msgstr ""
404
+ "Habilite las actualizaciones automáticas incluso si se encuentra una carpeta "
405
+ "VCS (.git, .hg, .svn) en el directorio de WordPress"
406
+
407
+ #: admin/pages/updates.php:192
408
+ msgid ""
409
+ "This plugin allows you to hide the update WordPress reminder from all users "
410
+ "that are not assumed Administrators (cannot upgrade plugins).\n"
411
+ "\n"
412
+ "If you have multiple users then this means those who are not admins don’t "
413
+ "need to see the message. Useful for CMS based sites, so the client doesn’t "
414
+ "see the notice."
415
+ msgstr ""
416
+ "Este plugin te permite ocultar el recordatorio de actualización de WordPress "
417
+ "a todos los usuarios que no se consideren administradores (no se pueden "
418
+ "actualizar los complementos).\n"
419
+ "\n"
420
+ "Si tiene varios usuarios, esto significa que aquellos que no son "
421
+ "administradores no necesitan ver el mensaje. Útil para sitios basados en CMS "
422
+ "donde usuarios no admin no veran el aviso."
423
+
424
+ #: admin/pages/updates.php:200
425
+ msgid "Email Notifications"
426
+ msgstr "Notificaciones Email"
427
+
428
+ #: admin/pages/updates.php:200
429
+ msgid ""
430
+ "Email notifications are send once a day, you can choose what notifications "
431
+ "to send below."
432
+ msgstr ""
433
+ "Las notificaciones vía Email se envían una vez al día, puede elegir qué "
434
+ "notificaciones enviar a continuación."
435
+
436
+ #: admin/pages/updates.php:207
437
+ msgid "Update available"
438
+ msgstr "Actualización disponible"
439
+
440
+ #: admin/pages/updates.php:208
441
+ msgid "Send me emails when an update is available."
442
+ msgstr ""
443
+ "Enviarme correos electrónicos cuando haya una actualización disponible."
444
+
445
+ #: admin/pages/updates.php:218
446
+ msgid "Successful update"
447
+ msgstr "Actualización exitosa"
448
+
449
+ #: admin/pages/updates.php:219
450
+ msgid "Send me emails when something has been updated."
451
+ msgstr "Enviarme correos electrónicos cuando algo se haya actualizado."
452
+
453
+ #: admin/pages/updates.php:230
454
+ msgid "Seperate email addresses using commas."
455
+ msgstr "Separe las direcciones de correo con comas."
456
+
457
+ #: admin/pages/updates.php:238
458
+ msgid ""
459
+ "Core notifications are handled by WordPress and not by this plugin. You can "
460
+ "only disable them, changing your email address in the settings above will "
461
+ "not affect these notifications."
462
+ msgstr ""
463
+ "Las notificaciones genéricas son manejadas por WordPress y no por este "
464
+ "complemento. Solo puede deshabilitarlas, cambiar su dirección de correo "
465
+ "electrónico en la configuración anterior no afectará estas notificaciones."
466
+
467
+ #: admin/pages/updates.php:246
468
+ msgid ""
469
+ "By default wordpress sends an email when a core update happend. Uncheck this "
470
+ "box to disable these emails."
471
+ msgstr ""
472
+ "Por defecto, wordpress envía un correo electrónico cuando se produce una "
473
+ "actualización del núcleo. Desmarque esta casilla para deshabilitar estos "
474
+ "correos electrónicos."
475
+
476
+ #: webcraftic-updates-manager.php:78
477
+ msgid "Webcraftic Updates Manager"
478
+ msgstr "Gestor de Actualizaciones Webcraftic"
components/updates-manager/webcraftic-updates-manager.php CHANGED
@@ -1,68 +1,88 @@
1
  <?php
2
- /**
3
- * Plugin Name: Webcraftic Updates manager
4
- * Plugin URI: https://wordpress.org/plugins/webcraftic-updates-manager/
5
- * Description: Manage all your WordPress updates, automatic updates, logs, and loads more.
6
- * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
- * Version: 1.0.8
8
- * Text Domain: webcraftic-updates-manager
9
- * Domain Path: /languages/
10
- * Author URI: https://clearfy.pro
11
- * Framework Version: FACTORY_409_VERSION
12
- */
 
 
 
13
 
14
- define('WUPM_PLUGIN_VERSION', '1.0.8');
 
 
 
 
 
 
15
 
16
- define('WUPM_PLUGIN_DIR', dirname(__FILE__));
17
- define('WUPM_PLUGIN_BASE', plugin_basename(__FILE__));
18
- define('WUPM_PLUGIN_URL', plugins_url(null, __FILE__));
 
 
 
 
 
 
 
 
 
 
19
 
20
-
21
 
22
- if( !defined('LOADING_UPDATES_MANAGER_AS_ADDON') ) {
23
- require_once(WUPM_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php');
24
- require_once(WUPM_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php');
25
- }
26
 
27
- $plugin_info = array(
28
- 'prefix' => 'wbcr_upm_',//wbcr_upm_
29
- 'plugin_name' => 'wbcr_updates_manager',
30
- 'plugin_title' => __('Webcraftic Updates Manager', 'webcraftic-updates-manager'),
31
- 'plugin_version' => WUPM_PLUGIN_VERSION,
32
- 'plugin_build' => 'free',
33
- //'updates' => WUPM_PLUGIN_DIR . '/updates/'
34
- );
35
 
36
- /**
37
- * Проверяет совместимость с Wordpress, php и другими плагинами.
38
- */
39
- $compatibility = new Wbcr_FactoryClearfy_Compatibility(array_merge($plugin_info, array(
40
- 'plugin_already_activate' => defined('WUPM_PLUGIN_ACTIVE'),
41
- 'plugin_as_component' => defined('LOADING_UPDATES_MANAGER_AS_ADDON'),
42
- 'plugin_dir' => WUPM_PLUGIN_DIR,
43
- 'plugin_base' => WUPM_PLUGIN_BASE,
44
- 'plugin_url' => WUPM_PLUGIN_URL,
45
- 'required_php_version' => '5.3',
46
- 'required_wp_version' => '4.2.0',
47
- 'required_clearfy_check_component' => true
48
- )));
49
 
50
- /**
51
- * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
52
- * а пользователь получит предупреждение.
53
- */
54
- if( !$compatibility->check() ) {
55
- return;
56
- }
 
 
 
 
 
 
 
57
 
58
- define('WUPM_PLUGIN_ACTIVE', true);
 
 
 
 
 
 
59
 
60
- if( !defined('LOADING_UPDATES_MANAGER_AS_ADDON') ) {
61
- require_once(WUPM_PLUGIN_DIR . '/libs/factory/core/boot.php');
62
- }
63
 
64
- require_once(WUPM_PLUGIN_DIR . '/includes/class.plugin.php');
 
 
65
 
66
- if( !defined('LOADING_UPDATES_MANAGER_AS_ADDON') ) {
67
- new WUPM_Plugin(__FILE__, $plugin_info);
68
- }
 
 
1
  <?php
2
+ /**
3
+ * Plugin Name: Webcraftic Updates manager
4
+ * Plugin URI: https://wordpress.org/plugins/webcraftic-updates-manager/
5
+ * Description: Manage all your WordPress updates, automatic updates, logs, and loads more.
6
+ * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
+ * Version: 1.0.8
8
+ * Text Domain: webcraftic-updates-manager
9
+ * Domain Path: /languages/
10
+ * Author URI: https://clearfy.pro
11
+ * Framework Version: FACTORY_409_VERSION
12
+ */
13
+ if ( ! defined( 'WUPM_PLUGIN_VERSION' ) ) {
14
+ define( 'WUPM_PLUGIN_VERSION', '1.0.8' );
15
+ }
16
 
17
+ // Fix for ithemes sync. When the ithemes sync plugin accepts the request, set the WP_ADMIN constant,
18
+ // after which the plugin Clearfy begins to create errors, and how the logic of its work is broken.
19
+ // Solution to simply terminate the plugin if there is a request from ithemes sync
20
+ // --------------------------------------
21
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'ithemes_sync_request' ) {
22
+ return;
23
+ }
24
 
25
+ if ( isset( $_GET['ithemes-sync-request'] ) && ! empty( $_GET['ithemes-sync-request'] ) ) {
26
+ return;
27
+ }
28
+ // ----------------------------------------
29
+ if ( ! defined( 'WUPM_PLUGIN_DIR' ) ) {
30
+ define( 'WUPM_PLUGIN_DIR', dirname( __FILE__ ) );
31
+ }
32
+ if ( ! defined( 'WUPM_PLUGIN_BASE' ) ) {
33
+ define( 'WUPM_PLUGIN_BASE', plugin_basename( __FILE__ ) );
34
+ }
35
+ if ( ! defined( 'WUPM_PLUGIN_URL' ) ) {
36
+ define( 'WUPM_PLUGIN_URL', plugins_url( null, __FILE__ ) );
37
+ }
38
 
 
39
 
 
 
 
 
40
 
41
+ if ( ! defined( 'LOADING_UPDATES_MANAGER_AS_ADDON' ) ) {
42
+ require_once( WUPM_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php' );
43
+ require_once( WUPM_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php' );
44
+ }
 
 
 
 
45
 
46
+ $plugin_info = array(
47
+ 'prefix' => 'wbcr_upm_',//wbcr_upm_
48
+ 'plugin_name' => 'wbcr_updates_manager',
49
+ 'plugin_title' => __( 'Webcraftic Updates Manager', 'webcraftic-updates-manager' ),
50
+ 'plugin_version' => WUPM_PLUGIN_VERSION,
51
+ 'plugin_build' => 'free',
52
+ //'updates' => WUPM_PLUGIN_DIR . '/updates/'
53
+ );
 
 
 
 
 
54
 
55
+ /**
56
+ * Проверяет совместимость с Wordpress, php и другими плагинами.
57
+ */
58
+ $compatibility = new Wbcr_FactoryClearfy_Compatibility( array_merge( $plugin_info, array(
59
+ 'factory_version' => 'FACTORY_409_VERSION',
60
+ 'plugin_already_activate' => defined( 'WUPM_PLUGIN_ACTIVE' ),
61
+ 'plugin_as_component' => defined( 'LOADING_UPDATES_MANAGER_AS_ADDON' ),
62
+ 'plugin_dir' => WUPM_PLUGIN_DIR,
63
+ 'plugin_base' => WUPM_PLUGIN_BASE,
64
+ 'plugin_url' => WUPM_PLUGIN_URL,
65
+ 'required_php_version' => '5.3',
66
+ 'required_wp_version' => '4.2.0',
67
+ 'required_clearfy_check_component' => true
68
+ ) ) );
69
 
70
+ /**
71
+ * Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
72
+ * а пользователь получит предупреждение.
73
+ */
74
+ if ( ! $compatibility->check() ) {
75
+ return;
76
+ }
77
 
78
+ define( 'WUPM_PLUGIN_ACTIVE', true );
 
 
79
 
80
+ if ( ! defined( 'LOADING_UPDATES_MANAGER_AS_ADDON' ) ) {
81
+ require_once( WUPM_PLUGIN_DIR . '/libs/factory/core/boot.php' );
82
+ }
83
 
84
+ require_once( WUPM_PLUGIN_DIR . '/includes/class.plugin.php' );
85
+
86
+ if ( ! defined( 'LOADING_UPDATES_MANAGER_AS_ADDON' ) ) {
87
+ new WUPM_Plugin( __FILE__, $plugin_info );
88
+ }
includes/class.plugin.php CHANGED
@@ -248,6 +248,7 @@ class WCL_Plugin extends Wbcr_Factory409_Plugin {
248
  }
249
 
250
  private function globalScripts() {
 
251
  require_once( WCL_PLUGIN_DIR . '/includes/boot.php' );
252
 
253
  require_once( WCL_PLUGIN_DIR . '/includes/classes/class.configurate-performance.php' );
248
  }
249
 
250
  private function globalScripts() {
251
+
252
  require_once( WCL_PLUGIN_DIR . '/includes/boot.php' );
253
 
254
  require_once( WCL_PLUGIN_DIR . '/includes/classes/class.configurate-performance.php' );
includes/classes/class.configurate-advanced.php CHANGED
@@ -1,248 +1,148 @@
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  /**
3
- * This class configures the parameters advanced
4
- * @author Webcraftic <wordpress.webraftic@gmail.com>
5
- * @copyright (c) 2017 Webraftic Ltd
6
- * @version 1.0
7
  */
8
-
9
- // Exit if accessed directly
10
- if( !defined('ABSPATH') ) {
11
- exit;
12
  }
13
-
14
- class WCL_ConfigAdvanced extends Wbcr_FactoryClearfy206_Configurate {
15
-
16
- /**
17
- * @param WCL_Plugin $plugin
18
- */
19
- public function __construct(WCL_Plugin $plugin)
20
- {
21
- parent::__construct($plugin);
22
-
23
- $this->plugin = $plugin;
24
  }
25
 
26
- public function registerActionsAndFilters()
27
- {
28
- if( $this->getPopulateOption('disable_heartbeat') && $this->getPopulateOption('disable_heartbeat') != 'default' ) {
29
- add_action('init', array($this, 'disableHeartbeat'), 1);
30
- }
31
-
32
- if( $this->getPopulateOption('heartbeat_frequency') && $this->getPopulateOption('heartbeat_frequency') != 'default' ) {
33
- add_filter('heartbeat_settings', array($this, 'clearfyHeartbeatFrequency'));
34
- }
35
-
36
- //============================================================
37
- // POST TOOLS COMPONENT
38
- //============================================================
39
-
40
- if( $this->plugin->isActivateComponent('post_tools') ) {
41
- if( ($this->getPopulateOption('revision_limit') || $this->getPopulateOption('revisions_disable')) && is_admin() ) {
42
- add_filter('wp_revisions_to_keep', array($this, 'clearfyRevisionsToKeep'), 10, 2);
43
- }
44
-
45
- if( $this->getPopulateOption('disable_post_autosave') && is_admin() ) {
46
- add_action('wp_print_scripts', array($this, 'disableAutoSave'));
47
- }
48
-
49
- if( $this->getPopulateOption('disable_texturization') ) {
50
- remove_filter('comment_text', 'wptexturize');
51
- remove_filter('the_content', 'wptexturize');
52
- remove_filter('the_excerpt', 'wptexturize');
53
- remove_filter('the_title', 'wptexturize');
54
- remove_filter('the_content_feed', 'wptexturize');
55
- }
56
-
57
- if( $this->getPopulateOption('disable_auto_correct_dangit') ) {
58
- remove_filter('the_content', 'capital_P_dangit');
59
- remove_filter('the_title', 'capital_P_dangit');
60
- remove_filter('comment_text', 'capital_P_dangit');
61
- }
62
-
63
- if( $this->getPopulateOption('disable_auto_paragraph') ) {
64
- remove_filter('the_content', 'wpautop');
65
- }
66
- }
67
-
68
- //============================================================
69
- // ADMINBAR MANAGER COMPONENT
70
- //============================================================
71
-
72
- if( $this->plugin->isActivateComponent('adminbar_manager') && is_user_logged_in() ) {
73
- if( $this->getPopulateOption('replace_howdy_welcome') ) {
74
- add_filter('admin_bar_menu', array($this, 'replaceHowdyText'), 25);
75
- }
76
-
77
- if( $this->getPopulateOption('disable_admin_bar') == 'for_all_users' ) {
78
- add_filter('show_admin_bar', '__return_false', 999999);
79
- }
80
-
81
- if( $this->getPopulateOption('disable_admin_bar') == 'for_all_users_except_administrator' ) {
82
- add_filter('show_admin_bar', array($this, 'removeFunctionAdminBar'));
83
- }
84
-
85
- if( $this->getPopulateOption('disable_admin_bar_logo') ) {
86
- add_action('wp_before_admin_bar_render', array($this, 'removeWpLogo'));
87
- }
88
- }
89
-
90
- //============================================================
91
- // WIDGETS TOOLS COMPONENT
92
- //============================================================
93
-
94
- if( $this->plugin->isActivateComponent('widget_tools') ) {
95
- add_action('widgets_init', array($this, 'unregisterDefaultWidgets'), 11);
96
- }
97
  }
98
-
99
- // unregister all widgets
100
- public function unregisterDefaultWidgets()
101
- {
102
- if( $this->getPopulateOption('remove_unneeded_widget_page') ) {
103
- unregister_widget('WP_Widget_Pages');
104
- }
105
- if( $this->getPopulateOption('remove_unneeded_widget_calendar') ) {
106
- unregister_widget('WP_Widget_Calendar');
107
- }
108
- if( $this->getPopulateOption('remove_unneeded_widget_tag_cloud') ) {
109
- unregister_widget('WP_Widget_Tag_Cloud');
110
- }
111
- if( $this->getPopulateOption('remove_unneeded_widget_archives') ) {
112
- unregister_widget('WP_Widget_Archives');
113
- }
114
- if( $this->getPopulateOption('remove_unneeded_widget_links') ) {
115
- unregister_widget('WP_Widget_Links');
116
- }
117
- if( $this->getPopulateOption('remove_unneeded_widget_meta') ) {
118
- unregister_widget('WP_Widget_Meta');
119
- }
120
- if( $this->getPopulateOption('remove_unneeded_widget_search') ) {
121
- unregister_widget('WP_Widget_Search');
122
- }
123
- if( $this->getPopulateOption('remove_unneeded_widget_text') ) {
124
- unregister_widget('WP_Widget_Text');
125
- }
126
- if( $this->getPopulateOption('remove_unneeded_widget_categories') ) {
127
- unregister_widget('WP_Widget_Categories');
128
- }
129
- if( $this->getPopulateOption('remove_unneeded_widget_recent_posts') ) {
130
- unregister_widget('WP_Widget_Recent_Posts');
131
- }
132
- if( $this->getPopulateOption('remove_unneeded_widget_recent_comments') ) {
133
- unregister_widget('WP_Widget_Recent_Comments');
134
- }
135
- if( $this->getPopulateOption('remove_unneeded_widget_rss') ) {
136
- unregister_widget('WP_Widget_RSS');
137
- }
138
- if( $this->getPopulateOption('remove_unneeded_widget_menu') ) {
139
- unregister_widget('WP_Nav_Menu_Widget');
140
  }
141
- if( $this->getPopulateOption('remove_unneeded_widget_twenty_eleven_ephemera') ) {
142
- unregister_widget('Twenty_Eleven_Ephemera_Widget');
 
143
  }
144
  }
145
-
146
- /**
147
- * Revisions limit
148
- *
149
- * @since 0.9.5
150
- */
151
-
152
- public function clearfyRevisionsToKeep($num, $post)
153
- {
154
- if( $this->getPopulateOption('revision_limit', null) && is_numeric($this->getPopulateOption('revision_limit', null)) ) {
155
- $num = $this->getPopulateOption('revision_limit', 0);
156
- }
157
-
158
- if( $this->getPopulateOption('revisions_disable') ) {
159
- $num = 0;
160
- }
161
-
162
- return $num;
163
  }
164
-
165
- /**
166
- * Revisions limit
167
- *
168
- * @since 0.9.5
169
- */
170
-
171
- public function clearfyHeartbeatFrequency($settings)
172
- {
173
- if( 0 < (int)$this->getPopulateOption('heartbeat_frequency') ) {
174
- $settings['interval'] = (int)$this->getPopulateOption('heartbeat_frequency');
175
- }
176
-
177
- return $settings;
178
  }
179
-
180
- public function disableHeartbeat()
181
- {
182
- switch( $this->getPopulateOption('disable_heartbeat') ) {
183
- case 'everywhere':
184
- wp_deregister_script('heartbeat');
185
- break;
186
- case 'allow_only_on_post_edit_pages':
187
- global $pagenow;
188
- if( $pagenow != 'post.php' && $pagenow != 'post-new.php' ) {
189
- wp_deregister_script('heartbeat');
190
- }
191
- break;
192
- case 'on_dashboard_page':
193
- global $pagenow;
194
- if( 'index.php' === $pagenow ) {
195
- wp_deregister_script('heartbeat');
196
- }
197
- break;
198
- }
199
  }
200
-
201
- public function disableAutoSave()
202
- {
203
- wp_deregister_script('autosave');
204
  }
205
-
206
- /**
207
- * @param WP_Admin_Bar $wp_admin_bar
208
- */
209
- public function replaceHowdyText($wp_admin_bar)
210
- {
211
- #Fix bug when the attribute $wp_admin_bar does not belong to the class WP_Admin_Bar
212
- require_once ABSPATH . "/wp-includes/class-wp-admin-bar.php";
213
-
214
- if( empty($wp_admin_bar) || !($wp_admin_bar instanceof WP_Admin_Bar) ) {
215
- return;
216
- }
217
- $my_account = $wp_admin_bar->get_node('my-account');
218
-
219
- $newtitle = str_replace(__('Howdy', 'clearfy') . ',', __('Welcome', 'clearfy') . ',', $my_account->title);
220
- $wp_admin_bar->add_node(array(
221
- 'id' => 'my-account',
222
- 'title' => $newtitle,
223
- ));
224
  }
225
-
226
- /**
227
- * @param $content
228
- * @return bool
229
- */
230
- public function removeFunctionAdminBar($content)
231
- {
232
- return (current_user_can('administrator'))
233
- ? $content
234
- : false;
235
  }
236
-
237
- /**
238
- * @global WP_Admin_Bar $wp_admin_bar
239
- */
240
- public function removeWpLogo()
241
- {
242
- global $wp_admin_bar;
243
- $wp_admin_bar->remove_menu('wp-logo');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
244
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
245
  }
 
246
 
247
 
248
 
1
  <?php
2
+ /**
3
+ * This class configures the parameters advanced
4
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
5
+ * @copyright (c) 2017 Webraftic Ltd
6
+ * @version 1.0
7
+ */
8
+
9
+ // Exit if accessed directly
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit;
12
+ }
13
+
14
+ class WCL_ConfigAdvanced extends Wbcr_FactoryClearfy206_Configurate {
15
+
16
  /**
17
+ * @param WCL_Plugin $plugin
 
 
 
18
  */
19
+ public function __construct( WCL_Plugin $plugin ) {
20
+ parent::__construct( $plugin );
21
+
22
+ $this->plugin = $plugin;
23
  }
24
+
25
+ public function registerActionsAndFilters() {
26
+ if ( $this->getPopulateOption( 'disable_heartbeat' ) && $this->getPopulateOption( 'disable_heartbeat' ) != 'default' ) {
27
+ add_action( 'init', array( $this, 'disableHeartbeat' ), 1 );
 
 
 
 
 
 
 
28
  }
29
 
30
+ if ( $this->getPopulateOption( 'heartbeat_frequency' ) && $this->getPopulateOption( 'heartbeat_frequency' ) != 'default' ) {
31
+ add_filter( 'heartbeat_settings', array( $this, 'clearfyHeartbeatFrequency' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  }
33
+
34
+ //============================================================
35
+ // ADMINBAR MANAGER COMPONENT
36
+ //============================================================
37
+
38
+ if ( $this->plugin->isActivateComponent( 'adminbar_manager' ) && is_user_logged_in() ) {
39
+ if ( $this->getPopulateOption( 'disable_admin_bar' ) == 'for_all_users' ) {
40
+ add_filter( 'show_admin_bar', '__return_false', 999999 );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  }
42
+
43
+ if ( $this->getPopulateOption( 'disable_admin_bar' ) == 'for_all_users_except_administrator' ) {
44
+ add_filter( 'show_admin_bar', array( $this, 'removeFunctionAdminBar' ) );
45
  }
46
  }
47
+
48
+ //============================================================
49
+ // WIDGETS TOOLS COMPONENT
50
+ //============================================================
51
+
52
+ if ( $this->plugin->isActivateComponent( 'widget_tools' ) ) {
53
+ add_action( 'widgets_init', array( $this, 'unregisterDefaultWidgets' ), 11 );
 
 
 
 
 
 
 
 
 
 
 
54
  }
55
+ }
56
+
57
+ // unregister all widgets
58
+ public function unregisterDefaultWidgets() {
59
+ if ( $this->getPopulateOption( 'remove_unneeded_widget_page' ) ) {
60
+ unregister_widget( 'WP_Widget_Pages' );
 
 
 
 
 
 
 
 
61
  }
62
+ if ( $this->getPopulateOption( 'remove_unneeded_widget_calendar' ) ) {
63
+ unregister_widget( 'WP_Widget_Calendar' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  }
65
+ if ( $this->getPopulateOption( 'remove_unneeded_widget_tag_cloud' ) ) {
66
+ unregister_widget( 'WP_Widget_Tag_Cloud' );
 
 
67
  }
68
+ if ( $this->getPopulateOption( 'remove_unneeded_widget_archives' ) ) {
69
+ unregister_widget( 'WP_Widget_Archives' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  }
71
+ if ( $this->getPopulateOption( 'remove_unneeded_widget_links' ) ) {
72
+ unregister_widget( 'WP_Widget_Links' );
 
 
 
 
 
 
 
 
73
  }
74
+ if ( $this->getPopulateOption( 'remove_unneeded_widget_meta' ) ) {
75
+ unregister_widget( 'WP_Widget_Meta' );
76
+ }
77
+ if ( $this->getPopulateOption( 'remove_unneeded_widget_search' ) ) {
78
+ unregister_widget( 'WP_Widget_Search' );
79
+ }
80
+ if ( $this->getPopulateOption( 'remove_unneeded_widget_text' ) ) {
81
+ unregister_widget( 'WP_Widget_Text' );
82
+ }
83
+ if ( $this->getPopulateOption( 'remove_unneeded_widget_categories' ) ) {
84
+ unregister_widget( 'WP_Widget_Categories' );
85
+ }
86
+ if ( $this->getPopulateOption( 'remove_unneeded_widget_recent_posts' ) ) {
87
+ unregister_widget( 'WP_Widget_Recent_Posts' );
88
+ }
89
+ if ( $this->getPopulateOption( 'remove_unneeded_widget_recent_comments' ) ) {
90
+ unregister_widget( 'WP_Widget_Recent_Comments' );
91
+ }
92
+ if ( $this->getPopulateOption( 'remove_unneeded_widget_rss' ) ) {
93
+ unregister_widget( 'WP_Widget_RSS' );
94
+ }
95
+ if ( $this->getPopulateOption( 'remove_unneeded_widget_menu' ) ) {
96
+ unregister_widget( 'WP_Nav_Menu_Widget' );
97
+ }
98
+ if ( $this->getPopulateOption( 'remove_unneeded_widget_twenty_eleven_ephemera' ) ) {
99
+ unregister_widget( 'Twenty_Eleven_Ephemera_Widget' );
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Revisions limit
105
+ *
106
+ * @since 0.9.5
107
+ */
108
+
109
+ public function clearfyHeartbeatFrequency( $settings ) {
110
+ if ( 0 < (int) $this->getPopulateOption( 'heartbeat_frequency' ) ) {
111
+ $settings['interval'] = (int) $this->getPopulateOption( 'heartbeat_frequency' );
112
  }
113
+
114
+ return $settings;
115
+ }
116
+
117
+ public function disableHeartbeat() {
118
+ switch ( $this->getPopulateOption( 'disable_heartbeat' ) ) {
119
+ case 'everywhere':
120
+ wp_deregister_script( 'heartbeat' );
121
+ break;
122
+ case 'allow_only_on_post_edit_pages':
123
+ global $pagenow;
124
+ if ( $pagenow != 'post.php' && $pagenow != 'post-new.php' ) {
125
+ wp_deregister_script( 'heartbeat' );
126
+ }
127
+ break;
128
+ case 'on_dashboard_page':
129
+ global $pagenow;
130
+ if ( 'index.php' === $pagenow ) {
131
+ wp_deregister_script( 'heartbeat' );
132
+ }
133
+ break;
134
+ }
135
+ }
136
+
137
+ /**
138
+ * @param $content
139
+ *
140
+ * @return bool
141
+ */
142
+ public function removeFunctionAdminBar( $content ) {
143
+ return ( current_user_can( 'administrator' ) ) ? $content : false;
144
  }
145
+ }
146
 
147
 
148
 
includes/classes/class.configurate-google-performance.php CHANGED
@@ -1,382 +1,368 @@
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  /**
3
- * This class configures the google performance settings
4
- * @author Webcraftic <wordpress.webraftic@gmail.com>
5
- * @copyright (c) 2017 Webraftic Ltd
6
- * @version 1.0
7
  */
8
-
9
- // Exit if accessed directly
10
- if( !defined('ABSPATH') ) {
11
- exit;
12
  }
13
-
14
- class WCL_ConfigGooglePerformance extends Wbcr_FactoryClearfy206_Configurate {
15
-
16
- /**
17
- * @param WCL_Plugin $plugin
18
- */
19
- public function __construct(WCL_Plugin $plugin)
20
- {
21
- parent::__construct($plugin);
22
-
23
- $this->plugin = $plugin;
24
  }
25
-
26
- public function registerActionsAndFilters()
27
- {
28
- if( $this->getPopulateOption('disable_google_fonts') ) {
29
- add_action('wp_enqueue_scripts', array($this, 'disableAllGoogleFonts'), 999);
30
- }
31
 
32
- if( !is_admin() ) {
33
- $load_google_fonts = $this->getPopulateOption('lazy_load_google_fonts');
34
- $load_font_awesome = $this->getPopulateOption('lazy_load_font_awesome');
35
 
36
- if( $load_google_fonts || $load_font_awesome ) {
37
- add_action('wp_print_styles', array($this, 'enqueueScripts'), -1);
38
- }
39
 
40
- if( $this->getPopulateOption('disable_google_maps') ) {
41
- add_action("wp_loaded", array($this, 'disableGoogleMapsObStart'));
42
- }
43
  }
44
  }
 
45
 
46
- /** ======================================================================== */
47
- // Disable google maps
48
- /** ======================================================================== */
49
 
50
- function disableGoogleMapsObStart()
51
- {
52
- ob_start(array($this, 'disableGoogleMapsObEnd'));
53
- }
54
 
55
- /**
56
- * @param string $html
57
- * @return mixed
58
- */
59
- function disableGoogleMapsObEnd($html)
60
- {
61
- global $post;
62
 
63
- $exclude_ids = array();
64
- $exclude_from_disable_google_maps = $this->getPopulateOption('exclude_from_disable_google_maps');
65
 
66
- if( '' !== $exclude_from_disable_google_maps ) {
67
- $exclude_ids = array_map('intval', explode(',', $exclude_from_disable_google_maps));
68
- }
69
- if( $post && !in_array($post->ID, $exclude_ids, true) ) {
70
- $html = preg_replace('/<script[^<>]*\/\/maps.(googleapis|google|gstatic).com\/[^<>]*><\/script>/i', '', $html);
71
 
72
- if( $this->getPopulateOption('remove_iframe_google_maps') ) {
73
- $html = preg_replace('/<iframe[^<>]*\/\/(www\.)?google\.com(\.\w*)?\/maps\/[^<>]*><\/iframe>/i', '', $html);
74
- }
75
  }
76
-
77
- return $html;
78
  }
79
 
80
- /** ======================================================================== */
81
- // End disable google maps
82
- /** ======================================================================== */
83
 
84
- function disableAllGoogleFonts()
85
- {
86
- global $wp_styles;
87
 
88
- // multiple patterns hook
89
- $regex = '/fonts\.googleapis\.com\/css\?family/i';
90
 
91
- foreach($wp_styles->registered as $registered) {
 
92
 
93
- if( preg_match($regex, $registered->src) ) {
94
- wp_dequeue_style($registered->handle);
 
 
95
  }
96
  }
97
  }
 
98
 
99
- /** ======================================================================== */
100
- // Lazy load fonts
101
- /** ======================================================================== */
102
 
103
- public function enqueueScripts()
104
- {
105
- $async_links = $this->checkGooglefontsFontawesomeStyles();
106
 
107
- if( !empty($async_links) ) {
108
- wp_enqueue_script($this->plugin->getPluginName() . '-css-lazy-load', WCL_PLUGIN_URL . '/assets/js/css-lazy-load.min.js', array('jquery'), $this->plugin->getPluginVersion());
109
- wp_localize_script($this->plugin->getPluginName() . '-css-lazy-load', 'wbcr_clearfy_async_links', $async_links);
110
- }
111
  }
 
112
 
113
- private function checkGooglefontsFontawesomeStyles()
114
- {
115
- global $wp_styles;
116
- $ret = array();
117
- if( isset($wp_styles) && !empty($wp_styles) ) {
118
-
119
- $load_google_fonts = $this->getPopulateOption('lazy_load_google_fonts', false);
120
- $load_font_awesome = $this->getPopulateOption('lazy_load_font_awesome', false);
121
-
122
- if( $load_google_fonts || $load_font_awesome ) {
123
-
124
- $gfonts_base_url = 'fonts.googleapis.com/css';
125
- $gfonts_links = array();
126
-
127
- $font_awesome_slug = 'font-awesome';
128
- $font_awesome_slug_alt = 'fontawesome';
129
- $font_awesome_links = array(
130
- 'external' => array(),
131
- 'internal' => array(),
132
- );
133
-
134
- foreach($wp_styles->queue as $handle) {
135
- if( $load_google_fonts && false !== strpos($wp_styles->registered[$handle]->src, $gfonts_base_url) ) {
136
- $gfonts_links[] = urldecode(str_replace(array('&amp;'), array('&'), $wp_styles->registered[$handle]->src));
137
- wp_dequeue_style($handle);
138
- } elseif( $load_font_awesome && ( false !== strpos($wp_styles->registered[$handle]->src, $font_awesome_slug) || false !== strpos($wp_styles->registered[$handle]->src, $font_awesome_slug_alt ) ) ) {
139
-
140
- wp_dequeue_style($handle);
141
-
142
- $font_awesome_links[false !== strpos($wp_styles->registered[$handle]->src, site_url())
143
- ? 'internal'
144
- : 'external'][] = array(
145
- 'ver' => $wp_styles->registered[$handle]->ver
146
- ? $wp_styles->registered[$handle]->ver
147
- : false,
148
- 'link' => $wp_styles->registered[$handle]->src,
149
- );
150
- }
151
  }
152
 
153
- $saved_font_awesome_requests = 0;
154
- $saved_google_fonts_requests = 0;
 
 
 
 
 
 
 
155
 
156
- if( $load_font_awesome && (!empty($font_awesome_links['internal']) || !empty($font_awesome_links['external'])) ) {
157
 
158
- // @note: Prioritize external links.
159
- $fa_links = !empty($font_awesome_links['external'])
160
- ? $font_awesome_links['external']
161
- : $font_awesome_links['internal'];
 
 
162
 
163
- $selected_fa_link = $fa_links[0];
164
 
165
- $links_count = count($fa_links);
166
- if( 1 < $links_count ) {
167
- for($i = 1; $i < $links_count; $i++) {
168
- if( false !== $fa_links[$i]['ver'] && (false === $selected_fa_link['ver'] || version_compare($selected_fa_link['ver'], $fa_links[$i]['ver'], '<'))
169
- ) {
170
- $selected_fa_link = $fa_links[$i];
171
- }
 
 
 
172
  }
173
  }
 
174
 
175
- $ret[$this->plugin->getPluginName() . '-font-awesome'] = esc_url($selected_fa_link['link']);
176
 
177
- $this->updateSavedFontAwesomeRequests(count($font_awesome_links['internal']) + count($font_awesome_links['external']));
178
- } else {
179
- $this->updateSavedFontAwesomeRequests(0);
180
- }
181
 
182
- if( $load_google_fonts && !empty($gfonts_links) ) {
183
 
184
- $ret[$this->plugin->getPluginName() . '-google-fonts'] = esc_url($this->combineGoogleFontsLinks($gfonts_links));
185
 
186
- $this->updateSavedGoogleFontsRequest(count($gfonts_links));
187
- } else {
188
- $this->updateSavedGoogleFontsRequest(0);
189
- }
190
  } else {
191
- $this->updateSavedFontAwesomeRequests(0);
192
- $this->updateSavedGoogleFontsRequest(0);
193
  }
 
 
 
194
  }
195
-
196
- return $ret;
197
  }
198
 
199
- private function updateSavedGoogleFontsRequest($count)
200
- {
201
- $count = !isset($count)
202
- ? 0
203
- : (int)$count;
204
 
205
- $old_val = $this->getPopulateOption('combined_font_awesome_requests_number');
206
 
207
- if( false === $old_val || (false !== $old_val && $count > (int)$old_val) ) {
208
- $this->updatePopulateOption('combined_font_awesome_requests_number', $count);
209
- }
210
  }
 
211
 
212
- private function updateSavedFontAwesomeRequests($count)
213
- {
214
- $count = !isset($count)
215
- ? 0
216
- : (int)$count;
217
 
218
- $old_val = $this->getPopulateOption('combined_google_fonts_requests_number');
219
 
220
- if( false === $old_val || (false !== $old_val && $count > (int)$old_val) ) {
221
- $this->updatePopulateOption('combined_google_fonts_requests_number', $count);
222
- }
223
  }
 
224
 
225
- public static function saved_external_requests()
226
- {
227
- $google_fonts = (int)WCL_Plugin::app()->getPopulateOption('combined_google_fonts_requests_number');
228
- $font_awesome = (int)WCL_Plugin::app()->getPopulateOption('combined_font_awesome_requests_number');
229
 
230
- $google_fonts_saved = 1 < $google_fonts
231
- ? $google_fonts - 1
232
- : 0;
233
- $font_awesome_saved = 1 < $font_awesome
234
- ? $font_awesome - 1
235
- : 0;
236
 
237
- return $google_fonts_saved + $font_awesome_saved;
238
- }
239
 
240
- /**
241
- * Combine multiple Google Fonts links into one.
242
- *
243
- * @param array $links An array of the different Google Fonts links. Default array().
244
- * @return string The compined Google Fonts link.
245
- */
246
- private function combineGoogleFontsLinks($links = array())
247
- {
248
-
249
- if( !is_array($links) ) {
250
- return $links;
251
- }
252
 
253
- $links = array_unique($links);
 
 
254
 
255
- if( 1 === count($links) ) {
256
- return $links[0];
257
- }
258
 
259
- $protocol = 'https';
260
- $base_url = '//fonts.googleapis.com/css';
261
- $family_arg = 'family';
262
- $subset_arg = 'subset';
263
 
264
- $base_url_len = strlen($base_url);
265
- $family_arg_len = strlen($family_arg);
 
 
266
 
267
- $fonts = array();
268
- $cnt = 0;
269
 
270
- $clean_links = array();
271
- foreach($links as $k => $v) {
272
 
273
- $base_url_pos = strrpos($v, $base_url);
 
274
 
275
- $args_str = trim(substr($v, ($base_url_len + $base_url_pos), strlen($v)));
276
 
277
- if( substr($args_str, 0, $family_arg_len + 2) === '?' . $family_arg . '=' ) {
278
- $args_str = substr($args_str, $family_arg_len + 2, strlen($args_str));
279
- }
280
 
281
- $tmp = explode('|', $args_str);
282
- $tmp_count = count($tmp);
283
- for($i = 0; $i < $tmp_count; $i++) {
284
- $clean_links[] = $tmp[$i];
285
- }
286
  }
287
 
288
- foreach($clean_links as $k => $v) {
 
 
 
 
 
289
 
290
- $expl = explode('&' . $subset_arg, $v);
291
 
292
- if( isset($expl[0]) && !empty($expl[0]) ) {
293
 
294
- $tmp = explode(':', $expl[0]);
295
 
296
- if( isset($tmp[0]) && !empty($tmp[0]) ) {
297
 
298
- // Has font family name.
299
- $font_name = str_replace(' ', '+', $tmp[0]);
300
 
301
- if( !isset($fonts[$font_name]) ) {
302
- $fonts[$font_name] = array(
303
- 'sizes' => array(),
304
- 'subsets' => array(),
305
- );
306
- }
 
 
 
307
 
308
- if( isset($tmp[1]) && !empty($tmp[1]) ) {
309
 
310
- // Has font sizes.
311
- $x = explode(',', $tmp[1]);
312
- $xc = count($x);
313
 
314
- foreach($x as $xk => $xv) {
315
- if( !in_array($xv, $fonts[$font_name]['sizes'], true) && (400 !== (int)$xv || $xc > 1) ) {
316
- $fonts[$font_name]['sizes'][] = $xv;
317
- }
318
  }
319
  }
 
320
 
321
- if( isset($expl[1]) && !empty($expl[1]) ) {
322
 
323
- // Has subsets.
324
- $y = explode(',', $expl[1]);
325
- $yc = count($y);
326
 
327
- foreach($y as $yk => $yv) {
328
 
329
- if( '=' === substr($yv, 0, 1) ) {
330
- $yv = substr($yv, 1, strlen($yv));
331
- }
332
 
333
- if( !in_array($yv, $fonts[$font_name]['subsets'], true) && ('latin' !== $yv || $yc > 1) ) {
334
- $fonts[$font_name]['subsets'][] = $yv;
335
- }
336
  }
337
  }
338
- }// End if().
339
  }// End if().
340
- }// End foreach().
 
341
 
342
- $ret = '';
343
 
344
- if( !empty($fonts) ) {
345
 
346
- $ret .= $protocol . ':' . $base_url;
347
- $i = 0;
348
- $subsets = array();
349
 
350
- foreach($fonts as $key => $val) {
351
 
352
- if( 0 === $i ) {
353
- $ret .= '?' . $family_arg . '=';
354
- } else {
355
- $ret .= '|';
356
- }
357
 
358
- $ret .= $key;
359
 
360
- if( !empty($val['sizes']) ) {
361
- $ret .= ':' . implode(',', $val['sizes']);
362
- }
363
-
364
- if( !empty($val['subsets']) ) {
365
- $subsets = array_merge($subsets, $val['subsets']);
366
- }
367
-
368
- $i++;
369
  }
370
 
371
- if( !empty($subsets) ) {
372
- $ret .= '&' . $subset_arg . '=' . implode(',', $subsets);
373
  }
 
 
374
  }
375
 
376
- return $ret;
 
 
377
  }
378
 
379
- /** ======================================================================== */
380
- // End Lazy load fonts
381
- /** ======================================================================== */
382
  }
 
 
 
 
 
1
  <?php
2
+ /**
3
+ * This class configures the google performance settings
4
+ *
5
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
6
+ * @copyright (c) 2017 Webraftic Ltd
7
+ * @version 1.0
8
+ */
9
+
10
+ // Exit if accessed directly
11
+ if ( ! defined( 'ABSPATH' ) ) {
12
+ exit;
13
+ }
14
+
15
+ class WCL_ConfigGooglePerformance extends Wbcr_FactoryClearfy206_Configurate {
16
+
17
  /**
18
+ * @param WCL_Plugin $plugin
 
 
 
19
  */
20
+ public function __construct( WCL_Plugin $plugin ) {
21
+ parent::__construct( $plugin );
22
+
23
+ $this->plugin = $plugin;
24
  }
25
+
26
+ public function registerActionsAndFilters() {
27
+ if ( $this->getPopulateOption( 'disable_google_fonts' ) ) {
28
+ add_action( 'wp_enqueue_scripts', [ $this, 'disableAllGoogleFonts' ], 999 );
 
 
 
 
 
 
 
29
  }
 
 
 
 
 
 
30
 
31
+ if ( ! is_admin() ) {
32
+ $load_google_fonts = $this->getPopulateOption( 'lazy_load_google_fonts' );
33
+ $load_font_awesome = $this->getPopulateOption( 'lazy_load_font_awesome' );
34
 
35
+ if ( $load_google_fonts || $load_font_awesome ) {
36
+ add_action( 'wp_print_styles', [ $this, 'enqueueScripts' ], - 1 );
37
+ }
38
 
39
+ if ( $this->getPopulateOption( 'disable_google_maps' ) ) {
40
+ add_action( "wp_loaded", [ $this, 'disableGoogleMapsObStart' ] );
 
41
  }
42
  }
43
+ }
44
 
45
+ /** ======================================================================== */
46
+ // Disable google maps
47
+ /** ======================================================================== */
48
 
49
+ public function disableGoogleMapsObStart() {
50
+ ob_start( [ $this, 'disableGoogleMapsObEnd' ] );
51
+ }
 
52
 
53
+ /**
54
+ * @param string $html
55
+ *
56
+ * @return mixed
57
+ */
58
+ public function disableGoogleMapsObEnd( $html ) {
59
+ global $post;
60
 
61
+ $exclude_ids = [];
62
+ $exclude_from_disable_google_maps = $this->getPopulateOption( 'exclude_from_disable_google_maps' );
63
 
64
+ if ( '' !== $exclude_from_disable_google_maps ) {
65
+ $exclude_ids = array_map( 'intval', explode( ',', $exclude_from_disable_google_maps ) );
66
+ }
67
+ if ( $post && ! in_array( $post->ID, $exclude_ids, true ) ) {
68
+ $html = preg_replace( '/<script[^<>]*\/\/maps.(googleapis|google|gstatic).com\/[^<>]*><\/script>/i', '', $html );
69
 
70
+ if ( $this->getPopulateOption( 'remove_iframe_google_maps' ) ) {
71
+ $html = preg_replace( '/<iframe[^<>]*\/\/(www\.)?google\.com(\.\w*)?\/maps\/[^<>]*><\/iframe>/i', '', $html );
 
72
  }
 
 
73
  }
74
 
75
+ return $html;
76
+ }
 
77
 
78
+ /** ======================================================================== */
79
+ // End disable google maps
80
+ /** ======================================================================== */
81
 
82
+ public function disableAllGoogleFonts() {
83
+ global $wp_styles;
84
 
85
+ // multiple patterns hook
86
+ $regex = '/fonts\.googleapis\.com\/css\?family/i';
87
 
88
+ if ( ! empty( $wp_styles->registered ) && is_array( $wp_styles->registered ) ) {
89
+ foreach ( $wp_styles->registered as $registered ) {
90
+ if ( preg_match( $regex, $registered->src ) ) {
91
+ wp_dequeue_style( $registered->handle );
92
  }
93
  }
94
  }
95
+ }
96
 
97
+ /** ======================================================================== */
98
+ // Lazy load fonts
99
+ /** ======================================================================== */
100
 
101
+ public function enqueueScripts() {
102
+ $async_links = $this->checkGooglefontsFontawesomeStyles();
 
103
 
104
+ if ( ! empty( $async_links ) ) {
105
+ wp_enqueue_script( $this->plugin->getPluginName() . '-css-lazy-load', WCL_PLUGIN_URL . '/assets/js/css-lazy-load.min.js', [ 'jquery' ], $this->plugin->getPluginVersion() );
106
+ wp_localize_script( $this->plugin->getPluginName() . '-css-lazy-load', 'wbcr_clearfy_async_links', $async_links );
 
107
  }
108
+ }
109
 
110
+ private function checkGooglefontsFontawesomeStyles() {
111
+ global $wp_styles;
112
+
113
+ $ret = [];
114
+
115
+ if ( isset( $wp_styles ) && ! empty( $wp_styles ) ) {
116
+
117
+ $load_google_fonts = $this->getPopulateOption( 'lazy_load_google_fonts', false );
118
+ $load_font_awesome = $this->getPopulateOption( 'lazy_load_font_awesome', false );
119
+
120
+ if ( $load_google_fonts || $load_font_awesome ) {
121
+
122
+ $gfonts_base_url = 'fonts.googleapis.com/css';
123
+ $gfonts_links = [];
124
+
125
+ $font_awesome_slug = 'font-awesome';
126
+ $font_awesome_slug_alt = 'fontawesome';
127
+ $font_awesome_links = [
128
+ 'external' => [],
129
+ 'internal' => [],
130
+ ];
131
+
132
+ foreach ( $wp_styles->queue as $handle ) {
133
+ if ( ! isset( $wp_styles->registered[ $handle ] ) ) {
134
+ continue;
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  }
136
 
137
+ $style = $wp_styles->registered[ $handle ];
138
+ $style_src = isset( $style ) ? $style->src : null;
139
+ $style_ver = isset( $style ) ? $style->ver : false;
140
+
141
+ if ( $load_google_fonts && false !== strpos( $style_src, $gfonts_base_url ) ) {
142
+ $gfonts_links[] = urldecode( str_replace( [ '&amp;' ], [ '&' ], $style_src ) );
143
+
144
+ wp_dequeue_style( $handle );
145
+ } else if ( $load_font_awesome && ( false !== strpos( $style_src, $font_awesome_slug ) || false !== strpos( $style_src, $font_awesome_slug_alt ) ) ) {
146
 
147
+ wp_dequeue_style( $handle );
148
 
149
+ $font_awesome_links[ false !== strpos( $style_src, site_url() ) ? 'internal' : 'external' ][] = [
150
+ 'ver' => $style_ver,
151
+ 'link' => $style_src,
152
+ ];
153
+ }
154
+ }
155
 
156
+ if ( $load_font_awesome && ( ! empty( $font_awesome_links['internal'] ) || ! empty( $font_awesome_links['external'] ) ) ) {
157
 
158
+ // @note: Prioritize external links.
159
+ $fa_links = ! empty( $font_awesome_links['external'] ) ? $font_awesome_links['external'] : $font_awesome_links['internal'];
160
+
161
+ $selected_fa_link = $fa_links[0];
162
+
163
+ $links_count = count( $fa_links );
164
+ if ( 1 < $links_count ) {
165
+ for ( $i = 1; $i < $links_count; $i ++ ) {
166
+ if ( false !== $fa_links[ $i ]['ver'] && ( false === $selected_fa_link['ver'] || version_compare( $selected_fa_link['ver'], $fa_links[ $i ]['ver'], '<' ) ) ) {
167
+ $selected_fa_link = $fa_links[ $i ];
168
  }
169
  }
170
+ }
171
 
172
+ $ret[ $this->plugin->getPluginName() . '-font-awesome' ] = esc_url( $selected_fa_link['link'] );
173
 
174
+ $this->updateSavedFontAwesomeRequests( count( $font_awesome_links['internal'] ) + count( $font_awesome_links['external'] ) );
175
+ } else {
176
+ $this->updateSavedFontAwesomeRequests( 0 );
177
+ }
178
 
179
+ if ( $load_google_fonts && ! empty( $gfonts_links ) ) {
180
 
181
+ $ret[ $this->plugin->getPluginName() . '-google-fonts' ] = esc_url( $this->combineGoogleFontsLinks( $gfonts_links ) );
182
 
183
+ $this->updateSavedGoogleFontsRequest( count( $gfonts_links ) );
 
 
 
184
  } else {
185
+ $this->updateSavedGoogleFontsRequest( 0 );
 
186
  }
187
+ } else {
188
+ $this->updateSavedFontAwesomeRequests( 0 );
189
+ $this->updateSavedGoogleFontsRequest( 0 );
190
  }
 
 
191
  }
192
 
193
+ return $ret;
194
+ }
195
+
196
+ private function updateSavedGoogleFontsRequest( $count ) {
197
+ $count = ! isset( $count ) ? 0 : (int) $count;
198
 
199
+ $old_val = $this->getPopulateOption( 'combined_font_awesome_requests_number' );
200
 
201
+ if ( false === $old_val || ( false !== $old_val && $count > (int) $old_val ) ) {
202
+ $this->updatePopulateOption( 'combined_font_awesome_requests_number', $count );
 
203
  }
204
+ }
205
 
206
+ private function updateSavedFontAwesomeRequests( $count ) {
207
+ $count = ! isset( $count ) ? 0 : (int) $count;
 
 
 
208
 
209
+ $old_val = $this->getPopulateOption( 'combined_google_fonts_requests_number' );
210
 
211
+ if ( false === $old_val || ( false !== $old_val && $count > (int) $old_val ) ) {
212
+ $this->updatePopulateOption( 'combined_google_fonts_requests_number', $count );
 
213
  }
214
+ }
215
 
216
+ public static function saved_external_requests() {
217
+ $google_fonts = (int) WCL_Plugin::app()->getPopulateOption( 'combined_google_fonts_requests_number' );
218
+ $font_awesome = (int) WCL_Plugin::app()->getPopulateOption( 'combined_font_awesome_requests_number' );
 
219
 
220
+ $google_fonts_saved = 1 < $google_fonts ? $google_fonts - 1 : 0;
221
+ $font_awesome_saved = 1 < $font_awesome ? $font_awesome - 1 : 0;
 
 
 
 
222
 
223
+ return $google_fonts_saved + $font_awesome_saved;
224
+ }
225
 
226
+ /**
227
+ * Combine multiple Google Fonts links into one.
228
+ *
229
+ * @param array $links An array of the different Google Fonts links. Default array().
230
+ *
231
+ * @return string|array The compined Google Fonts link.
232
+ */
233
+ private function combineGoogleFontsLinks( $links = [] ) {
 
 
 
 
234
 
235
+ if ( ! is_array( $links ) ) {
236
+ return $links;
237
+ }
238
 
239
+ $links = array_unique( $links );
 
 
240
 
241
+ if ( 1 === count( $links ) ) {
242
+ return $links[0];
243
+ }
 
244
 
245
+ $protocol = 'https';
246
+ $base_url = '//fonts.googleapis.com/css';
247
+ $family_arg = 'family';
248
+ $subset_arg = 'subset';
249
 
250
+ $base_url_len = strlen( $base_url );
251
+ $family_arg_len = strlen( $family_arg );
252
 
253
+ $fonts = [];
254
+ $cnt = 0;
255
 
256
+ $clean_links = [];
257
+ foreach ( $links as $k => $v ) {
258
 
259
+ $base_url_pos = strrpos( $v, $base_url );
260
 
261
+ $args_str = trim( substr( $v, ( $base_url_len + $base_url_pos ), strlen( $v ) ) );
 
 
262
 
263
+ if ( substr( $args_str, 0, $family_arg_len + 2 ) === '?' . $family_arg . '=' ) {
264
+ $args_str = substr( $args_str, $family_arg_len + 2, strlen( $args_str ) );
 
 
 
265
  }
266
 
267
+ $tmp = explode( '|', $args_str );
268
+ $tmp_count = count( $tmp );
269
+ for ( $i = 0; $i < $tmp_count; $i ++ ) {
270
+ $clean_links[] = $tmp[ $i ];
271
+ }
272
+ }
273
 
274
+ foreach ( $clean_links as $k => $v ) {
275
 
276
+ $expl = explode( '&' . $subset_arg, $v );
277
 
278
+ if ( isset( $expl[0] ) && ! empty( $expl[0] ) ) {
279
 
280
+ $tmp = explode( ':', $expl[0] );
281
 
282
+ if ( isset( $tmp[0] ) && ! empty( $tmp[0] ) ) {
 
283
 
284
+ // Has font family name.
285
+ $font_name = str_replace( ' ', '+', $tmp[0] );
286
+
287
+ if ( ! isset( $fonts[ $font_name ] ) ) {
288
+ $fonts[ $font_name ] = [
289
+ 'sizes' => [],
290
+ 'subsets' => [],
291
+ ];
292
+ }
293
 
294
+ if ( isset( $tmp[1] ) && ! empty( $tmp[1] ) ) {
295
 
296
+ // Has font sizes.
297
+ $x = explode( ',', $tmp[1] );
298
+ $xc = count( $x );
299
 
300
+ foreach ( $x as $xk => $xv ) {
301
+ if ( ! in_array( $xv, $fonts[ $font_name ]['sizes'], true ) && ( 400 !== (int) $xv || $xc > 1 ) ) {
302
+ $fonts[ $font_name ]['sizes'][] = $xv;
 
303
  }
304
  }
305
+ }
306
 
307
+ if ( isset( $expl[1] ) && ! empty( $expl[1] ) ) {
308
 
309
+ // Has subsets.
310
+ $y = explode( ',', $expl[1] );
311
+ $yc = count( $y );
312
 
313
+ foreach ( $y as $yk => $yv ) {
314
 
315
+ if ( '=' === substr( $yv, 0, 1 ) ) {
316
+ $yv = substr( $yv, 1, strlen( $yv ) );
317
+ }
318
 
319
+ if ( ! in_array( $yv, $fonts[ $font_name ]['subsets'], true ) && ( 'latin' !== $yv || $yc > 1 ) ) {
320
+ $fonts[ $font_name ]['subsets'][] = $yv;
 
321
  }
322
  }
323
+ }
324
  }// End if().
325
+ }// End if().
326
+ }// End foreach().
327
 
328
+ $ret = '';
329
 
330
+ if ( ! empty( $fonts ) ) {
331
 
332
+ $ret .= $protocol . ':' . $base_url;
333
+ $i = 0;
334
+ $subsets = [];
335
 
336
+ foreach ( $fonts as $key => $val ) {
337
 
338
+ if ( 0 === $i ) {
339
+ $ret .= '?' . $family_arg . '=';
340
+ } else {
341
+ $ret .= '|';
342
+ }
343
 
344
+ $ret .= $key;
345
 
346
+ if ( ! empty( $val['sizes'] ) ) {
347
+ $ret .= ':' . implode( ',', $val['sizes'] );
 
 
 
 
 
 
 
348
  }
349
 
350
+ if ( ! empty( $val['subsets'] ) ) {
351
+ $subsets = array_merge( $subsets, $val['subsets'] );
352
  }
353
+
354
+ $i ++;
355
  }
356
 
357
+ if ( ! empty( $subsets ) ) {
358
+ $ret .= '&' . $subset_arg . '=' . implode( ',', $subsets );
359
+ }
360
  }
361
 
362
+ return $ret;
 
 
363
  }
364
+
365
+ /** ======================================================================== */
366
+ // End Lazy load fonts
367
+ /** ======================================================================== */
368
+ }
includes/classes/class.configurate-performance.php CHANGED
@@ -1,9 +1,10 @@
1
  <?php
2
  /**
3
  * This class configures the code cleanup settings
4
- * @author Webcraftic <wordpress.webraftic@gmail.com>
 
5
  * @copyright (c) 2017 Webraftic Ltd
6
- * @version 1.0
7
  */
8
 
9
  // Exit if accessed directly
@@ -12,72 +13,217 @@ if ( ! defined( 'ABSPATH' ) ) {
12
  }
13
 
14
  class WCL_ConfigPerformance extends Wbcr_FactoryClearfy206_Configurate {
15
-
16
  /**
17
  * @param WCL_Plugin $plugin
18
  */
19
  public function __construct( WCL_Plugin $plugin ) {
20
  parent::__construct( $plugin );
21
-
22
  $this->plugin = $plugin;
23
  }
24
-
25
  public function registerActionsAndFilters() {
26
  if ( $this->getPopulateOption( 'disable_emoji' ) ) {
27
- add_action( 'init', array( $this, 'disableEmojis' ) );
28
  }
29
-
30
- if ( $this->getPopulateOption( 'remove_jquery_migrate' ) && ! is_admin() ) {
31
- add_filter( 'wp_default_scripts', array( $this, 'removeJqueryMigrate' ) );
32
- }
33
-
34
  if ( $this->getPopulateOption( 'disable_embeds' ) ) {
35
- add_action( 'init', array( $this, 'disableEmbeds' ) );
36
  }
37
-
38
  if ( $this->getPopulateOption( 'disable_json_rest_api' ) ) {
39
  $this->removeRestApi();
40
  }
41
-
 
 
 
 
 
 
 
 
42
  if ( ! is_admin() ) {
 
 
 
 
43
  if ( $this->getPopulateOption( 'disable_feed' ) ) {
44
  $this->disableFeed();
45
  }
46
-
47
  if ( $this->getPopulateOption( 'disable_dashicons' ) ) {
48
- add_action( 'wp_print_styles', array( $this, 'disableDashicons' ), - 1 );
49
  }
50
-
51
  if ( $this->getPopulateOption( 'remove_xfn_link' ) ) {
52
- add_action( 'wp_loaded', array( $this, 'htmlCompressor' ) );
53
  }
54
-
55
  if ( $this->getPopulateOption( 'remove_recent_comments_style' ) ) {
56
- add_action( 'widgets_init', array( $this, 'removeRecentCommentsStyle' ) );
57
  }
58
-
59
  /**
60
  * Priority set to 9999. Higher numbers correspond with later execution.
61
  * Hook into the style loader and remove the version information.
62
  */
63
-
64
  if ( $this->getPopulateOption( 'remove_style_version' ) ) {
65
- add_filter( 'style_loader_src', array( $this, 'hideWordpressVersionInScript' ), 9999, 2 );
66
  }
67
-
68
  /**
69
  * Hook into the script loader and remove the version information.
70
  */
71
-
72
  if ( $this->getPopulateOption( 'remove_js_version' ) ) {
73
- add_filter( 'script_loader_src', array( $this, 'hideWordpressVersionInScript' ), 9999, 2 );
74
  }
75
-
76
  $this->remove_tags_from_head();
 
 
 
 
 
 
 
 
 
 
77
  }
78
  }
79
-
80
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  /**
82
  * Remove wp version from any enqueued scripts
83
  *
@@ -86,20 +232,21 @@ class WCL_ConfigPerformance extends Wbcr_FactoryClearfy206_Configurate {
86
  * @return string
87
  */
88
  public function hideWordpressVersionInScript( $src, $handle ) {
89
- if ( is_user_logged_in() and $this->getPopulateOption( 'disable_remove_style_version_for_auth_users', false ) ) {
90
  return $src;
91
  }
 
92
  $filename_arr = explode( '?', basename( $src ) );
93
  $exclude_file_list = $this->getPopulateOption( 'remove_version_exclude', '' );
94
  $exclude_files_arr = array_map( 'trim', explode( PHP_EOL, $exclude_file_list ) );
95
-
96
  if ( strpos( $src, 'ver=' ) && ! in_array( str_replace( '?' . $filename_arr[1], '', $src ), $exclude_files_arr, true ) ) {
97
  $src = remove_query_arg( 'ver', $src );
98
  }
99
-
100
  return $src;
101
  }
102
-
103
  /**
104
  * Disable dashicons for all but the auth user
105
  */
@@ -108,7 +255,7 @@ class WCL_ConfigPerformance extends Wbcr_FactoryClearfy206_Configurate {
108
  wp_deregister_style( 'dashicons' );
109
  }
110
  }
111
-
112
  /**
113
  * Disable the emoji's
114
  */
@@ -121,37 +268,37 @@ class WCL_ConfigPerformance extends Wbcr_FactoryClearfy206_Configurate {
121
  remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
122
  remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
123
  add_filter( 'emoji_svg_url', '__return_false' );
124
- add_filter( 'tiny_mce_plugins', array( $this, 'disableEmojisTinymce' ) );
125
- add_filter( 'wp_resource_hints', array( $this, 'disableEmojisRemoveDnsPrefetch' ), 10, 2 );
126
  }
127
-
128
  /**
129
  * Filter function used to remove the tinymce emoji plugin.
130
  *
131
- * @param array $plugins
132
  *
133
  * @return array Difference betwen the two arrays
134
  */
135
  function disableEmojisTinymce( $plugins ) {
136
  if ( is_array( $plugins ) ) {
137
- return array_diff( $plugins, array( 'wpemoji' ) );
138
  }
139
-
140
- return array();
141
  }
142
-
143
  /**
144
  * Remove emoji CDN hostname from DNS prefetching hints.
145
  *
146
- * @param array $urls URLs to print for resource hints.
147
- * @param string $relation_type The relation type the URLs are printed for.
148
  *
149
  * @return array Difference betwen the two arrays.
150
  */
151
  function disableEmojisRemoveDnsPrefetch( $urls, $relation_type ) {
152
-
153
  if ( 'dns-prefetch' == $relation_type ) {
154
-
155
  // Strip out any URLs referencing the WordPress.org emoji location
156
  $emoji_svg_url_bit = 'https://s.w.org/images/core/emoji/';
157
  foreach ( $urls as $key => $url ) {
@@ -160,10 +307,10 @@ class WCL_ConfigPerformance extends Wbcr_FactoryClearfy206_Configurate {
160
  }
161
  }
162
  }
163
-
164
  return $urls;
165
  }
166
-
167
  /**
168
  * Disables the WP REST API for visitors not logged into WordPress.
169
  */
@@ -173,82 +320,82 @@ class WCL_ConfigPerformance extends Wbcr_FactoryClearfy206_Configurate {
173
  Link: <https://example.com/wp-json/>; rel="https://api.w.org/"
174
  */
175
  remove_action( 'template_redirect', 'rest_output_link_header', 11 );
176
-
177
  /*
178
  Disable REST API links in HTML <head>
179
  <link rel='https://api.w.org/' href='https://example.com/wp-json/' />
180
  */
181
  remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
182
  remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
183
-
184
  /*
185
  Disable REST API
186
  */
187
  if ( version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ) {
188
- add_filter( 'rest_authentication_errors', array( $this, 'disableWpRestApi' ) );
189
  } else {
190
  // REST API 1.x
191
  add_filter( 'json_enabled', '__return_false' );
192
  add_filter( 'json_jsonp_enabled', '__return_false' );
193
-
194
  // REST API 2.x
195
  add_filter( 'rest_enabled', '__return_false' );
196
  add_filter( 'rest_jsonp_enabled', '__return_false' );
197
  }
198
  }
199
-
200
  public function disableWpRestApi( $access ) {
201
  if ( ! is_user_logged_in() ) {
202
-
203
  $message = apply_filters( 'disable_wp_rest_api_error', __( 'REST API restricted to authenticated users.', 'clearfy' ) );
204
-
205
- return new WP_Error( 'rest_login_required', $message, array( 'status' => rest_authorization_required_code() ) );
206
  }
207
-
208
  return $access;
209
  }
210
-
211
-
212
  // todo: не работает должным образом, проверить
213
  public function removeRecentCommentsStyle() {
214
  global $wp_widget_factory;
215
-
216
  $widget_recent_comments = isset( $wp_widget_factory->widgets['WP_Widget_Recent_Comments'] ) ? $wp_widget_factory->widgets['WP_Widget_Recent_Comments'] : null;
217
-
218
  if ( ! empty( $widget_recent_comments ) ) {
219
- remove_action( 'wp_head', array(
220
  $wp_widget_factory->widgets['WP_Widget_Recent_Comments'],
221
  'recent_comments_style'
222
- ) );
223
  }
224
  }
225
-
226
  /**
227
  * Disable feeds
228
  */
229
  public function disableFeed() {
230
- add_action( 'wp_loaded', array( $this, 'removeFeedLinks' ) );
231
- add_action( 'template_redirect', array( $this, 'filterFeeds' ), 1 );
232
- add_filter( 'bbp_request', array( $this, 'filterBbpFeeds' ), 9 );
233
  }
234
-
235
-
236
  public function removeFeedLinks() {
237
  remove_action( 'wp_head', 'feed_links', 2 );
238
  remove_action( 'wp_head', 'feed_links_extra', 3 );
239
  }
240
-
241
  public function filterFeeds() {
242
  if ( ! is_feed() || is_404() ) {
243
  return;
244
  }
245
-
246
  $this->disabled_feed_behaviour();
247
  }
248
-
249
  public function disabled_feed_behaviour() {
250
  global $wp_rewrite, $wp_query;
251
-
252
  if ( $this->getPopulateOption( 'disabled_feed_behaviour', 'redirect_301' ) == 'redirect_404' ) {
253
  $wp_query->is_feed = false;
254
  $wp_query->set_404();
@@ -260,60 +407,60 @@ class WCL_ConfigPerformance extends Wbcr_FactoryClearfy206_Configurate {
260
  wp_redirect( esc_url_raw( remove_query_arg( 'feed' ) ), 301 );
261
  exit;
262
  }
263
-
264
  if ( 'old' !== get_query_var( 'feed' ) ) { // WP redirects these anyway, and removing the query var will confuse it thoroughly
265
  set_query_var( 'feed', '' );
266
  }
267
-
268
  redirect_canonical(); // Let WP figure out the appropriate redirect URL.
269
-
270
  // Still here? redirect_canonical failed to redirect, probably because of a filter. Try the hard way.
271
  $struct = ( ! is_singular() && is_comment_feed() ) ? $wp_rewrite->get_comment_feed_permastruct() : $wp_rewrite->get_feed_permastruct();
272
-
273
  $struct = preg_quote( $struct, '#' );
274
  $struct = str_replace( '%feed%', '(\w+)?', $struct );
275
  $struct = preg_replace( '#/+#', '/', $struct );
276
  $requested_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
277
-
278
  $new_url = preg_replace( '#' . $struct . '/?$#', '', $requested_url );
279
-
280
  if ( $new_url !== $requested_url ) {
281
  wp_redirect( $new_url, 301 );
282
  exit;
283
  }
284
  }
285
  }
286
-
287
  /**
288
  * BBPress feed detection sourced from bbp_request_feed_trap() in BBPress Core.
289
  *
290
- * @param array $query_vars
291
  *
292
  * @return array
293
  */
294
  public function filterBbpFeeds( $query_vars ) {
295
  // Looking at a feed
296
  if ( isset( $query_vars['feed'] ) ) {
297
-
298
  // Forum/Topic/Reply Feed
299
  if ( isset( $query_vars['post_type'] ) ) {
300
-
301
  // Matched post type
302
  $post_type = false;
303
- $post_types = array();
304
-
305
  if ( function_exists( 'bbp_get_forum_post_type' ) && function_exists( 'bbp_get_topic_post_type' ) && function_exists( 'bbp_get_reply_post_type' ) ) // Post types to check
306
  {
307
- $post_types = array(
308
  bbp_get_forum_post_type(),
309
  bbp_get_topic_post_type(),
310
  bbp_get_reply_post_type(),
311
- );
312
  }
313
-
314
  // Cast query vars as array outside of foreach loop
315
  $qv_array = (array) $query_vars['post_type'];
316
-
317
  // Check if this query is for a bbPress post type
318
  foreach ( $post_types as $bbp_pt ) {
319
  if ( in_array( $bbp_pt, $qv_array, true ) ) {
@@ -321,49 +468,46 @@ class WCL_ConfigPerformance extends Wbcr_FactoryClearfy206_Configurate {
321
  break;
322
  }
323
  }
324
-
325
  // Looking at a bbPress post type
326
  if ( ! empty( $post_type ) ) {
327
  $this->disabled_feed_behaviour();
328
  }
329
  }
330
  }
331
-
332
  // No feed so continue on
333
  return $query_vars;
334
  }
335
-
336
  /**
337
  * Remove unused tags from head
338
  */
339
  public function remove_tags_from_head() {
340
- /*if( $this->getPopulateOption('remove_dns_prefetch') ) {
341
- remove_action('wp_head', 'wp_resource_hints', 2);
342
- }*/
343
-
344
  if ( $this->getPopulateOption( 'remove_rsd_link' ) ) {
345
  remove_action( 'wp_head', 'rsd_link' );
346
  }
347
-
348
  if ( $this->getPopulateOption( 'remove_wlw_link' ) ) {
349
  remove_action( 'wp_head', 'wlwmanifest_link' );
350
  }
351
-
352
  if ( $this->getPopulateOption( 'remove_adjacent_posts_link' ) ) {
353
- remove_action( 'wp_head', 'adjacent_posts_rel_link', 10, 0 );
354
- remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
355
  }
356
-
357
  if ( $this->getPopulateOption( 'remove_shortlink_link' ) ) {
358
- remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );
359
- remove_action( 'template_redirect', 'wp_shortlink_header', 11, 0 );
360
  }
361
-
362
  if ( $this->getPopulateOption( 'remove_xfn_link' ) ) {
363
- add_filter( 'avf_profile_head_tag', array( $this, 'removeXfnLink' ) );
364
  }
365
  }
366
-
367
  /**
368
  * For more information about XFN relationships and examples concerning their use, see the
369
  *
@@ -373,7 +517,7 @@ class WCL_ConfigPerformance extends Wbcr_FactoryClearfy206_Configurate {
373
  public function removeXfnLink() {
374
  return false;
375
  }
376
-
377
  /**
378
  * Remove jQuery Migrate
379
  *
@@ -381,36 +525,36 @@ class WCL_ConfigPerformance extends Wbcr_FactoryClearfy206_Configurate {
381
  */
382
  public function removeJqueryMigrate( &$scripts ) {
383
  $scripts->remove( 'jquery' );
384
- $scripts->add( 'jquery', false, array( 'jquery-core' ), '1.12.4' );
385
  }
386
-
387
  // Disable Embeds
388
  public function disableEmbeds() {
389
  global $wp, $wp_embed;
390
-
391
- $wp->public_query_vars = array_diff( $wp->public_query_vars, array( 'embed' ) );
392
- remove_filter( 'the_content', array( $wp_embed, 'autoembed' ), 8 );
393
-
394
  // Remove content feed filter
395
  remove_filter( 'the_content_feed', '_oembed_filter_feed_content' );
396
-
397
  // Abort embed libraries loading
398
  remove_action( 'plugins_loaded', 'wp_maybe_load_embeds', 0 );
399
-
400
  // No auto-embedding support
401
  add_filter( 'pre_option_embed_autourls', '__return_false' );
402
-
403
  // Avoid oEmbed auto discovery
404
  add_filter( 'embed_oembed_discover', '__return_false' );
405
-
406
  // Remove REST API related hooks
407
  remove_action( 'rest_api_init', 'wp_oembed_register_route' );
408
  remove_filter( 'rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10 );
409
-
410
  // Remove header actions
411
  remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
412
  remove_action( 'wp_head', 'wp_oembed_add_host_js' );
413
-
414
  remove_action( 'embed_head', 'enqueue_embed_scripts', 1 );
415
  remove_action( 'embed_head', 'print_emoji_detection_script' );
416
  remove_action( 'embed_head', 'print_embed_styles' );
@@ -419,39 +563,39 @@ class WCL_ConfigPerformance extends Wbcr_FactoryClearfy206_Configurate {
419
  remove_action( 'embed_head', 'wp_no_robots' );
420
  remove_action( 'embed_head', 'rel_canonical' );
421
  remove_action( 'embed_head', 'locale_stylesheet', 30 );
422
-
423
  remove_action( 'embed_content_meta', 'print_embed_comments_button' );
424
  remove_action( 'embed_content_meta', 'print_embed_sharing_button' );
425
-
426
  remove_action( 'embed_footer', 'print_embed_sharing_dialog' );
427
  remove_action( 'embed_footer', 'print_embed_scripts' );
428
  remove_action( 'embed_footer', 'wp_print_footer_scripts', 20 );
429
-
430
  remove_filter( 'excerpt_more', 'wp_embed_excerpt_more', 20 );
431
  remove_filter( 'the_excerpt_embed', 'wptexturize' );
432
  remove_filter( 'the_excerpt_embed', 'convert_chars' );
433
  remove_filter( 'the_excerpt_embed', 'wpautop' );
434
  remove_filter( 'the_excerpt_embed', 'shortcode_unautop' );
435
  remove_filter( 'the_excerpt_embed', 'wp_embed_excerpt_attachment' );
436
-
437
  // Remove data and results filters
438
  remove_filter( 'oembed_dataparse', 'wp_filter_oembed_result', 10 );
439
  remove_filter( 'oembed_response_data', 'get_oembed_response_data_rich', 10 );
440
  remove_filter( 'pre_oembed_result', 'wp_filter_pre_oembed_result', 10 );
441
-
442
  // WooCommerce embeds in short description
443
  remove_filter( 'woocommerce_short_description', 'wc_do_oembeds' );
444
-
445
- add_filter( 'tiny_mce_plugins', array( $this, 'disableEmbedsTinyMcePlugin' ) );
446
- add_filter( 'rewrite_rules_array', array( $this, 'disableEmbedsRewrites' ) );
447
  }
448
-
449
  public function disableEmbedsTinyMcePlugin( $plugins ) {
450
- return array_diff( $plugins, array( 'wpembed', 'wpview' ) );
451
  }
452
-
453
  public function disableEmbedsRewrites( $rules ) {
454
- $new_rules = array();
455
  foreach ( $rules as $rule => $rewrite ) {
456
  if ( false !== ( $pos = strpos( $rewrite, '?' ) ) ) {
457
  $params = explode( '&', substr( $rewrite, $pos + 1 ) );
@@ -461,25 +605,25 @@ class WCL_ConfigPerformance extends Wbcr_FactoryClearfy206_Configurate {
461
  }
462
  $new_rules[ $rule ] = $rewrite;
463
  }
464
-
465
  return $new_rules;
466
  }
467
-
468
  public function htmlCompressor() {
469
- ob_start( array( $this, 'htmlCompressorMain' ) );
470
  }
471
-
472
  public function htmlCompressorMain( $content ) {
473
  $old_content = $content;
474
-
475
  if ( $this->getPopulateOption( 'remove_xfn_link' ) ) {
476
  $content = preg_replace( '/<link[^>]+href=(?:\'|")https?:\/\/gmpg.org\/xfn\/11(?:\'|")(?:[^>]+)?>/', '', $content );
477
-
478
  if ( empty( $content ) ) {
479
  $content = $old_content;
480
  }
481
  }
482
-
483
  return $content;
484
  }
485
  }
1
  <?php
2
  /**
3
  * This class configures the code cleanup settings
4
+ *
5
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
6
  * @copyright (c) 2017 Webraftic Ltd
7
+ * @version 1.0
8
  */
9
 
10
  // Exit if accessed directly
13
  }
14
 
15
  class WCL_ConfigPerformance extends Wbcr_FactoryClearfy206_Configurate {
16
+
17
  /**
18
  * @param WCL_Plugin $plugin
19
  */
20
  public function __construct( WCL_Plugin $plugin ) {
21
  parent::__construct( $plugin );
22
+
23
  $this->plugin = $plugin;
24
  }
25
+
26
  public function registerActionsAndFilters() {
27
  if ( $this->getPopulateOption( 'disable_emoji' ) ) {
28
+ add_action( 'init', [ $this, 'disableEmojis' ] );
29
  }
30
+
 
 
 
 
31
  if ( $this->getPopulateOption( 'disable_embeds' ) ) {
32
+ add_action( 'init', [ $this, 'disableEmbeds' ] );
33
  }
34
+
35
  if ( $this->getPopulateOption( 'disable_json_rest_api' ) ) {
36
  $this->removeRestApi();
37
  }
38
+
39
+ if ( ( $this->getPopulateOption( 'revision_limit' ) || $this->getPopulateOption( 'revisions_disable' ) ) ) {
40
+ add_filter( 'wp_revisions_to_keep', [ $this, 'revisions_to_keep' ], 10, 2 );
41
+
42
+ if ( $this->getPopulateOption( 'revisions_disable' ) ) {
43
+ add_action( 'admin_init', [ $this, 'disable_revision_support' ] );
44
+ }
45
+ }
46
+
47
  if ( ! is_admin() ) {
48
+ if ( $this->getPopulateOption( 'remove_jquery_migrate' ) ) {
49
+ add_filter( 'wp_default_scripts', [ $this, 'removeJqueryMigrate' ] );
50
+ }
51
+
52
  if ( $this->getPopulateOption( 'disable_feed' ) ) {
53
  $this->disableFeed();
54
  }
55
+
56
  if ( $this->getPopulateOption( 'disable_dashicons' ) ) {
57
+ add_action( 'wp_print_styles', [ $this, 'disableDashicons' ], - 1 );
58
  }
59
+
60
  if ( $this->getPopulateOption( 'remove_xfn_link' ) ) {
61
+ add_action( 'wp_loaded', [ $this, 'htmlCompressor' ] );
62
  }
63
+
64
  if ( $this->getPopulateOption( 'remove_recent_comments_style' ) ) {
65
+ add_action( 'widgets_init', [ $this, 'removeRecentCommentsStyle' ] );
66
  }
67
+
68
  /**
69
  * Priority set to 9999. Higher numbers correspond with later execution.
70
  * Hook into the style loader and remove the version information.
71
  */
72
+
73
  if ( $this->getPopulateOption( 'remove_style_version' ) ) {
74
+ add_filter( 'style_loader_src', [ $this, 'hideWordpressVersionInScript' ], 9999, 2 );
75
  }
76
+
77
  /**
78
  * Hook into the script loader and remove the version information.
79
  */
80
+
81
  if ( $this->getPopulateOption( 'remove_js_version' ) ) {
82
+ add_filter( 'script_loader_src', [ $this, 'hideWordpressVersionInScript' ], 9999, 2 );
83
  }
84
+
85
  $this->remove_tags_from_head();
86
+ } else {
87
+ if ( $this->getPopulateOption( 'disable_post_autosave' ) ) {
88
+ add_action( 'wp_print_scripts', [ $this, 'disable_posts_autosave' ] );
89
+ }
90
+ }
91
+
92
+ if ( $this->getPopulateOption( 'gutenberg_autosave_control' ) ) {
93
+ add_action( 'admin_init', [ $this, 'register_gutenberg_autosave_settings' ] );
94
+ add_action( 'rest_api_init', [ $this, 'gutenberg_autosave_rest_mapping' ] );
95
+ add_action( 'enqueue_block_editor_assets', [ $this, 'enqueue_gutenberg_autosave_assets' ] );
96
  }
97
  }
98
+
99
+ /**
100
+ * Gutenberg assets.
101
+ */
102
+ public function enqueue_gutenberg_autosave_assets() {
103
+ /**
104
+ * Styles.
105
+ */
106
+ wp_enqueue_style( 'wbcr-clearfy-gutenberg-autosave', WCL_PLUGIN_URL . '/admin/assets/css/gutenberg-autosave-control.css', [], $this->plugin->getPluginVersion(), 'all' );
107
+
108
+ /**
109
+ * Scripts.
110
+ */
111
+ wp_enqueue_script( 'wbcr-clearfy-gutenberg-autosave', WCL_PLUGIN_URL . '/admin/assets/gutenberg/build/index.build.js', [
112
+ 'react',
113
+ 'wp-api-fetch',
114
+ 'wp-components',
115
+ 'wp-compose',
116
+ 'wp-data',
117
+ 'wp-edit-post',
118
+ 'wp-i18n',
119
+ 'wp-plugins',
120
+ ], $this->plugin->getPluginVersion(), true );
121
+ // todo: It is necessary to cteate the localization for the Gutenberg widget, which is responsible for the selection of AutoSave intveraval.
122
+ }
123
+
124
+ /**
125
+ * Register settings for Gutenberg
126
+ */
127
+ public function register_gutenberg_autosave_settings() {
128
+ register_setting( 'clearfy-gutenberg-autosave', $this->plugin->getPrefix() . 'autosave_interval', [ 'default' => 99999 ] );
129
+ }
130
+
131
+ /**
132
+ * Get interval option.
133
+ *
134
+ * @return int
135
+ */
136
+ public function get_gutenberg_autosave_interval() {
137
+ return (int) $this->getOption( 'gutenberg_autosave_interval', 99999 );
138
+ }
139
+
140
+ /**
141
+ * Set interval option.
142
+ *
143
+ * @param \WP_REST_Request $request
144
+ *
145
+ * @return mixed
146
+ */
147
+ public function set_get_gutenberg_autosave_interval( \WP_REST_Request $request ) {
148
+ if ( ! isset( $request['interval'] ) ) {
149
+ return new \WP_Error( 'no_interval', __( 'No interval specified', 'clearfy' ), [ 'status' => 400 ] );
150
+ }
151
+
152
+ return $this->updateOption( 'gutenberg_autosave_interval', (int) $request['interval'] );
153
+ }
154
+
155
+ /**
156
+ * Setup REST API for managing interval option. Сreates an endpoint
157
+ * for working with autosave in gutenberg editor.
158
+ */
159
+ public function gutenberg_autosave_rest_mapping() {
160
+ register_rest_route( 'clearfy-gutenberg-autosave/v1', '/interval', [
161
+ [
162
+ 'methods' => \WP_REST_Server::READABLE,
163
+ 'callback' => [ $this, 'get_gutenberg_autosave_interval' ],
164
+ ],
165
+ [
166
+ 'methods' => \WP_REST_Server::CREATABLE,
167
+ 'callback' => [ $this, 'set_get_gutenberg_autosave_interval' ],
168
+ 'args' => [
169
+ 'interval' => [
170
+ 'validate_callback' => function ( $param, $request, $key ) {
171
+ return is_numeric( $param );
172
+ },
173
+ ],
174
+ ],
175
+ 'permission_callback' => function () {
176
+ return WCL_Plugin::app()->currentUserCan();
177
+ },
178
+ ],
179
+ ] );
180
+ }
181
+
182
+
183
+ /**
184
+ * Disables automatic saving drafts.
185
+ */
186
+ public function disable_posts_autosave() {
187
+ wp_deregister_script( 'autosave' );
188
+ }
189
+
190
+ /**
191
+ * Full disable revision support in Wordpress
192
+ *
193
+ * @since 1.5.1
194
+ */
195
+ public function disable_revision_support() {
196
+ $post_types = get_post_types();
197
+
198
+ if ( ! is_array( $post_types ) || empty( $post_types ) ) {
199
+ return;
200
+ }
201
+
202
+ foreach ( $post_types as $post_type ) {
203
+ remove_post_type_support( $post_type, 'revisions' );
204
+ }
205
+ }
206
+
207
+ /**
208
+ * Revisions limit
209
+ *
210
+ * @since 0.9.5
211
+ */
212
+
213
+ public function revisions_to_keep( $num, $post ) {
214
+ $revision_limit = $this->getPopulateOption( 'revision_limit', null );
215
+ if ( $revision_limit ) {
216
+ $num = (int) $revision_limit;
217
+ }
218
+
219
+ if ( $this->getPopulateOption( 'revisions_disable' ) ) {
220
+ $num = 0;
221
+ }
222
+
223
+ return $num;
224
+ }
225
+
226
+
227
  /**
228
  * Remove wp version from any enqueued scripts
229
  *
232
  * @return string
233
  */
234
  public function hideWordpressVersionInScript( $src, $handle ) {
235
+ if ( is_user_logged_in() ) {
236
  return $src;
237
  }
238
+
239
  $filename_arr = explode( '?', basename( $src ) );
240
  $exclude_file_list = $this->getPopulateOption( 'remove_version_exclude', '' );
241
  $exclude_files_arr = array_map( 'trim', explode( PHP_EOL, $exclude_file_list ) );
242
+
243
  if ( strpos( $src, 'ver=' ) && ! in_array( str_replace( '?' . $filename_arr[1], '', $src ), $exclude_files_arr, true ) ) {
244
  $src = remove_query_arg( 'ver', $src );
245
  }
246
+
247
  return $src;
248
  }
249
+
250
  /**
251
  * Disable dashicons for all but the auth user
252
  */
255
  wp_deregister_style( 'dashicons' );
256
  }
257
  }
258
+
259
  /**
260
  * Disable the emoji's
261
  */
268
  remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
269
  remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
270
  add_filter( 'emoji_svg_url', '__return_false' );
271
+ add_filter( 'tiny_mce_plugins', [ $this, 'disableEmojisTinymce' ] );
272
+ add_filter( 'wp_resource_hints', [ $this, 'disableEmojisRemoveDnsPrefetch' ], 10, 2 );
273
  }
274
+
275
  /**
276
  * Filter function used to remove the tinymce emoji plugin.
277
  *
278
+ * @param array $plugins
279
  *
280
  * @return array Difference betwen the two arrays
281
  */
282
  function disableEmojisTinymce( $plugins ) {
283
  if ( is_array( $plugins ) ) {
284
+ return array_diff( $plugins, [ 'wpemoji' ] );
285
  }
286
+
287
+ return [];
288
  }
289
+
290
  /**
291
  * Remove emoji CDN hostname from DNS prefetching hints.
292
  *
293
+ * @param array $urls URLs to print for resource hints.
294
+ * @param string $relation_type The relation type the URLs are printed for.
295
  *
296
  * @return array Difference betwen the two arrays.
297
  */
298
  function disableEmojisRemoveDnsPrefetch( $urls, $relation_type ) {
299
+
300
  if ( 'dns-prefetch' == $relation_type ) {
301
+
302
  // Strip out any URLs referencing the WordPress.org emoji location
303
  $emoji_svg_url_bit = 'https://s.w.org/images/core/emoji/';
304
  foreach ( $urls as $key => $url ) {
307
  }
308
  }
309
  }
310
+
311
  return $urls;
312
  }
313
+
314
  /**
315
  * Disables the WP REST API for visitors not logged into WordPress.
316
  */
320
  Link: <https://example.com/wp-json/>; rel="https://api.w.org/"
321
  */
322
  remove_action( 'template_redirect', 'rest_output_link_header', 11 );
323
+
324
  /*
325
  Disable REST API links in HTML <head>
326
  <link rel='https://api.w.org/' href='https://example.com/wp-json/' />
327
  */
328
  remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
329
  remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
330
+
331
  /*
332
  Disable REST API
333
  */
334
  if ( version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ) {
335
+ add_filter( 'rest_authentication_errors', [ $this, 'disableWpRestApi' ] );
336
  } else {
337
  // REST API 1.x
338
  add_filter( 'json_enabled', '__return_false' );
339
  add_filter( 'json_jsonp_enabled', '__return_false' );
340
+
341
  // REST API 2.x
342
  add_filter( 'rest_enabled', '__return_false' );
343
  add_filter( 'rest_jsonp_enabled', '__return_false' );
344
  }
345
  }
346
+
347
  public function disableWpRestApi( $access ) {
348
  if ( ! is_user_logged_in() ) {
349
+
350
  $message = apply_filters( 'disable_wp_rest_api_error', __( 'REST API restricted to authenticated users.', 'clearfy' ) );
351
+
352
+ return new WP_Error( 'rest_login_required', $message, [ 'status' => rest_authorization_required_code() ] );
353
  }
354
+
355
  return $access;
356
  }
357
+
358
+
359
  // todo: не работает должным образом, проверить
360
  public function removeRecentCommentsStyle() {
361
  global $wp_widget_factory;
362
+
363
  $widget_recent_comments = isset( $wp_widget_factory->widgets['WP_Widget_Recent_Comments'] ) ? $wp_widget_factory->widgets['WP_Widget_Recent_Comments'] : null;
364
+
365
  if ( ! empty( $widget_recent_comments ) ) {
366
+ remove_action( 'wp_head', [
367
  $wp_widget_factory->widgets['WP_Widget_Recent_Comments'],
368
  'recent_comments_style'
369
+ ] );
370
  }
371
  }
372
+
373
  /**
374
  * Disable feeds
375
  */
376
  public function disableFeed() {
377
+ add_action( 'wp_loaded', [ $this, 'removeFeedLinks' ] );
378
+ add_action( 'template_redirect', [ $this, 'filterFeeds' ], 1 );
379
+ add_filter( 'bbp_request', [ $this, 'filterBbpFeeds' ], 9 );
380
  }
381
+
382
+
383
  public function removeFeedLinks() {
384
  remove_action( 'wp_head', 'feed_links', 2 );
385
  remove_action( 'wp_head', 'feed_links_extra', 3 );
386
  }
387
+
388
  public function filterFeeds() {
389
  if ( ! is_feed() || is_404() ) {
390
  return;
391
  }
392
+
393
  $this->disabled_feed_behaviour();
394
  }
395
+
396
  public function disabled_feed_behaviour() {
397
  global $wp_rewrite, $wp_query;
398
+
399
  if ( $this->getPopulateOption( 'disabled_feed_behaviour', 'redirect_301' ) == 'redirect_404' ) {
400
  $wp_query->is_feed = false;
401
  $wp_query->set_404();
407
  wp_redirect( esc_url_raw( remove_query_arg( 'feed' ) ), 301 );
408
  exit;
409
  }
410
+
411
  if ( 'old' !== get_query_var( 'feed' ) ) { // WP redirects these anyway, and removing the query var will confuse it thoroughly
412
  set_query_var( 'feed', '' );
413
  }
414
+
415
  redirect_canonical(); // Let WP figure out the appropriate redirect URL.
416
+
417
  // Still here? redirect_canonical failed to redirect, probably because of a filter. Try the hard way.
418
  $struct = ( ! is_singular() && is_comment_feed() ) ? $wp_rewrite->get_comment_feed_permastruct() : $wp_rewrite->get_feed_permastruct();
419
+
420
  $struct = preg_quote( $struct, '#' );
421
  $struct = str_replace( '%feed%', '(\w+)?', $struct );
422
  $struct = preg_replace( '#/+#', '/', $struct );
423
  $requested_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
424
+
425
  $new_url = preg_replace( '#' . $struct . '/?$#', '', $requested_url );
426
+
427
  if ( $new_url !== $requested_url ) {
428
  wp_redirect( $new_url, 301 );
429
  exit;
430
  }
431
  }
432
  }
433
+
434
  /**
435
  * BBPress feed detection sourced from bbp_request_feed_trap() in BBPress Core.
436
  *
437
+ * @param array $query_vars
438
  *
439
  * @return array
440
  */
441
  public function filterBbpFeeds( $query_vars ) {
442
  // Looking at a feed
443
  if ( isset( $query_vars['feed'] ) ) {
444
+
445
  // Forum/Topic/Reply Feed
446
  if ( isset( $query_vars['post_type'] ) ) {
447
+
448
  // Matched post type
449
  $post_type = false;
450
+ $post_types = [];
451
+
452
  if ( function_exists( 'bbp_get_forum_post_type' ) && function_exists( 'bbp_get_topic_post_type' ) && function_exists( 'bbp_get_reply_post_type' ) ) // Post types to check
453
  {
454
+ $post_types = [
455
  bbp_get_forum_post_type(),
456
  bbp_get_topic_post_type(),
457
  bbp_get_reply_post_type(),
458
+ ];
459
  }
460
+
461
  // Cast query vars as array outside of foreach loop
462
  $qv_array = (array) $query_vars['post_type'];
463
+
464
  // Check if this query is for a bbPress post type
465
  foreach ( $post_types as $bbp_pt ) {
466
  if ( in_array( $bbp_pt, $qv_array, true ) ) {
468
  break;
469
  }
470
  }
471
+
472
  // Looking at a bbPress post type
473
  if ( ! empty( $post_type ) ) {
474
  $this->disabled_feed_behaviour();
475
  }
476
  }
477
  }
478
+
479
  // No feed so continue on
480
  return $query_vars;
481
  }
482
+
483
  /**
484
  * Remove unused tags from head
485
  */
486
  public function remove_tags_from_head() {
487
+
 
 
 
488
  if ( $this->getPopulateOption( 'remove_rsd_link' ) ) {
489
  remove_action( 'wp_head', 'rsd_link' );
490
  }
491
+
492
  if ( $this->getPopulateOption( 'remove_wlw_link' ) ) {
493
  remove_action( 'wp_head', 'wlwmanifest_link' );
494
  }
495
+
496
  if ( $this->getPopulateOption( 'remove_adjacent_posts_link' ) ) {
497
+ remove_action( 'wp_head', 'adjacent_posts_rel_link' );
498
+ remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head' );
499
  }
500
+
501
  if ( $this->getPopulateOption( 'remove_shortlink_link' ) ) {
502
+ remove_action( 'wp_head', 'wp_shortlink_wp_head' );
503
+ remove_action( 'template_redirect', 'wp_shortlink_header', 11 );
504
  }
505
+
506
  if ( $this->getPopulateOption( 'remove_xfn_link' ) ) {
507
+ add_filter( 'avf_profile_head_tag', [ $this, 'removeXfnLink' ] );
508
  }
509
  }
510
+
511
  /**
512
  * For more information about XFN relationships and examples concerning their use, see the
513
  *
517
  public function removeXfnLink() {
518
  return false;
519
  }
520
+
521
  /**
522
  * Remove jQuery Migrate
523
  *
525
  */
526
  public function removeJqueryMigrate( &$scripts ) {
527
  $scripts->remove( 'jquery' );
528
+ $scripts->add( 'jquery', false, [ 'jquery-core' ], '1.12.4' );
529
  }
530
+
531
  // Disable Embeds
532
  public function disableEmbeds() {
533
  global $wp, $wp_embed;
534
+
535
+ $wp->public_query_vars = array_diff( $wp->public_query_vars, [ 'embed' ] );
536
+ remove_filter( 'the_content', [ $wp_embed, 'autoembed' ], 8 );
537
+
538
  // Remove content feed filter
539
  remove_filter( 'the_content_feed', '_oembed_filter_feed_content' );
540
+
541
  // Abort embed libraries loading
542
  remove_action( 'plugins_loaded', 'wp_maybe_load_embeds', 0 );
543
+
544
  // No auto-embedding support
545
  add_filter( 'pre_option_embed_autourls', '__return_false' );
546
+
547
  // Avoid oEmbed auto discovery
548
  add_filter( 'embed_oembed_discover', '__return_false' );
549
+
550
  // Remove REST API related hooks
551
  remove_action( 'rest_api_init', 'wp_oembed_register_route' );
552
  remove_filter( 'rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10 );
553
+
554
  // Remove header actions
555
  remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
556
  remove_action( 'wp_head', 'wp_oembed_add_host_js' );
557
+
558
  remove_action( 'embed_head', 'enqueue_embed_scripts', 1 );
559
  remove_action( 'embed_head', 'print_emoji_detection_script' );
560
  remove_action( 'embed_head', 'print_embed_styles' );
563
  remove_action( 'embed_head', 'wp_no_robots' );
564
  remove_action( 'embed_head', 'rel_canonical' );
565
  remove_action( 'embed_head', 'locale_stylesheet', 30 );
566
+
567
  remove_action( 'embed_content_meta', 'print_embed_comments_button' );
568
  remove_action( 'embed_content_meta', 'print_embed_sharing_button' );
569
+
570
  remove_action( 'embed_footer', 'print_embed_sharing_dialog' );
571
  remove_action( 'embed_footer', 'print_embed_scripts' );
572
  remove_action( 'embed_footer', 'wp_print_footer_scripts', 20 );
573
+
574
  remove_filter( 'excerpt_more', 'wp_embed_excerpt_more', 20 );
575
  remove_filter( 'the_excerpt_embed', 'wptexturize' );
576
  remove_filter( 'the_excerpt_embed', 'convert_chars' );
577
  remove_filter( 'the_excerpt_embed', 'wpautop' );
578
  remove_filter( 'the_excerpt_embed', 'shortcode_unautop' );
579
  remove_filter( 'the_excerpt_embed', 'wp_embed_excerpt_attachment' );
580
+
581
  // Remove data and results filters
582
  remove_filter( 'oembed_dataparse', 'wp_filter_oembed_result', 10 );
583
  remove_filter( 'oembed_response_data', 'get_oembed_response_data_rich', 10 );
584
  remove_filter( 'pre_oembed_result', 'wp_filter_pre_oembed_result', 10 );
585
+
586
  // WooCommerce embeds in short description
587
  remove_filter( 'woocommerce_short_description', 'wc_do_oembeds' );
588
+
589
+ add_filter( 'tiny_mce_plugins', [ $this, 'disableEmbedsTinyMcePlugin' ] );
590
+ add_filter( 'rewrite_rules_array', [ $this, 'disableEmbedsRewrites' ] );
591
  }
592
+
593
  public function disableEmbedsTinyMcePlugin( $plugins ) {
594
+ return array_diff( $plugins, [ 'wpembed', 'wpview' ] );
595
  }
596
+
597
  public function disableEmbedsRewrites( $rules ) {
598
+ $new_rules = [];
599
  foreach ( $rules as $rule => $rewrite ) {
600
  if ( false !== ( $pos = strpos( $rewrite, '?' ) ) ) {
601
  $params = explode( '&', substr( $rewrite, $pos + 1 ) );
605
  }
606
  $new_rules[ $rule ] = $rewrite;
607
  }
608
+
609
  return $new_rules;
610
  }
611
+
612
  public function htmlCompressor() {
613
+ ob_start( [ $this, 'htmlCompressorMain' ] );
614
  }
615
+
616
  public function htmlCompressorMain( $content ) {
617
  $old_content = $content;
618
+
619
  if ( $this->getPopulateOption( 'remove_xfn_link' ) ) {
620
  $content = preg_replace( '/<link[^>]+href=(?:\'|")https?:\/\/gmpg.org\/xfn\/11(?:\'|")(?:[^>]+)?>/', '', $content );
621
+
622
  if ( empty( $content ) ) {
623
  $content = $old_content;
624
  }
625
  }
626
+
627
  return $content;
628
  }
629
  }
includes/classes/class.configurate-privacy.php CHANGED
@@ -2,9 +2,10 @@
2
 
3
  /**
4
  * This class configures the code cleanup settings
5
- * @author Webcraftic <wordpress.webraftic@gmail.com>
 
6
  * @copyright (c) 2017 Webraftic Ltd
7
- * @version 1.0
8
  */
9
 
10
  // Exit if accessed directly
@@ -13,58 +14,86 @@ if ( ! defined( 'ABSPATH' ) ) {
13
  }
14
 
15
  class WCL_ConfigPrivacy extends Wbcr_FactoryClearfy206_Configurate {
16
-
17
  /**
18
  * @param WCL_Plugin $plugin
19
  */
20
  public function __construct( WCL_Plugin $plugin ) {
21
  parent::__construct( $plugin );
22
-
23
  $this->plugin = $plugin;
24
  }
25
-
26
  public function registerActionsAndFilters() {
27
  if ( ! is_admin() ) {
28
  if ( $this->getPopulateOption( 'remove_meta_generator' ) ) {
29
- remove_action( 'wp_head', 'wp_generator' );
30
-
31
  if ( class_exists( 'WooCommerce' ) ) {
32
  remove_action( 'wp_head', 'woo_version' );
33
  }
34
-
 
35
  if ( class_exists( 'SitePress' ) ) {
36
  global $sitepress;
37
- remove_action( 'wp_head', array( $sitepress, 'meta_generator_tag' ) );
38
  }
39
-
 
 
40
  add_filter( 'the_generator', '__return_empty_string' );
41
-
42
- // Replace <meta .* name="generator"> like tags
43
- // which may contain versioning of
44
- add_action( 'wp_head', function () {
45
- ob_start( function ( $content ) {
46
- $raw_content = $content;
47
- $content = preg_replace( '/<meta.*name="generator".*?\/>/m', '', $content );
48
- if ( empty( $content ) ) {
49
- return $raw_content;
50
- }
51
-
52
- return $content;
53
- } );
54
- }, 0, 0 );
55
  }
56
-
57
  if ( $this->getPopulateOption( 'remove_html_comments' ) ) {
58
- add_action( 'wp_loaded', array( $this, 'removeHtmlComments' ) );
59
  }
60
  }
61
  }
62
-
63
-
64
- public function removeHtmlComments() {
65
- ob_start( array( $this, 'removeHtmlCommentsMain' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  }
67
-
68
  /**
69
  * !ngg_resource - can not be deleted, otherwise the plugin nextgen gallery will not work
70
  *
@@ -72,8 +101,18 @@ class WCL_ConfigPrivacy extends Wbcr_FactoryClearfy206_Configurate {
72
  *
73
  * @return mixed
74
  */
75
- public function removeHtmlCommentsMain( $data ) {
 
 
76
  //CLRF-166 issue fix bug with noindex (\s?\/?noindex)
77
- return preg_replace( '#<!--(?!<!|\s?ngg_resource|\s?\/?noindex)[^\[>].*?-->#s', '', $data );
 
 
 
 
 
 
 
 
78
  }
79
  }
2
 
3
  /**
4
  * This class configures the code cleanup settings
5
+ *
6
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
7
  * @copyright (c) 2017 Webraftic Ltd
8
+ * @version 1.0
9
  */
10
 
11
  // Exit if accessed directly
14
  }
15
 
16
  class WCL_ConfigPrivacy extends Wbcr_FactoryClearfy206_Configurate {
17
+
18
  /**
19
  * @param WCL_Plugin $plugin
20
  */
21
  public function __construct( WCL_Plugin $plugin ) {
22
  parent::__construct( $plugin );
23
+
24
  $this->plugin = $plugin;
25
  }
26
+
27
  public function registerActionsAndFilters() {
28
  if ( ! is_admin() ) {
29
  if ( $this->getPopulateOption( 'remove_meta_generator' ) ) {
30
+ // Clean meta generator for Woocommerce
 
31
  if ( class_exists( 'WooCommerce' ) ) {
32
  remove_action( 'wp_head', 'woo_version' );
33
  }
34
+
35
+ // Clean meta generator for SitePress
36
  if ( class_exists( 'SitePress' ) ) {
37
  global $sitepress;
38
+ remove_action( 'wp_head', [ $sitepress, 'meta_generator_tag' ] );
39
  }
40
+
41
+ // Clean meta generator for Wordpress core
42
+ remove_action( 'wp_head', 'wp_generator' );
43
  add_filter( 'the_generator', '__return_empty_string' );
44
+
45
+ // Clean all meta generators
46
+ add_action( 'wp_head', [ $this, 'clean_meta_generators' ], 100 );
 
 
 
 
 
 
 
 
 
 
 
47
  }
48
+
49
  if ( $this->getPopulateOption( 'remove_html_comments' ) ) {
50
+ add_action( 'wp_loaded', [ $this, 'clean_html_comments' ] );
51
  }
52
  }
53
  }
54
+
55
+ /**
56
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
57
+ * @since 1.5.3
58
+ */
59
+ public function clean_meta_generators() {
60
+ ob_start( [ $this, 'replace_meta_generators' ] );
61
+ }
62
+
63
+ /**
64
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
65
+ * @since 1.0.0
66
+ */
67
+ public function clean_html_comments() {
68
+ ob_start( [ $this, 'replace_html_comments' ] );
69
+ }
70
+
71
+ /**
72
+ * Replace <meta .* name="generator"> like tags
73
+ * which may contain versioning of
74
+ *
75
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
76
+ * @since 1.5.3
77
+ *
78
+ * @param $html
79
+ *
80
+ * @return string|string[]|null
81
+ */
82
+ public function replace_meta_generators( $html ) {
83
+ $raw_html = $html;
84
+
85
+ $pattern = '/<meta[^>]+name=["\']generator["\'][^>]+>/i';
86
+ $html = preg_replace( $pattern, '', $html );
87
+
88
+ // If replacement is completed with an error, user will receive a white screen.
89
+ // We have to prevent it.
90
+ if ( empty( $html ) ) {
91
+ return $raw_html;
92
+ }
93
+
94
+ return $html;
95
  }
96
+
97
  /**
98
  * !ngg_resource - can not be deleted, otherwise the plugin nextgen gallery will not work
99
  *
101
  *
102
  * @return mixed
103
  */
104
+ public function replace_html_comments( $html ) {
105
+ $raw_html = $html;
106
+
107
  //CLRF-166 issue fix bug with noindex (\s?\/?noindex)
108
+ $html = preg_replace( '#<!--(?!<!|\s?ngg_resource|\s?\/?noindex)[^\[>].*?-->#s', '', $html );
109
+
110
+ // If replacement is completed with an error, user will receive a white screen.
111
+ // We have to prevent it.
112
+ if ( empty( $html ) ) {
113
+ return $raw_html;
114
+ }
115
+
116
+ return $html;
117
  }
118
  }
includes/classes/class.configurate-seo.php CHANGED
@@ -1,492 +1,476 @@
1
  <?php
2
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  /**
4
- * This class configures the parameters seo
5
- * @author Webcraftic <wordpress.webraftic@gmail.com>
6
- * @copyright (c) 2017 Webraftic Ltd
7
- * @version 1.0
8
  */
 
 
9
 
10
- // Exit if accessed directly
11
- if( !defined('ABSPATH') ) {
12
- exit;
13
  }
14
 
15
- class WCL_ConfigSeo extends Wbcr_FactoryClearfy206_Configurate {
16
-
17
- /**
18
- * @param WCL_Plugin $plugin
19
- */
20
- public function __construct(WCL_Plugin $plugin)
21
- {
22
- parent::__construct($plugin);
 
23
 
24
- $this->plugin = $plugin;
25
- }
26
-
27
- public function registerActionsAndFilters()
28
- {
29
- if( !is_admin() ) {
30
- if( $this->getPopulateOption('content_image_auto_alt') ) {
31
- add_filter('the_content', array($this, 'contentImageAutoAlt'));
32
- add_filter('wp_get_attachment_image_attributes', array(
33
- $this,
34
- 'changeAttachementImageAttributes'
35
- ), 20, 2);
36
- }
37
 
38
- if( $this->getPopulateOption('right_robots_txt') ) {
39
- add_filter('robots_txt', array($this, 'rightRobotsTxt'), 9999);
40
- }
41
 
42
- if( $this->getPopulateOption('remove_last_item_breadcrumb_yoast') ) {
43
- add_filter('wpseo_breadcrumb_single_link', array($this, 'removeLastItemBreadcrumbYoast'));
44
- }
45
 
46
- if( $this->getPopulateOption('attachment_pages_redirect') ) {
47
- add_action('template_redirect', array($this, 'attachmentPagesRedirect'));
48
- }
49
 
50
- if( $this->getPopulateOption('remove_single_pagination_duplicate') ) {
51
- add_action('template_redirect', array($this, 'removeSinglePaginationDuplicate'));
52
- }
 
53
 
54
- if( $this->getPopulateOption('remove_replytocom') ) {
55
- add_action('template_redirect', array($this, 'removeReplytocomRedirect'), 1);
56
- add_filter('comment_reply_link', array($this, 'removeReplytocomLink'));
57
- }
58
 
59
- add_action('wp', array($this, 'redirectArchives'));
 
 
60
  }
 
 
61
 
62
- if( $this->getPopulateOption('set_last_modified_headers') ) {
63
- if( !is_admin() ) {
64
- add_action('template_redirect', array($this, 'setLastModifiedHeaders'));
 
65
  }
66
- add_action('wp_logout', array($this, 'lastModifedFlushCookie'));
67
- }
68
-
69
- if( $this->plugin->isActivateComponent('yoast_seo') && defined('WPSEO_VERSION') ) {
70
- if( !is_admin() ) {
71
- if( $this->getPopulateOption('yoast_remove_json_ld_search') ) {
72
- add_filter('disable_wpseo_json_ld_search', '__return_true');
73
- }
74
 
75
- if( $this->getPopulateOption('yoast_remove_json_ld_output') ) {
76
- add_filter('wpseo_json_ld_output', array($this, 'removeYoastJson'), 10, 1);
77
- }
78
- if( $this->getPopulateOption('yoast_remove_head_comment') ) {
79
- add_action('init', array($this, 'yoastRemoveHeadComment'));
80
- }
81
- /*if( $this->getPopulateOption('yoast_canonical_pagination') ) {
82
- add_filter('wpseo_canonical', array($this, 'yoastCanonicalPagination'));
83
- }*/
84
  }
85
- if( $this->getPopulateOption('yoast_remove_image_from_xml_sitemap') ) {
86
- $this->yoastRemoveImageFromXmlSitemap();
87
  }
 
 
 
 
 
 
88
  }
89
  }
 
90
 
91
- /**
92
- * @param $data
93
- * @return array
94
- */
95
- public function removeYoastJson($data)
96
- {
97
- $data = array();
98
 
99
- return $data;
100
- }
101
 
102
- /**
103
- * Add post title in image alt attribute
104
- *
105
- * @param $content
106
- * @return mixed
107
- */
 
108
 
109
- public function contentImageAutoAlt($content)
110
- {
111
- global $post;
112
 
113
- if( empty($post) ) {
114
- return $content;
115
- }
116
 
117
- $old_content = $content;
118
 
119
- preg_match_all('/<img[^>]+>/', $content, $images);
120
 
121
- if( !is_null($images) ) {
122
- foreach($images[0] as $index => $value) {
123
- if( !preg_match('/alt=/', $value) ) {
124
- $new_img = str_replace('<img', '<img alt="' . esc_attr($post->post_title) . '"', $images[0][$index]);
125
- $content = str_replace($images[0][$index], $new_img, $content);
126
- } else if( preg_match('/alt=[\s"\']{2,3}/', $value) ) {
127
- $new_img = preg_replace('/alt=[\s"\']{2,3}/', 'alt="' . esc_attr($post->post_title) . '"', $images[0][$index]);
128
- $content = str_replace($images[0][$index], $new_img, $content);
129
- }
130
  }
131
  }
 
132
 
133
- if( empty($content) ) {
134
- return $old_content;
135
- }
136
-
137
- return $content;
138
  }
139
 
140
- /**
141
- * Setting attributes for post thumnails
142
- *
143
- * @param $attr
144
- * @param $attachment
145
- * @return mixed
146
- */
147
- public function changeAttachementImageAttributes($attr, $attachment)
148
- {
149
- // Get post parent
150
- $parent = get_post_field('post_parent', $attachment);
151
-
152
- // Get post type to check if it's product
153
- //$type = get_post_field('post_type', $parent);
154
-
155
- /*if( $type != 'product' ) {
156
- return $attr;
157
- }*/
158
-
159
- /// Get title
160
- $title = get_post_field('post_title', $parent);
161
- if( '' === $attr['alt'] ) {
162
- $attr['alt'] = $title;
163
- }
164
- $attr['title'] = $title;
165
 
 
166
  return $attr;
 
 
 
 
 
 
167
  }
 
168
 
169
- /**
170
- * Add directories to virtual robots.txt file
171
- *
172
- * @param string $output
173
- * @return mixed|string|void
174
- */
175
- public function rightRobotsTxt($output)
176
- {
177
- if( $this->getPopulateOption('robots_txt_text') ) {
178
- return $this->getPopulateOption('robots_txt_text');
179
- }
180
 
181
- return WCL_Helper::getRightRobotTxt();
 
 
 
 
 
 
 
 
 
182
  }
183
 
184
- /**
185
- * Attachment pages redirect
186
- */
187
- public function attachmentPagesRedirect()
188
- {
189
- global $post;
190
 
191
- if( is_attachment() ) {
192
- if( isset($post->post_parent) && ($post->post_parent != 0) ) {
193
- wp_redirect(get_permalink($post->post_parent), 301);
194
- } else {
195
- wp_redirect(home_url(), 301);
196
- }
197
- exit;
 
 
 
 
198
  }
 
199
  }
 
200
 
201
- /**
202
- * Remove single pagination duplicate
203
- */
204
-
205
- public function removeSinglePaginationDuplicate()
206
- {
207
- global $post, $page;
208
 
209
- if( is_singular() && !is_front_page() ) {
 
210
 
211
- // #CLRF-125 issue fix bug for buddy press
212
- if( function_exists('bp_is_my_profile') ) {
213
- if( bp_is_my_profile() ) {
214
- return;
215
- }
216
- }
217
 
218
- // if woocommerce just return
219
- if( class_exists('woocommerce') && function_exists('is_cart') && function_exists('is_checkout') && function_exists('is_woocommerce') && function_exists('is_account_page') && (is_cart() || is_checkout() || is_woocommerce() || is_account_page()) ) {
 
220
  return;
221
  }
 
222
 
223
- $num_pages = substr_count($post->post_content, '<!--nextpage-->') + 1;
 
 
 
224
 
225
- if( $page > $num_pages ) {
226
- wp_safe_redirect(get_permalink($post->ID), 301);
227
- exit();
228
- }
 
229
  }
230
  }
 
231
 
232
 
233
- /**
234
- * Remove last item from breadcrumbs SEO by YOAST
235
- * http://www.wpdiv.com/remove-post-title-yoast-seo-plugin-breadcrumb/
236
- *
237
- * @param $link_output
238
- * @return string
239
- */
240
- public function removeLastItemBreadcrumbYoast($link_output)
241
- {
242
-
243
- if( strpos($link_output, 'breadcrumb_last') !== false ) {
244
- $link_output = '';
245
- }
246
 
247
- return $link_output;
 
248
  }
249
 
250
- /**
251
- * Remove yoast comment
252
- */
253
- public function yoastRemoveHeadComment()
254
- {
255
- add_action('get_header', array($this, 'yoastRemoveHeadCommentStart'));
256
- add_action('wp_head', array($this, 'yoastRemoveHeadCommentEnd'), 999);
257
- }
258
 
259
- public function yoastRemoveHeadCommentStart()
260
- {
261
- ob_start(array($this, 'yoastRemoveHeadCommentRemove'));
262
- }
 
 
 
263
 
264
- public function yoastRemoveHeadCommentEnd()
265
- {
266
- ob_end_flush();
267
- }
268
 
269
- public function yoastRemoveHeadCommentRemove($html)
270
- {
271
- return preg_replace('/^<!--.*?[Yy]oast.*?-->$/mi', '', $html);
272
- }
273
 
 
 
 
274
 
275
- /**
276
- * Remove <image:image> from sitemap
277
- */
278
- public function yoastRemoveImageFromXmlSitemap()
279
- {
280
- add_filter('wpseo_xml_sitemap_img', '__return_false');
281
- add_filter('wpseo_sitemap_url', array($this, 'yoastRemoveImageFromXmlClean'), 10, 2);
282
- }
283
 
284
- public function yoastRemoveImageFromXmlClean($output, $url)
285
- {
286
- $output = preg_replace('/<image:image[^>]*?>.*?<\/image:image>/si', '', $output);
 
 
 
 
287
 
288
- return $output;
289
- }
290
 
291
- /**
292
- * Canonical link in pagination Yoast
293
- *
294
- * @param $canonical
295
- *
296
- * @return string
297
- */
298
- /*public function yoastCanonicalPagination( $canonical ) {
299
- if ( is_category() && is_paged() ) {
300
- $cat = get_category( get_query_var( 'cat' ) );
301
- $cat_id = $cat->cat_ID;
302
- return get_category_link( $cat_id );
303
- }
304
- if ( is_home() && is_paged() ) {
305
- return home_url('/');
306
- }
307
- return $canonical;
308
- }*/
309
 
310
- /**
311
- * Redirect archives author, date, tags
312
- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
313
 
314
- public function redirectArchives()
315
- {
316
- if( $this->getPopulateOption('redirect_archives_author') ) {
317
- if( is_author() ) {
318
- wp_redirect(home_url(), 301);
319
 
320
- die();
321
- }
 
 
 
 
322
  }
 
323
 
324
- if( $this->getPopulateOption('redirect_archives_date') ) {
325
- if( is_date() ) {
326
- wp_redirect(home_url(), 301);
327
 
328
- die();
329
- }
330
  }
 
331
 
332
- if( $this->getPopulateOption('redirect_archives_tag') ) {
333
- if( is_tag() ) {
334
- wp_redirect(home_url(), 301);
335
 
336
- die();
337
- }
338
  }
339
  }
 
340
 
341
- /**
342
- * Remove replytocom
343
- */
344
- public function removeReplytocomRedirect()
345
- {
346
- global $post;
347
-
348
- if( !empty($post) && isset($_GET['replytocom']) && is_singular() ) {
349
- $post_url = get_permalink($post->ID);
350
- $comment_id = sanitize_text_field($_GET['replytocom']);
351
- $query_string = remove_query_arg('replytocom', sanitize_text_field($_SERVER['QUERY_STRING']));
352
 
353
- if( !empty($query_string) ) {
354
- $post_url .= '?' . $query_string;
355
- }
356
- $post_url .= '#comment-' . $comment_id;
357
 
358
- wp_safe_redirect($post_url, 301);
359
- die();
360
  }
 
361
 
362
- return false;
 
363
  }
364
 
365
- public function removeReplytocomLink($link)
366
- {
367
- return preg_replace('`href=(["\'])(?:.*(?:\?|&|&#038;)replytocom=(\d+)#respond)`', 'href=$1#comment-$2', $link);
 
 
 
 
 
 
 
368
  }
369
 
370
- public function setLastModifiedHeaders()
371
- {
372
- if( is_user_logged_in() && (defined('DOING_AJAX') && DOING_AJAX) || (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST) || (defined('REST_REQUEST') && REST_REQUEST) ) {
373
- return;
374
- }
375
 
376
- if( class_exists('woocommerce') && function_exists('is_cart') && function_exists('is_checkout') && function_exists('is_account_page') && (is_cart() || is_checkout() || is_account_page()) ) {
 
 
377
  return;
378
  }
379
-
380
- if( is_front_page() ) {
381
- $last_modified_exclude_frontpage = $this->getPopulateOption('disable_frontpage_last_modified_headers');
382
- if( $last_modified_exclude_frontpage ) {
383
- return;
384
- }
385
- }
386
 
387
- $last_modified_flush = isset($_COOKIE['wbcr_lastmodifed_flush']);
388
 
389
- global $wp;
390
- $last_modified_exclude = $this->getPopulateOption('last_modified_exclude');
391
- $last_modified_exclude_exp = explode(PHP_EOL, $last_modified_exclude);
392
 
393
- $current_url = home_url(add_query_arg(array(), $wp->request));
394
 
395
- foreach($last_modified_exclude_exp as $expr) {
396
- if( !empty($expr) && strpos(urldecode($current_url), $expr) !== false ) {
397
- return;
398
- }
399
  }
 
400
 
401
- /**
402
- * if Search - just return
403
- */
404
- if( is_search() ) {
 
 
 
 
 
 
 
 
 
 
405
  return;
406
  }
407
-
408
- $last_modified = '';
409
  /**
410
- * If posts, pages, custom post types
411
  */
412
- if( is_singular() ) {
413
- global $post;
414
- if( !isset($post->post_modified_gmt) ) {
415
- return;
416
- }
417
- $post_time = strtotime($post->post_modified_gmt);
418
- $modified_time = $post_time;
419
- /**
420
- * If we have comment set new modified date
421
- */
422
- if( (int)$post->comment_count > 0 ) {
423
- $comments = get_comments(array(
424
- 'post_id' => $post->ID,
425
- 'number' => '1',
426
- 'status' => 'approve',
427
- 'orderby' => 'comment_date_gmt',
428
- ));
429
- if( !empty($comments) && isset($comments[0]) ) {
430
- $comment_time = strtotime($comments[0]->comment_date_gmt);
431
- if( $comment_time > $post_time ) {
432
- $modified_time = $comment_time;
433
- }
434
  }
435
  }
436
- $last_modified = str_replace('+0000', 'GMT', gmdate('r', $modified_time));
437
  }
438
- /**
439
- * If any archives: categories, tags, taxonomy terms, post type archives
440
- */
441
- if( is_archive() || is_home() ) {
442
- global $posts;
443
- if( empty($posts) ) {
444
- return;
445
- }
446
- $post = $posts[0];
447
- if( !isset($post->post_modified_gmt) ) {
448
- return;
449
- }
450
- $post_time = strtotime($post->post_modified_gmt);
451
- $modified_time = $post_time;
452
- $last_modified = str_replace('+0000', 'GMT', gmdate('r', $modified_time));
453
  }
454
-
455
- /**
456
- * If headers already sent - do nothing
457
- */
458
-
459
- if( headers_sent() ) {
460
  return;
461
  }
 
 
 
 
462
 
463
- if( !empty($last_modified) && !empty($modified_time) ) {
 
 
464
 
465
- //todo: Fix bug, admin bar is not hidden after logout
466
- if( $last_modified_flush ) {
467
- $modified_time += rand(1, 99);
468
- }
469
 
470
- header('Last-Modified: ' . $last_modified);
471
 
472
- if( $this->getPopulateOption('if_modified_since_headers') && !is_user_logged_in() ) {
 
 
 
473
 
474
- if( isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $modified_time ) {
475
 
476
- $protocol = (isset($_SERVER['SERVER_PROTOCOL'])
477
- ? $_SERVER['SERVER_PROTOCOL']
478
- : 'HTTP/1.0');
479
 
480
- header($protocol . ' 304 Not Modified');
481
- }
 
 
 
482
  }
483
  }
484
  }
 
485
 
486
- function lastModifedFlushCookie()
487
- {
488
- if( !isset($_COOKIE['wbcr_lastmodifed_flush']) ) {
489
- setcookie("wbcr_lastmodifed_flush", 1, time() + 3600);
490
- }
491
  }
492
  }
 
1
  <?php
2
+
3
+ /**
4
+ * This class configures the parameters seo
5
+ *
6
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
7
+ * @copyright (c) 2017 Webraftic Ltd
8
+ * @version 1.0
9
+ */
10
+
11
+ // Exit if accessed directly
12
+ if ( ! defined( 'ABSPATH' ) ) {
13
+ exit;
14
+ }
15
+
16
+ class WCL_ConfigSeo extends Wbcr_FactoryClearfy206_Configurate {
17
+
18
  /**
19
+ * @param WCL_Plugin $plugin
 
 
 
20
  */
21
+ public function __construct( WCL_Plugin $plugin ) {
22
+ parent::__construct( $plugin );
23
 
24
+ $this->plugin = $plugin;
 
 
25
  }
26
 
27
+ public function registerActionsAndFilters() {
28
+ if ( ! is_admin() ) {
29
+ if ( $this->getPopulateOption( 'content_image_auto_alt' ) ) {
30
+ add_filter( 'the_content', [ $this, 'contentImageAutoAlt' ], 9999 );
31
+ add_filter( 'wp_get_attachment_image_attributes', [
32
+ $this,
33
+ 'changeAttachementImageAttributes'
34
+ ], 20, 2 );
35
+ }
36
 
37
+ if ( $this->getPopulateOption( 'right_robots_txt' ) ) {
38
+ add_filter( 'robots_txt', [ $this, 'rightRobotsTxt' ], 9999 );
39
+ }
 
 
 
 
 
 
 
 
 
 
40
 
41
+ if ( $this->getPopulateOption( 'remove_last_item_breadcrumb_yoast' ) ) {
42
+ add_filter( 'wpseo_breadcrumb_single_link', [ $this, 'removeLastItemBreadcrumbYoast' ] );
43
+ }
44
 
45
+ if ( $this->getPopulateOption( 'attachment_pages_redirect' ) ) {
46
+ add_action( 'template_redirect', [ $this, 'attachmentPagesRedirect' ] );
47
+ }
48
 
49
+ if ( $this->getPopulateOption( 'remove_single_pagination_duplicate' ) ) {
50
+ add_action( 'template_redirect', [ $this, 'removeSinglePaginationDuplicate' ] );
51
+ }
52
 
53
+ if ( $this->getPopulateOption( 'remove_replytocom' ) ) {
54
+ add_action( 'template_redirect', [ $this, 'removeReplytocomRedirect' ], 1 );
55
+ add_filter( 'comment_reply_link', [ $this, 'removeReplytocomLink' ] );
56
+ }
57
 
58
+ add_action( 'wp', [ $this, 'redirectArchives' ] );
59
+ }
 
 
60
 
61
+ if ( $this->getPopulateOption( 'set_last_modified_headers' ) ) {
62
+ if ( ! is_admin() ) {
63
+ add_action( 'template_redirect', [ $this, 'setLastModifiedHeaders' ] );
64
  }
65
+ add_action( 'wp_logout', [ $this, 'lastModifedFlushCookie' ] );
66
+ }
67
 
68
+ if ( $this->plugin->isActivateComponent( 'yoast_seo' ) && defined( 'WPSEO_VERSION' ) ) {
69
+ if ( ! is_admin() ) {
70
+ if ( $this->getPopulateOption( 'yoast_remove_json_ld_search' ) ) {
71
+ add_filter( 'disable_wpseo_json_ld_search', '__return_true' );
72
  }
 
 
 
 
 
 
 
 
73
 
74
+ if ( $this->getPopulateOption( 'yoast_remove_json_ld_output' ) ) {
75
+ add_filter( 'wpseo_json_ld_output', [ $this, 'removeYoastJson' ], 10, 1 );
 
 
 
 
 
 
 
76
  }
77
+ if ( $this->getPopulateOption( 'yoast_remove_head_comment' ) ) {
78
+ add_action( 'init', [ $this, 'yoastRemoveHeadComment' ] );
79
  }
80
+ /*if( $this->getPopulateOption('yoast_canonical_pagination') ) {
81
+ add_filter('wpseo_canonical', array($this, 'yoastCanonicalPagination'));
82
+ }*/
83
+ }
84
+ if ( $this->getPopulateOption( 'yoast_remove_image_from_xml_sitemap' ) ) {
85
+ $this->yoastRemoveImageFromXmlSitemap();
86
  }
87
  }
88
+ }
89
 
90
+ /**
91
+ * @param $data
92
+ *
93
+ * @return array
94
+ */
95
+ public function removeYoastJson( $data ) {
96
+ $data = [];
97
 
98
+ return $data;
99
+ }
100
 
101
+ /**
102
+ * Add post title in image alt attribute
103
+ *
104
+ * @param $content
105
+ *
106
+ * @return mixed
107
+ */
108
 
109
+ public function contentImageAutoAlt( $content ) {
110
+ global $post;
 
111
 
112
+ if ( empty( $post ) ) {
113
+ return $content;
114
+ }
115
 
116
+ $old_content = $content;
117
 
118
+ preg_match_all( '/<img[^>]+>/', $content, $images );
119
 
120
+ if ( ! is_null( $images ) ) {
121
+ foreach ( $images[0] as $index => $value ) {
122
+ if ( ! preg_match( '/alt=/', $value ) ) {
123
+ $new_img = str_replace( '<img', '<img alt="' . esc_attr( $post->post_title ) . '"', $images[0][ $index ] );
124
+ $content = str_replace( $images[0][ $index ], $new_img, $content );
125
+ } else if ( preg_match( '/alt=[\s"\']{2,3}/', $value ) ) {
126
+ $new_img = preg_replace( '/alt=[\s"\']{2,3}/', 'alt="' . esc_attr( $post->post_title ) . '"', $images[0][ $index ] );
127
+ $content = str_replace( $images[0][ $index ], $new_img, $content );
 
128
  }
129
  }
130
+ }
131
 
132
+ if ( empty( $content ) ) {
133
+ return $old_content;
 
 
 
134
  }
135
 
136
+ return $content;
137
+ }
138
+
139
+ /**
140
+ * Setting attributes for post thumnails
141
+ *
142
+ * @param $attr
143
+ * @param $attachment
144
+ *
145
+ * @return mixed
146
+ */
147
+ public function changeAttachementImageAttributes( $attr, $attachment ) {
148
+ // Get post parent
149
+ $parent = get_post_field( 'post_parent', $attachment );
150
+
151
+ // Get post type to check if it's product
152
+ //$type = get_post_field('post_type', $parent);
 
 
 
 
 
 
 
 
153
 
154
+ /*if( $type != 'product' ) {
155
  return $attr;
156
+ }*/
157
+
158
+ /// Get title
159
+ $title = get_post_field( 'post_title', $parent );
160
+ if ( '' === $attr['alt'] ) {
161
+ $attr['alt'] = $title;
162
  }
163
+ $attr['title'] = $title;
164
 
165
+ return $attr;
166
+ }
 
 
 
 
 
 
 
 
 
167
 
168
+ /**
169
+ * Add directories to virtual robots.txt file
170
+ *
171
+ * @param string $output
172
+ *
173
+ * @return mixed|string|void
174
+ */
175
+ public function rightRobotsTxt( $output ) {
176
+ if ( $this->getPopulateOption( 'robots_txt_text' ) ) {
177
+ return $this->getPopulateOption( 'robots_txt_text' );
178
  }
179
 
180
+ return WCL_Helper::getRightRobotTxt();
181
+ }
 
 
 
 
182
 
183
+ /**
184
+ * Attachment pages redirect
185
+ */
186
+ public function attachmentPagesRedirect() {
187
+ global $post;
188
+
189
+ if ( is_attachment() ) {
190
+ if ( isset( $post->post_parent ) && ( $post->post_parent != 0 ) ) {
191
+ wp_redirect( get_permalink( $post->post_parent ), 301 );
192
+ } else {
193
+ wp_redirect( home_url(), 301 );
194
  }
195
+ exit;
196
  }
197
+ }
198
 
199
+ /**
200
+ * Remove single pagination duplicate
201
+ */
 
 
 
 
202
 
203
+ public function removeSinglePaginationDuplicate() {
204
+ global $post, $page;
205
 
206
+ if ( is_singular() && ! is_front_page() ) {
 
 
 
 
 
207
 
208
+ // #CLRF-125 issue fix bug for buddy press
209
+ if ( function_exists( 'bp_is_my_profile' ) ) {
210
+ if ( bp_is_my_profile() ) {
211
  return;
212
  }
213
+ }
214
 
215
+ // if woocommerce just return
216
+ if ( class_exists( 'woocommerce' ) && function_exists( 'is_cart' ) && function_exists( 'is_checkout' ) && function_exists( 'is_woocommerce' ) && function_exists( 'is_account_page' ) && ( is_cart() || is_checkout() || is_woocommerce() || is_account_page() ) ) {
217
+ return;
218
+ }
219
 
220
+ $num_pages = substr_count( $post->post_content, '<!--nextpage-->' ) + 1;
221
+
222
+ if ( $page > $num_pages ) {
223
+ wp_safe_redirect( get_permalink( $post->ID ), 301 );
224
+ exit();
225
  }
226
  }
227
+ }
228
 
229
 
230
+ /**
231
+ * Remove last item from breadcrumbs SEO by YOAST
232
+ * http://www.wpdiv.com/remove-post-title-yoast-seo-plugin-breadcrumb/
233
+ *
234
+ * @param $link_output
235
+ *
236
+ * @return string
237
+ */
238
+ public function removeLastItemBreadcrumbYoast( $link_output ) {
 
 
 
 
239
 
240
+ if ( strpos( $link_output, 'breadcrumb_last' ) !== false ) {
241
+ $link_output = '';
242
  }
243
 
244
+ return $link_output;
245
+ }
 
 
 
 
 
 
246
 
247
+ /**
248
+ * Remove yoast comment
249
+ */
250
+ public function yoastRemoveHeadComment() {
251
+ add_action( 'get_header', [ $this, 'yoastRemoveHeadCommentStart' ] );
252
+ add_action( 'wp_head', [ $this, 'yoastRemoveHeadCommentEnd' ], 999 );
253
+ }
254
 
255
+ public function yoastRemoveHeadCommentStart() {
256
+ ob_start( [ $this, 'yoastRemoveHeadCommentRemove' ] );
257
+ }
 
258
 
259
+ public function yoastRemoveHeadCommentEnd() {
260
+ ob_end_flush();
261
+ }
 
262
 
263
+ public function yoastRemoveHeadCommentRemove( $html ) {
264
+ return preg_replace( '/^<!--.*?[Yy]oast.*?-->$/mi', '', $html );
265
+ }
266
 
 
 
 
 
 
 
 
 
267
 
268
+ /**
269
+ * Remove <image:image> from sitemap
270
+ */
271
+ public function yoastRemoveImageFromXmlSitemap() {
272
+ add_filter( 'wpseo_xml_sitemap_img', '__return_false' );
273
+ add_filter( 'wpseo_sitemap_url', [ $this, 'yoastRemoveImageFromXmlClean' ], 10, 2 );
274
+ }
275
 
276
+ public function yoastRemoveImageFromXmlClean( $output, $url ) {
277
+ $output = preg_replace( '/<image:image[^>]*?>.*?<\/image:image>/si', '', $output );
278
 
279
+ return $output;
280
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
281
 
282
+ /**
283
+ * Canonical link in pagination Yoast
284
+ *
285
+ * @param $canonical
286
+ *
287
+ * @return string
288
+ */
289
+ /*public function yoastCanonicalPagination( $canonical ) {
290
+ if ( is_category() && is_paged() ) {
291
+ $cat = get_category( get_query_var( 'cat' ) );
292
+ $cat_id = $cat->cat_ID;
293
+ return get_category_link( $cat_id );
294
+ }
295
+ if ( is_home() && is_paged() ) {
296
+ return home_url('/');
297
+ }
298
+ return $canonical;
299
+ }*/
300
 
301
+ /**
302
+ * Redirect archives author, date, tags
303
+ */
 
 
304
 
305
+ public function redirectArchives() {
306
+ if ( $this->getPopulateOption( 'redirect_archives_author' ) ) {
307
+ if ( is_author() ) {
308
+ wp_redirect( home_url(), 301 );
309
+
310
+ die();
311
  }
312
+ }
313
 
314
+ if ( $this->getPopulateOption( 'redirect_archives_date' ) ) {
315
+ if ( is_date() ) {
316
+ wp_redirect( home_url(), 301 );
317
 
318
+ die();
 
319
  }
320
+ }
321
 
322
+ if ( $this->getPopulateOption( 'redirect_archives_tag' ) ) {
323
+ if ( is_tag() ) {
324
+ wp_redirect( home_url(), 301 );
325
 
326
+ die();
 
327
  }
328
  }
329
+ }
330
 
331
+ /**
332
+ * Remove replytocom
333
+ */
334
+ public function removeReplytocomRedirect() {
335
+ global $post;
 
 
 
 
 
 
336
 
337
+ if ( ! empty( $post ) && isset( $_GET['replytocom'] ) && is_singular() ) {
338
+ $post_url = get_permalink( $post->ID );
339
+ $comment_id = sanitize_text_field( $_GET['replytocom'] );
340
+ $query_string = remove_query_arg( 'replytocom', sanitize_text_field( $_SERVER['QUERY_STRING'] ) );
341
 
342
+ if ( ! empty( $query_string ) ) {
343
+ $post_url .= '?' . $query_string;
344
  }
345
+ $post_url .= '#comment-' . $comment_id;
346
 
347
+ wp_safe_redirect( $post_url, 301 );
348
+ die();
349
  }
350
 
351
+ return false;
352
+ }
353
+
354
+ public function removeReplytocomLink( $link ) {
355
+ return preg_replace( '`href=(["\'])(?:.*(?:\?|&|&#038;)replytocom=(\d+)#respond)`', 'href=$1#comment-$2', $link );
356
+ }
357
+
358
+ public function setLastModifiedHeaders() {
359
+ if ( is_user_logged_in() && ( defined( 'DOING_AJAX' ) && DOING_AJAX ) || ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ) {
360
+ return;
361
  }
362
 
363
+ if ( class_exists( 'woocommerce' ) && function_exists( 'is_cart' ) && function_exists( 'is_checkout' ) && function_exists( 'is_account_page' ) && ( is_cart() || is_checkout() || is_account_page() ) ) {
364
+ return;
365
+ }
 
 
366
 
367
+ if ( is_front_page() ) {
368
+ $last_modified_exclude_frontpage = $this->getPopulateOption( 'disable_frontpage_last_modified_headers' );
369
+ if ( $last_modified_exclude_frontpage ) {
370
  return;
371
  }
372
+ }
 
 
 
 
 
 
373
 
374
+ $last_modified_flush = isset( $_COOKIE['wbcr_lastmodifed_flush'] );
375
 
376
+ global $wp;
377
+ $last_modified_exclude = $this->getPopulateOption( 'last_modified_exclude' );
378
+ $last_modified_exclude_exp = explode( PHP_EOL, $last_modified_exclude );
379
 
380
+ $current_url = home_url( add_query_arg( [], $wp->request ) );
381
 
382
+ foreach ( $last_modified_exclude_exp as $expr ) {
383
+ if ( ! empty( $expr ) && strpos( urldecode( $current_url ), $expr ) !== false ) {
384
+ return;
 
385
  }
386
+ }
387
 
388
+ /**
389
+ * if Search - just return
390
+ */
391
+ if ( is_search() ) {
392
+ return;
393
+ }
394
+
395
+ $last_modified = '';
396
+ /**
397
+ * If posts, pages, custom post types
398
+ */
399
+ if ( is_singular() ) {
400
+ global $post;
401
+ if ( ! isset( $post->post_modified_gmt ) ) {
402
  return;
403
  }
404
+ $post_time = strtotime( $post->post_modified_gmt );
405
+ $modified_time = $post_time;
406
  /**
407
+ * If we have comment set new modified date
408
  */
409
+ if ( (int) $post->comment_count > 0 ) {
410
+ $comments = get_comments( [
411
+ 'post_id' => $post->ID,
412
+ 'number' => '1',
413
+ 'status' => 'approve',
414
+ 'orderby' => 'comment_date_gmt',
415
+ ] );
416
+ if ( ! empty( $comments ) && isset( $comments[0] ) ) {
417
+ $comment_time = strtotime( $comments[0]->comment_date_gmt );
418
+ if ( $comment_time > $post_time ) {
419
+ $modified_time = $comment_time;
 
 
 
 
 
 
 
 
 
 
 
420
  }
421
  }
 
422
  }
423
+ $last_modified = str_replace( '+0000', 'GMT', gmdate( 'r', $modified_time ) );
424
+ }
425
+ /**
426
+ * If any archives: categories, tags, taxonomy terms, post type archives
427
+ */
428
+ if ( is_archive() || is_home() ) {
429
+ global $posts;
430
+ if ( empty( $posts ) ) {
431
+ return;
 
 
 
 
 
 
432
  }
433
+ $post = $posts[0];
434
+ if ( ! isset( $post->post_modified_gmt ) ) {
 
 
 
 
435
  return;
436
  }
437
+ $post_time = strtotime( $post->post_modified_gmt );
438
+ $modified_time = $post_time;
439
+ $last_modified = str_replace( '+0000', 'GMT', gmdate( 'r', $modified_time ) );
440
+ }
441
 
442
+ /**
443
+ * If headers already sent - do nothing
444
+ */
445
 
446
+ if ( headers_sent() ) {
447
+ return;
448
+ }
 
449
 
450
+ if ( ! empty( $last_modified ) && ! empty( $modified_time ) ) {
451
 
452
+ //todo: Fix bug, admin bar is not hidden after logout
453
+ if ( $last_modified_flush ) {
454
+ $modified_time += rand( 1, 99 );
455
+ }
456
 
457
+ header( 'Last-Modified: ' . $last_modified );
458
 
459
+ if ( $this->getPopulateOption( 'if_modified_since_headers' ) && ! is_user_logged_in() ) {
 
 
460
 
461
+ if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) && strtotime( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) >= $modified_time ) {
462
+
463
+ $protocol = ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' );
464
+
465
+ header( $protocol . ' 304 Not Modified' );
466
  }
467
  }
468
  }
469
+ }
470
 
471
+ function lastModifedFlushCookie() {
472
+ if ( ! isset( $_COOKIE['wbcr_lastmodifed_flush'] ) ) {
473
+ setcookie( "wbcr_lastmodifed_flush", 1, time() + 3600 );
 
 
474
  }
475
  }
476
+ }
languages/clearfy-es_ES.mo ADDED
Binary file
languages/clearfy-es_ES.po ADDED
@@ -0,0 +1,2367 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of Plugins - Clearfy in Spanish (Spain)
2
+ # This file is distributed under the same license as the Plugins - Clearfy – WordPress optimization plugin and disable ultimate tweaker - Development (trunk) package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: \n"
6
+ "POT-Creation-Date: 2019-04-28 06:19+0300\n"
7
+ "PO-Revision-Date: 2019-04-28 06:19+0300\n"
8
+ "Last-Translator: \n"
9
+ "Language-Team: \n"
10
+ "Language: es\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
15
+ "X-Generator: Poedit 2.1.1\n"
16
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
17
+ "X-Generator: Poedit 2.1.1\n"
18
+ "X-Poedit-Basepath: ..\n"
19
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
20
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
21
+ "X-Poedit-SourceCharset: UTF-8\n"
22
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
23
+ "X-Poedit-SearchPath-0: .\n"
24
+ "X-Poedit-SearchPathExcluded-0: libs\n"
25
+ "X-Poedit-SearchPathExcluded-1: components\n"
26
+ "X-Poedit-SearchPathExcluded-2: cache\n"
27
+ "X-Poedit-SearchPathExcluded-3: assets\n"
28
+ "X-Poedit-SearchPathExcluded-4: admin/assets\n"
29
+
30
+ #: _branding.php:98
31
+ msgid "Company widget 1"
32
+ msgstr ""
33
+
34
+ #: _branding.php:102 _branding.php:120
35
+ msgid ""
36
+ "You can create an arbitrary company widget, for technical support and any "
37
+ "other data, so that users can see it on the pages of the plugin."
38
+ msgstr ""
39
+
40
+ #: _branding.php:116
41
+ msgid "Company widget 2"
42
+ msgstr ""
43
+
44
+ #: _branding.php:140
45
+ msgid "Yoast SEO"
46
+ msgstr ""
47
+
48
+ #: _branding.php:145
49
+ msgid ""
50
+ "Improve your WordPress SEO: Write better content and have a fully optimized "
51
+ "WordPress site using the Yoast SEO plugin."
52
+ msgstr ""
53
+
54
+ #: admin/ajax/check-license.php:27
55
+ msgid "Licensing action not passed or this action is prohibited!"
56
+ msgstr "Ejecución de licencia no aprobada o esta acción está prohibida!"
57
+
58
+ #: admin/ajax/check-license.php:40
59
+ msgid ""
60
+ "License key is empty or license key too long (license key is 32 characters "
61
+ "long)"
62
+ msgstr ""
63
+ "Campo de (Clave de Licencia) está vacía o la clave de licencia es demasiado "
64
+ "larga (la clave de licencia tiene una longitud de 32 caracteres)"
65
+
66
+ #: admin/ajax/check-license.php:44
67
+ msgid "Your license has been successfully activated"
68
+ msgstr "Su licencia ha sido activada exitosamente."
69
+
70
+ #: admin/ajax/check-license.php:49
71
+ msgid "The license is deactivated"
72
+ msgstr "La licencia está desactivada."
73
+
74
+ #: admin/ajax/check-license.php:53
75
+ msgid "The license has been updated"
76
+ msgstr "La licencia ha sido actualizada."
77
+
78
+ #: admin/ajax/check-license.php:57
79
+ msgid "Subscription success cancelled"
80
+ msgstr "Suscripción cancelada correctamente"
81
+
82
+ #: admin/ajax/configurate.php:19 admin/ajax/import-settings.php:24
83
+ #: admin/ajax/install-addons.php:25 admin/ajax/install-addons.php:131
84
+ msgid "You don't have enough capability to edit this information."
85
+ msgstr "No tienes suficiente permisos para editar esta información."
86
+
87
+ #: admin/ajax/configurate.php:26 admin/ajax/configurate.php:34
88
+ msgid "Undefinded mode."
89
+ msgstr "Modo indefinido."
90
+
91
+ #: admin/ajax/import-settings.php:43
92
+ msgid "Settings are not defined or do not exist."
93
+ msgstr "Los ajustes no están definidos o no existen."
94
+
95
+ #: admin/ajax/install-addons.php:25
96
+ msgid "Something went wrong."
97
+ msgstr "Algo salió mal."
98
+
99
+ #: admin/ajax/install-addons.php:29
100
+ msgid "Required attributes are not passed or empty."
101
+ msgstr "Los atributos requeridos no se encuentran o están vacíos."
102
+
103
+ #: admin/ajax/install-addons.php:46 admin/ajax/install-addons.php:69
104
+ msgid "You are trying to perform an invalid action."
105
+ msgstr "Está intentando realizar una acción no válida."
106
+
107
+ #: admin/ajax/install-addons.php:105 admin/boot.php:202
108
+ #, php-format
109
+ msgid ""
110
+ "When you deactivate some components, permanent links may work incorrectly. "
111
+ "If this happens, please, <a href=\"%s\">update the permalinks</a>, so you "
112
+ "could complete the deactivation."
113
+ msgstr ""
114
+ "Cuando desactivas algunos componentes, los enlaces permanentes pueden "
115
+ "funcionar incorrectamente. De ser asi, usted debe, <a href=\"%s\">actualizar "
116
+ "los enlaces permanentes</a>, para completar la desactivación."
117
+
118
+ #: admin/ajax/install-addons.php:115 admin/ajax/update-package.php:82
119
+ msgid "An unknown error occurred during the activation of the component."
120
+ msgstr "Se produjo un error desconocido durante la activación del componente."
121
+
122
+ #: admin/ajax/install-addons.php:135
123
+ msgid "Required attribute [component_name] is empty."
124
+ msgstr "El atributo requerido [component_name] está vacío."
125
+
126
+ #: admin/ajax/update-package.php:28 admin/pages/components.php:110
127
+ msgid "To use premium components, you need activate a license!"
128
+ msgstr "Para usar los componentes premium, ¡usted debe activar una licencia!"
129
+
130
+ #: admin/ajax/update-package.php:28 admin/pages/components.php:110
131
+ msgid "Activate license"
132
+ msgstr "Activar licencia"
133
+
134
+ #: admin/ajax/update-package.php:47
135
+ msgid "Configuration updated."
136
+ msgstr "Configuración actualizada."
137
+
138
+ #: admin/boot.php:29
139
+ msgid "Clearfy settings"
140
+ msgstr "Configuraciones Clearfy"
141
+
142
+ #: admin/boot.php:109 includes/classes/class.package.php:278
143
+ msgid "Update in progress..."
144
+ msgstr "Actualización en progreso..."
145
+
146
+ #: admin/boot.php:109
147
+ msgid "Components have been successfully updated!"
148
+ msgstr "¡Los componentes se han actualizado con éxito!"
149
+
150
+ #: admin/boot.php:109
151
+ msgid "update now"
152
+ msgstr "actualizar ahora"
153
+
154
+ #: admin/boot.php:114
155
+ msgid "Updates are available for one of the components."
156
+ msgstr "Hay actualizaciones disponibles para uno de los componentes."
157
+
158
+ #: admin/boot.php:155
159
+ msgid "Business"
160
+ msgstr "Business"
161
+
162
+ #: admin/boot.php:245
163
+ msgid "Images optimization"
164
+ msgstr "Optimización de imágenes"
165
+
166
+ #: admin/boot.php:255
167
+ msgid "Unoptimized"
168
+ msgstr "No optimizado"
169
+
170
+ #: admin/boot.php:260
171
+ msgid "Optimized"
172
+ msgstr "Optimizado"
173
+
174
+ #: admin/boot.php:265
175
+ msgid "Error"
176
+ msgstr "Error"
177
+
178
+ #: admin/boot.php:272
179
+ msgid "Original size"
180
+ msgstr "Tamaño original"
181
+
182
+ #: admin/boot.php:278
183
+ msgid "Optimized size"
184
+ msgstr "Tamaño optimizado"
185
+
186
+ #: admin/boot.php:289
187
+ msgid "Bulk optimize"
188
+ msgstr "Optimizar a granel"
189
+
190
+ #: admin/boot.php:295
191
+ msgid "Normal"
192
+ msgstr "Normal"
193
+
194
+ #: admin/boot.php:296
195
+ msgid "Medium"
196
+ msgstr "Medio"
197
+
198
+ #: admin/boot.php:297
199
+ msgid "High"
200
+ msgstr "Alto"
201
+
202
+ #: admin/includes/classes/class.install-plugins-button.php:356
203
+ msgid "Activate"
204
+ msgstr "Activar"
205
+
206
+ #: admin/includes/classes/class.install-plugins-button.php:357
207
+ msgid "Install"
208
+ msgstr "Instalar"
209
+
210
+ #: admin/includes/classes/class.install-plugins-button.php:358
211
+ msgid "Deactivate"
212
+ msgstr "Desactivar"
213
+
214
+ #: admin/includes/classes/class.install-plugins-button.php:359
215
+ msgid "Delete"
216
+ msgstr "Borrar"
217
+
218
+ #: admin/includes/classes/class.install-plugins-button.php:360
219
+ msgid "Please wait..."
220
+ msgstr "Espere..."
221
+
222
+ #: admin/includes/classes/class.install-plugins-button.php:361
223
+ msgid "Preparation..."
224
+ msgstr "Preparación..."
225
+
226
+ #: admin/includes/classes/class.install-plugins-button.php:362
227
+ msgid "Read more"
228
+ msgstr "Leer más"
229
+
230
+ #: admin/includes/compatibility.php:18
231
+ msgid ""
232
+ "Please update the plugin Robin image Optimizer to the latest version, as it "
233
+ "may not work correctly with the new version of Clearfy!"
234
+ msgstr ""
235
+ "Actualice el plugin (Robin image Optimizer) a la última versión, ya que "
236
+ "puede que no funcione correctamente con la nueva versión de Clearfy."
237
+
238
+ #: admin/includes/compatibility.php:47
239
+ msgid ""
240
+ "Please update the plugin Hide login page to the latest version, as it may "
241
+ "not work correctly with the new version of Clearfy!"
242
+ msgstr ""
243
+ "Actualice el plugin (Hide login page) a la última versión, ya que es posible "
244
+ "que no funcione correctamente con la nueva versión de Clearfy!"
245
+
246
+ #: admin/includes/compatibility.php:84
247
+ #, php-format
248
+ msgid "Welcome to Clearfy (%s)"
249
+ msgstr "Bienvenido a Clearfy (%s)"
250
+
251
+ #: admin/includes/compatibility.php:85
252
+ msgid ""
253
+ "We moved the form to import and export plugin settings to another page. Now "
254
+ "all settings that relate only to the Clearfy plugin, we will post on this "
255
+ "additional page."
256
+ msgstr ""
257
+ "Movimos el formulario para importar y exportar la configuración del plugin a "
258
+ "otra página. Ahora, todas las configuraciones relacionadas con el plugin "
259
+ "Clearfy serán publicadas en esta página adicional."
260
+
261
+ #: admin/includes/options.php:18 admin/pages/performance-google.php:94
262
+ msgid "Google Fonts asynchronous"
263
+ msgstr "Fuentes de Google Asíncronas"
264
+
265
+ #: admin/includes/options.php:23 admin/pages/performance-google.php:104
266
+ msgid "Disable Google Fonts"
267
+ msgstr "Desactivar Google Fonts"
268
+
269
+ #: admin/includes/options.php:28 admin/pages/performance-google.php:132
270
+ msgid "Remove iframe Google maps"
271
+ msgstr "¿Eliminar Iframe en Google Maps?"
272
+
273
+ #: admin/includes/options.php:33 admin/pages/performance-google.php:142
274
+ msgid "Exclude pages from Disable Google Maps filter"
275
+ msgstr "Excluir páginas del filtro Deshabilitar Google Maps"
276
+
277
+ #: admin/includes/options.php:39 admin/pages/performance-google.php:115
278
+ msgid "Disable Google maps"
279
+ msgstr "Deshabilitar Google Maps"
280
+
281
+ #: admin/includes/options.php:45 admin/pages/performance.php:184
282
+ msgid "Removing XFN (XHTML Friends Network) Profile Link"
283
+ msgstr "Eliminando el enlace del perfil XFN (XHTML Friends Network)"
284
+
285
+ #: admin/includes/options.php:50 admin/pages/performance.php:236
286
+ msgid "Font Awesome asynchronous"
287
+ msgstr "Font Awesome asíncrono"
288
+
289
+ #: admin/includes/options.php:55 admin/pages/performance.php:246
290
+ msgid "Disable Dashicons"
291
+ msgstr "Deshabilitar Dashicons"
292
+
293
+ #: admin/includes/options.php:60 admin/pages/performance.php:256
294
+ msgid "Disable gravatars"
295
+ msgstr "Desactivar gravatars"
296
+
297
+ #: admin/includes/options.php:65 admin/pages/performance.php:115
298
+ msgid "Remove REST API Links"
299
+ msgstr "Eliminar enlaces REST API"
300
+
301
+ #: admin/includes/options.php:70 admin/pages/performance.php:136
302
+ msgid "Disable Emojis"
303
+ msgstr "Deshabilitar Emojis"
304
+
305
+ #: admin/includes/options.php:81 admin/pages/performance.php:175
306
+ msgid "Remove RSD Link"
307
+ msgstr "Eliminar ENLACES RSD"
308
+
309
+ #: admin/includes/options.php:86 admin/pages/performance.php:196
310
+ msgid "Remove wlwmanifest Link"
311
+ msgstr "Eliminar el enlace wlwmanifest"
312
+
313
+ #: admin/includes/options.php:91 admin/pages/performance.php:206
314
+ msgid "Remove Shortlink"
315
+ msgstr "Eliminar Shortlink"
316
+
317
+ #: admin/includes/options.php:96 admin/pages/performance.php:216
318
+ msgid "Remove links to previous, next post"
319
+ msgstr "Eliminar enlaces anterior y siguiente en publicaciones"
320
+
321
+ #: admin/includes/options.php:101 admin/pages/performance.php:226
322
+ msgid "Remove .recentcomments styles"
323
+ msgstr "Eliminar los estilos .recentcomments"
324
+
325
+ #: admin/includes/options.php:107 admin/pages/seo.php:79
326
+ msgid "Automatically set the alt attribute"
327
+ msgstr "Establecer automáticamente el atributo alt"
328
+
329
+ #: admin/includes/options.php:112 admin/pages/seo.php:118
330
+ msgid "Automatically insert the Last Modified header"
331
+ msgstr "Insertar automáticamente la ultima modificación del encabezado"
332
+
333
+ #: admin/includes/options.php:117 admin/pages/seo.php:149
334
+ msgid "Return an If-Modified-Since responce"
335
+ msgstr "Devuelve una respuesta If-Modified-Since"
336
+
337
+ #: admin/includes/options.php:122 admin/pages/seo.php:163
338
+ msgid "Remove duplicate names in breadcrumbs WP SEO by Yoast"
339
+ msgstr "Eliminar nombres duplicados en el breadcrumbs WP SEO by Yoast"
340
+
341
+ #: admin/includes/options.php:127 admin/pages/seo.php:173
342
+ #, php-format
343
+ msgid "Remove the tag %s from XML site map"
344
+ msgstr "Eliminar la etiqueta %s del mapa del sitio XML"
345
+
346
+ #: admin/includes/options.php:132 admin/pages/seo.php:191
347
+ msgid "Disable JSON-LD sitelinks searchbox"
348
+ msgstr "Desactivar el cuadro de búsqueda de enlaces de sitio JSON-LD"
349
+
350
+ #: admin/includes/options.php:137 admin/pages/seo.php:201
351
+ msgid "Disable Yoast Structured Data"
352
+ msgstr "Desactivar datos estructurados de Yoast"
353
+
354
+ #: admin/includes/options.php:142 admin/pages/seo.php:226
355
+ #, php-format
356
+ msgid "Remove comment from %s section"
357
+ msgstr "Eliminar comentario de la sección %s"
358
+
359
+ #: admin/includes/options.php:147 admin/pages/seo-double-pages.php:81
360
+ msgid "Remove archives date"
361
+ msgstr "Eliminar fecha de archivo"
362
+
363
+ #: admin/includes/options.php:152 admin/pages/seo-double-pages.php:91
364
+ msgid "Remove author archives "
365
+ msgstr "Eliminar archivos de autor"
366
+
367
+ #: admin/includes/options.php:157 admin/pages/seo-double-pages.php:101
368
+ msgid "Remove archives tag"
369
+ msgstr "Eliminar etiqueta de archivos"
370
+
371
+ #: admin/includes/options.php:162 admin/pages/seo-double-pages.php:111
372
+ msgid "Remove attachment pages"
373
+ msgstr "Eliminar páginas adjuntas"
374
+
375
+ #: admin/includes/options.php:167 admin/pages/seo-double-pages.php:121
376
+ msgid "Remove post pagination"
377
+ msgstr "Eliminar paginación en publicaciones"
378
+
379
+ #: admin/includes/options.php:172 admin/pages/seo-double-pages.php:131
380
+ msgid "Remove ?replytocom"
381
+ msgstr "Eliminar ?replytocom"
382
+
383
+ #: admin/includes/options.php:177 admin/pages/defence.php:121
384
+ msgid "Remove meta generator"
385
+ msgstr "Eliminar generador meta"
386
+
387
+ #: admin/includes/options.php:182 admin/pages/defence.php:61
388
+ msgid "Hide author login"
389
+ msgstr "Ocultar inicio de sesión de autor"
390
+
391
+ #: admin/includes/options.php:187 admin/pages/defence.php:71
392
+ msgid "Hide errors when logging into the site"
393
+ msgstr "Ocultar errores al iniciar sesión en el sitio"
394
+
395
+ #: admin/includes/options.php:192 admin/includes/options.php:303
396
+ #: admin/pages/performance.php:348
397
+ msgid "Remove Version from Stylesheet"
398
+ msgstr "Eliminar versión de la hoja de estilo"
399
+
400
+ #: admin/includes/options.php:197 admin/includes/options.php:308
401
+ #: admin/pages/performance.php:337
402
+ msgid "Remove Version from Script"
403
+ msgstr "Eliminar versión de script"
404
+
405
+ #: admin/includes/options.php:202 admin/pages/widgets.php:62
406
+ msgid "Remove the \"Pages\" widget"
407
+ msgstr "Eliminar el widget \"Páginas \""
408
+
409
+ #: admin/includes/options.php:207 admin/pages/widgets.php:71
410
+ msgid "Remove calendar widget"
411
+ msgstr "Eliminar widget de calendario"
412
+
413
+ #: admin/includes/options.php:212 admin/pages/widgets.php:80
414
+ msgid "Remove the \"Cloud of tags\" widget"
415
+ msgstr "Eliminar el widget \"Nube de etiquetas \""
416
+
417
+ #: admin/includes/options.php:217 admin/pages/widgets.php:89
418
+ msgid "Remove the \"Archives\" widget"
419
+ msgstr "Eliminar el widget \"Archives \""
420
+
421
+ #: admin/includes/options.php:222 admin/pages/widgets.php:98
422
+ msgid "Remove the \"Links\" widget"
423
+ msgstr "Eliminar el widget \"Enlaces \""
424
+
425
+ #: admin/includes/options.php:227 admin/pages/widgets.php:107
426
+ msgid "Remove the \"Meta\" widget"
427
+ msgstr "Eliminar el widget \"Meta \""
428
+
429
+ #: admin/includes/options.php:232 admin/pages/widgets.php:116
430
+ msgid "Remove the \"Search\" widget"
431
+ msgstr "Eliminar el widget \"Buscar \""
432
+
433
+ #: admin/includes/options.php:237 admin/includes/options.php:257
434
+ #: admin/pages/widgets.php:125
435
+ msgid "Remove the \"Text\" widget"
436
+ msgstr "Eliminar el widget \"Texto \""
437
+
438
+ #: admin/includes/options.php:242 admin/pages/widgets.php:134
439
+ msgid "Remove the \"Categories\" widget"
440
+ msgstr "Eliminar el widget \"Categorías \""
441
+
442
+ #: admin/includes/options.php:247 admin/pages/widgets.php:143
443
+ msgid "Remove the \"Recent Posts\" widget"
444
+ msgstr "Eliminar el widget \"Mensajes Recientes \""
445
+
446
+ #: admin/includes/options.php:252 admin/pages/widgets.php:152
447
+ msgid "Remove the \"Recent Comments\" widget"
448
+ msgstr "Eliminar el widget \"Comentarios recientes \""
449
+
450
+ #: admin/includes/options.php:262 admin/pages/widgets.php:161
451
+ msgid "Remove the \"RSS\" widget"
452
+ msgstr "Eliminar el widget \"RSS \""
453
+
454
+ #: admin/includes/options.php:267 admin/pages/widgets.php:170
455
+ msgid "Remove the \"Menu\" widget"
456
+ msgstr "Eliminar el widget \"Menú \""
457
+
458
+ #: admin/includes/options.php:272 admin/pages/widgets.php:179
459
+ msgid "Remove the \"Twenty Eleven Ephemera\" widget"
460
+ msgstr "Eliminar el widget \"Twenty Eleven Ephemera \""
461
+
462
+ #: admin/includes/options.php:275 admin/includes/options.php:338
463
+ #: admin/pages/performance.php:273
464
+ msgid "Disable revision"
465
+ msgstr "Deshabilitar revision"
466
+
467
+ #: admin/includes/options.php:276 admin/includes/options.php:343
468
+ #: admin/pages/performance.php:286
469
+ msgid "Limit Post Revisions"
470
+ msgstr "Limitar las revisiones de publicaciones"
471
+
472
+ #: admin/includes/options.php:277 admin/pages/seo.php:140
473
+ msgid "Exclude pages:"
474
+ msgstr "Páginas excluídas:"
475
+
476
+ #: admin/includes/options.php:280 admin/pages/seo.php:89
477
+ msgid "Create right robots.txt"
478
+ msgstr "Crear robots.txt perfectos"
479
+
480
+ #: admin/includes/options.php:285 admin/pages/seo.php:104
481
+ msgid "You can edit the robots.txt file in the box below:"
482
+ msgstr "Puede editar el archivo robots.txt en el siguiente cuadro:"
483
+
484
+ #: admin/includes/options.php:288
485
+ msgid "Quick mode"
486
+ msgstr "Modo rápido"
487
+
488
+ #: admin/includes/options.php:291 admin/pages/performance.php:146
489
+ msgid "Remove jQuery Migrate"
490
+ msgstr "Eliminar jQuery Migrate"
491
+
492
+ #: admin/includes/options.php:294 admin/pages/performance.php:156
493
+ msgid "Disable Embeds"
494
+ msgstr "Desactivar \"embeds\""
495
+
496
+ #: admin/includes/options.php:295 admin/pages/performance.php:85
497
+ msgid "Disable RSS feeds"
498
+ msgstr "Deshabilitar las fuentes RSS"
499
+
500
+ #: admin/includes/options.php:298
501
+ msgid "Removes links to wordpress.org site from the admin bar"
502
+ msgstr ""
503
+ "Elimina los enlaces al sitio wordpress.org de la barra de administración"
504
+
505
+ #: admin/includes/options.php:313
506
+ msgid "Eclude stylesheet/script file names"
507
+ msgstr "Ecluir nombre de archivos stylesheet/script"
508
+
509
+ #: admin/includes/options.php:318
510
+ msgid "Enable Sanitization of WordPress"
511
+ msgstr "Habilitar el saneamiento de WordPress"
512
+
513
+ #: admin/includes/options.php:323 admin/pages/advanced.php:71
514
+ msgid "Disable admin top bar"
515
+ msgstr "Deshabilitar la barra superior del administrador"
516
+
517
+ #: admin/includes/options.php:328
518
+ msgid "Remove admin bar WP logo"
519
+ msgstr "Eliminar logo WP de la barra de administración"
520
+
521
+ #: admin/includes/options.php:333
522
+ msgid "Replace \"Howdy\" text with \"Welcome\""
523
+ msgstr "Reemplace el texto \"Howdy\" con \"Bienvenido\""
524
+
525
+ #: admin/includes/options.php:348 admin/pages/performance.php:321
526
+ msgid "Disable autosave"
527
+ msgstr "Deshabilitar el guardado automático"
528
+
529
+ #: admin/includes/options.php:353
530
+ msgid "Disable Texturization - Smart Quotes"
531
+ msgstr "Deshabilitar la texturización - Smart Quotes"
532
+
533
+ #: admin/includes/options.php:358
534
+ msgid "Disable capitalization in Wordpress branding"
535
+ msgstr "Deshabilitar el uso de mayúsculas en la marca de Wordpress"
536
+
537
+ #: admin/includes/options.php:363
538
+ msgid "Disable auto inserted paragraphs (i.e. p tags)"
539
+ msgstr ""
540
+ "Desactivar párrafos insertados automáticamente (Ejemplo., las etiquetas p)"
541
+
542
+ #: admin/includes/options.php:368 admin/pages/performance.php:388
543
+ msgid "Disable Heartbeat"
544
+ msgstr "Deshabilitar Heartbeat"
545
+
546
+ #: admin/includes/options.php:373 admin/pages/performance.php:417
547
+ msgid "Heartbeat frequency"
548
+ msgstr "Frecuencia Heartbeat"
549
+
550
+ #: admin/includes/options.php:378 admin/pages/defence.php:111
551
+ msgid "Remove html comments"
552
+ msgstr "Eliminar comentarios html"
553
+
554
+ #: admin/includes/options.php:383
555
+ msgid "Deactivate preinstall components"
556
+ msgstr "Desactivar componentes preinstalados"
557
+
558
+ #: admin/includes/options.php:388
559
+ msgid "Freemius activated addons"
560
+ msgstr "Complementos activados por Freemius"
561
+
562
+ #: admin/includes/options.php:394 admin/pages/clearfy-settings.php:99
563
+ msgid "Disable menu in adminbar"
564
+ msgstr "Deshabilitar el menú en la barra de administración"
565
+
566
+ #: admin/includes/sidebar-widgets.php:22 admin/pages/license.php:150
567
+ msgid "Activation Clearfy Business"
568
+ msgstr "Activación Clearfy Business"
569
+
570
+ #: admin/includes/sidebar-widgets.php:25 admin/pages/license.php:151
571
+ msgid ""
572
+ "<b>Clearfy Business</b> is a paid package of components for the popular free "
573
+ "WordPress plugin named Clearfy. You get access to all paid components at one "
574
+ "price."
575
+ msgstr ""
576
+ "<b>Clearfy Business</b es un paquete de componentes de pago para el popular "
577
+ "complemento gratuito de WordPress llamado Clearfy. Accesda todos los "
578
+ "componentes de pago a un solo precio."
579
+
580
+ #: admin/includes/sidebar-widgets.php:26 admin/pages/license.php:152
581
+ msgid ""
582
+ "Paid license guarantees that you can download and update existing and future "
583
+ "paid components of the plugin."
584
+ msgstr ""
585
+ "La licencia de pago de este plugin, le garantiza descargas y actualizaciones "
586
+ "existentes y a futuro."
587
+
588
+ #: admin/includes/sidebar-widgets.php:29
589
+ #, php-format
590
+ msgid "Upgrade to Clearfy Business for $%s"
591
+ msgstr "Actualice a Clearfy Business por $%s"
592
+
593
+ #: admin/includes/sidebar-widgets.php:58
594
+ msgid "Having Issues?"
595
+ msgstr "¿Algún Problema?"
596
+
597
+ #: admin/includes/sidebar-widgets.php:61
598
+ msgid ""
599
+ "We provide free support for this plugin. If you are pushed with a problem, "
600
+ "just create a new ticket. We will definitely help you!"
601
+ msgstr ""
602
+ "Proporcionamos soporte gratuito para este plugin. Si tiene un problema, cree "
603
+ "un nuevo ticket. ¡Definitivamente te ayudaremos!"
604
+
605
+ #: admin/includes/sidebar-widgets.php:65
606
+ msgid "Get starting free support"
607
+ msgstr "Iniciar soporte gratuito"
608
+
609
+ #: admin/includes/sidebar-widgets.php:69
610
+ #, php-format
611
+ msgid ""
612
+ "If you find a php error or a vulnerability in plugin, you can <a href=\"%s\" "
613
+ "target=\"_blank\" rel=\"noopener\">create ticket</a> in hot support that we "
614
+ "responded instantly."
615
+ msgstr ""
616
+ "Si encuentra un error de PHP o una vulnerabilidad en el Plugin, puede <a "
617
+ "href=\"%s\" target=\"_blank\" rel=\"noopener\"> crear un ticket </a> en "
618
+ "soporte para su inmediata atención."
619
+
620
+ #: admin/pages/advanced.php:38
621
+ msgid "Advanced"
622
+ msgstr "Avanzado"
623
+
624
+ #: admin/pages/advanced.php:39 admin/pages/clearfy-settings.php:48
625
+ msgid "Useful tweaks"
626
+ msgstr "Ajustes útiles"
627
+
628
+ #: admin/pages/advanced.php:64
629
+ msgid "Admin bar"
630
+ msgstr "Barra de administración"
631
+
632
+ #: admin/pages/advanced.php:64
633
+ msgid "In this group of settings, you can manage the adminbar."
634
+ msgstr ""
635
+ "En este grupo de configuraciones, puede gestionar la barra de administración."
636
+
637
+ #: admin/pages/advanced.php:73
638
+ msgid "Default enable"
639
+ msgstr "Habilitar por defecto"
640
+
641
+ #: admin/pages/advanced.php:74
642
+ msgid "For all users"
643
+ msgstr "Para todos los usuarios"
644
+
645
+ #: admin/pages/advanced.php:77
646
+ msgid "For all users except administrator"
647
+ msgstr "Para todos los usuarios excepto administrador"
648
+
649
+ #: admin/pages/advanced.php:81
650
+ msgid ""
651
+ "In some cases, you need to disable the floating top admin panel. You can "
652
+ "disable this panel."
653
+ msgstr ""
654
+ "A veces, debe deshabilitar el panel superior flotante de administración. "
655
+ "Puede deshabilitar este panel."
656
+
657
+ #: admin/pages/advanced.php:81
658
+ msgid "Disable admin top bar."
659
+ msgstr "Desactivar la barra superior del administrador."
660
+
661
+ #: admin/pages/clearfy-settings.php:47
662
+ msgid "Clearfy Settings"
663
+ msgstr "Configuraciones Clearfy"
664
+
665
+ #: admin/pages/clearfy-settings.php:72 admin/pages/quick-start.php:105
666
+ msgid "Settings successfully updated!"
667
+ msgstr "Configuraciones exitosamente actualizadas!"
668
+
669
+ #: admin/pages/clearfy-settings.php:73 admin/pages/quick-start.php:106
670
+ msgid ""
671
+ "During the setup, an unknown error occurred, please try again or contact the "
672
+ "plugin support."
673
+ msgstr ""
674
+ "Durante la configuración, se produjo un error desconocido, inténtelo de "
675
+ "nuevo o póngase en contacto con el soporte del plugin."
676
+
677
+ #: admin/pages/clearfy-settings.php:92
678
+ msgid "Advanced settings"
679
+ msgstr "Ajustes avanzados"
680
+
681
+ #: admin/pages/clearfy-settings.php:92 admin/pages/clearfy-settings.php:117
682
+ #: admin/pages/clearfy-settings.php:127
683
+ msgid ""
684
+ "This group of settings allows you to configure the work of the Clearfy "
685
+ "plugin."
686
+ msgstr ""
687
+ "Estas configuraciones le permitirá administrar el trabajo del complemento "
688
+ "Clearfy."
689
+
690
+ #: admin/pages/clearfy-settings.php:101
691
+ msgid ""
692
+ "This setting allows you to disable the additional menu of the Clearfy "
693
+ "plugin, in the admin bar. This menu is required to work with the Minify and "
694
+ "Combine and Assets Manager components."
695
+ msgstr ""
696
+ "Esta configuración le permite desactivar el menú adicional del complemento "
697
+ "Clearfy en la barra de administración. Este menú es necesario para trabajar "
698
+ "con los componentes Minify, Combine y Assets Manager."
699
+
700
+ #: admin/pages/clearfy-settings.php:109
701
+ msgid "Complete Uninstall"
702
+ msgstr "Desinstalación Completa"
703
+
704
+ #: admin/pages/clearfy-settings.php:111
705
+ msgid ""
706
+ "When the plugin is deleted from the Plugins menu, also delete all plugin "
707
+ "settings."
708
+ msgstr "Al eliminar este plugin, tambien debe eliminar los ajustes del mismo."
709
+
710
+ #: admin/pages/clearfy-settings.php:117
711
+ msgid "Import/Export"
712
+ msgstr "Importar/Exportar"
713
+
714
+ #: admin/pages/clearfy-settings.php:127
715
+ msgid "Support"
716
+ msgstr "Soporte"
717
+
718
+ #: admin/pages/clearfy-settings.php:151
719
+ msgid "Import/Export settings"
720
+ msgstr "Ajustes de importación / exportación"
721
+
722
+ #: admin/pages/clearfy-settings.php:154
723
+ msgid "Import options"
724
+ msgstr "Importar opciones"
725
+
726
+ #: admin/pages/clearfy-settings.php:163
727
+ msgid ""
728
+ "If you faced with any issues, please follow the steps below to get quickly "
729
+ "quality support:"
730
+ msgstr ""
731
+ "Si tiene algun problema, siga los pasos a continuación para obtener un "
732
+ "soporte de calidad rápidamente:"
733
+
734
+ #: admin/pages/clearfy-settings.php:166
735
+ msgid ""
736
+ "Generate a debug report which will contains inforamtion about your "
737
+ "configuratin and installed plugins"
738
+ msgstr ""
739
+ "Generar informe de depuración que contendrá información sobre su "
740
+ "configuración y los plugin instalados"
741
+
742
+ #: admin/pages/clearfy-settings.php:168
743
+ msgid "Generate Debug Report"
744
+ msgstr "Generar informe de depuración"
745
+
746
+ #: admin/pages/clearfy-settings.php:172
747
+ #, php-format
748
+ msgid ""
749
+ "Create a new ticket in our <a href=\"%s\" target=\"_blank\">support forum</"
750
+ "a>, include the debug report into the message body."
751
+ msgstr ""
752
+ "Cree un nuevo ticket en nuestro <a href=\"%s\" target=\"_blank\">foro de "
753
+ "soporte</a> , incluya el informe de errores en el cuerpo del mensaje."
754
+
755
+ #: admin/pages/clearfy-settings.php:175
756
+ msgid "We guarantee to respond you within 7 business day."
757
+ msgstr "Te responderemos antes de 7 días hábiles"
758
+
759
+ #: admin/pages/components.php:44
760
+ msgid "Components"
761
+ msgstr "Componentes"
762
+
763
+ #: admin/pages/components.php:45
764
+ msgid "More features for plugin"
765
+ msgstr "Más características de plugin."
766
+
767
+ #: admin/pages/components.php:102
768
+ msgid "Components have been successfully updated to the latest version."
769
+ msgstr "Los componentes se han actualizado con éxito a la última versión."
770
+
771
+ #: admin/pages/components.php:118
772
+ msgid ""
773
+ "An unknown error occurred while updating plugin components. Please contact "
774
+ "the plugin support team to resolve this issue."
775
+ msgstr ""
776
+ "Se produjo un error desconocido al actualizar los componentes del "
777
+ "complemento. Por favor, póngase en contacto con nuestro equipo de soporte "
778
+ "para resolver este problema."
779
+
780
+ #: admin/pages/components.php:216
781
+ msgid "Hide my wp"
782
+ msgstr ""
783
+
784
+ #: admin/pages/components.php:216 admin/pages/components.php:224
785
+ #: admin/pages/components.php:232 admin/pages/components.php:240
786
+ msgid "[Premium]"
787
+ msgstr ""
788
+
789
+ #: admin/pages/components.php:220
790
+ msgid ""
791
+ "You can protect your WP by preventing the hacker from knowing which CMS, "
792
+ "plugins, themes you use. It disables identification of your CMS."
793
+ msgstr ""
794
+
795
+ #: admin/pages/components.php:224
796
+ msgid "Assets manager"
797
+ msgstr "Gestor de Activos"
798
+
799
+ #: admin/pages/components.php:228
800
+ msgid "Extensions for the component Assets Manager"
801
+ msgstr ""
802
+
803
+ #: admin/pages/components.php:232 admin/pages/components.php:293
804
+ msgid "Updates manager"
805
+ msgstr "Gestor de actualizaciones"
806
+
807
+ #: admin/pages/components.php:236
808
+ msgid "Extensions for the component Updates Manager"
809
+ msgstr ""
810
+
811
+ #: admin/pages/components.php:240
812
+ msgid "Seo friendly images"
813
+ msgstr ""
814
+
815
+ #: admin/pages/components.php:244
816
+ msgid ""
817
+ "Automatically assign alt and title for images, flexibly customize the "
818
+ "template."
819
+ msgstr ""
820
+
821
+ #: admin/pages/components.php:251
822
+ msgid "Robin image optimizer"
823
+ msgstr "Optimizador de imagenes Robin"
824
+
825
+ #: admin/pages/components.php:256
826
+ msgid ""
827
+ "Automatic image optimization without any quality loss. No limitations, no "
828
+ "paid plans. The best Wordpress image optimization plugin allows optimizing "
829
+ "any amount of images for free!"
830
+ msgstr ""
831
+ "Optimización automática de imágenes sin pérdida de calidad. Sin "
832
+ "limitaciones, sin planes pagados. ¡El mejor plugin de optimización de "
833
+ "imágenes de Wordpress sin límites y gratis!"
834
+
835
+ #: admin/pages/components.php:260 admin/pages/hide-login-page.php:64
836
+ msgid "Hide login page"
837
+ msgstr "Ocultar la página de inicio de sesión"
838
+
839
+ #: admin/pages/components.php:265
840
+ msgid ""
841
+ "Hide Login Page is a very light plugin that lets you easily and safely "
842
+ "change the url of the login form page to anything you want."
843
+ msgstr ""
844
+ "La página de inicio de sesión oculta es un complemento muy ligero que le "
845
+ "permite cambiar de forma fácil y segura la url de la página del formulario "
846
+ "de inicio de sesión."
847
+
848
+ #: admin/pages/components.php:269
849
+ msgid "Html minify"
850
+ msgstr "Minificar HTML"
851
+
852
+ #: admin/pages/components.php:273
853
+ msgid ""
854
+ "Ever look at the HTML markup of your website and notice how sloppy and "
855
+ "amateurish it looks? The Minify HTML options cleans up sloppy looking markup "
856
+ "and minifies, which also speeds up download"
857
+ msgstr ""
858
+ "¿Alguna vez has visto el código HTML de tu sitio web? ¿has notado lo "
859
+ "descuidado y desordenado que se ve? Las opciones Minify HTML mejoran el "
860
+ "aspecto HTML y lo minimiza, optimizando la descarga"
861
+
862
+ #: admin/pages/components.php:277
863
+ msgid "Minify and combine (JS, CSS)"
864
+ msgstr "Minificar and combinar (JS, CSS)"
865
+
866
+ #: admin/pages/components.php:281
867
+ msgid ""
868
+ "Improve your speed score on GTmetrix, Pingdom Tools and Google PageSpeed "
869
+ "Insights by merging and minifying CSS, JavaScript."
870
+ msgstr ""
871
+ "Mejore su puntaje de velocidad en GTmetrix, Pingdom Tools y Google PageSpeed "
872
+ "Insights combinando y reduciendo CSS, JavaScript."
873
+
874
+ #: admin/pages/components.php:285
875
+ msgid "Google Analytics Cache"
876
+ msgstr "Cache de Google Analytics"
877
+
878
+ #: admin/pages/components.php:289
879
+ msgid ""
880
+ "To improve Google Page Speed indicators Analytics caching is needed. "
881
+ "However, it can also slightly increase your website loading speed, because "
882
+ "Analytics js files will load locally."
883
+ msgstr ""
884
+ "Para mejorar los indicadores de velocidad de la página de Google, es "
885
+ "necesario el almacenamiento en caché de Analytics. Sin embargo, también "
886
+ "puede aumentar ligeramente la velocidad de carga de su sitio web, ya que los "
887
+ "archivos de Analytics js se cargarán localmente."
888
+
889
+ #: admin/pages/components.php:297
890
+ msgid "Disable updates enable auto updates for themes, plugins and WordPress."
891
+ msgstr ""
892
+ "Deshabilitar actualizaciones, habilita actualizaciones automáticas para "
893
+ "temas, plugins y WordPress."
894
+
895
+ #: admin/pages/components.php:301
896
+ msgid "Comments tools"
897
+ msgstr "Herramientas de comentarios"
898
+
899
+ #: admin/pages/components.php:305
900
+ msgid ""
901
+ "Bulk disable and remove comments, disable “Website” field, hides external "
902
+ "links, disable XML-RPC."
903
+ msgstr ""
904
+ "Desactive y elimine los comentarios de forma masiva, desactive el campo "
905
+ "\"Sitio web\", oculte los enlaces externos, desactive XML-RPC."
906
+
907
+ #: admin/pages/components.php:309
908
+ msgid "Widgets tools"
909
+ msgstr "Herramientas de Widgets"
910
+
911
+ #: admin/pages/components.php:313
912
+ msgid "Disable unused widgets such as tag cloud, links, calendar etc."
913
+ msgstr ""
914
+ "Desactive los widgets no utilizados, nube de etiquetas, enlaces, calendario, "
915
+ "etc."
916
+
917
+ #: admin/pages/components.php:317
918
+ msgid "Asset manager"
919
+ msgstr "Gestor de Activos"
920
+
921
+ #: admin/pages/components.php:321
922
+ msgid ""
923
+ "Selectively disable unused scripts and styles on the pages of your website."
924
+ msgstr ""
925
+ "Desactive de forma selectiva los scripts y estilos no utilizados en las "
926
+ "páginas de su web."
927
+
928
+ #: admin/pages/components.php:325
929
+ msgid "Disable admin notices"
930
+ msgstr "Desactivar avisos de administrador"
931
+
932
+ #: admin/pages/components.php:329
933
+ msgid ""
934
+ "Disables admin notices bulk or individually. Collects notices into the admin "
935
+ "bar."
936
+ msgstr ""
937
+ "Desactiva los avisos de administración masiva o individualmente. Recoge "
938
+ "avisos en la barra de administración."
939
+
940
+ #: admin/pages/components.php:333
941
+ msgid "Admin bar manager"
942
+ msgstr "Gestor de la barra de administración"
943
+
944
+ #: admin/pages/components.php:337
945
+ msgid "Disables admin bar. Allows to change and remove admin bar elements."
946
+ msgstr ""
947
+ "Desactivar la barra de administración. Permite cambiar y eliminar elementos "
948
+ "de la barra de administración."
949
+
950
+ #: admin/pages/components.php:341
951
+ msgid "Yoast SEO optimization"
952
+ msgstr "Optimización Yoast SEO"
953
+
954
+ #: admin/pages/components.php:345
955
+ msgid "Set of optimization functions for the popular Yoast SEO plugin."
956
+ msgstr ""
957
+ "Conjunto de funciones de optimización para el popular plugin Yoast SEO."
958
+
959
+ #: admin/pages/components.php:351
960
+ msgid "Transliteration of Cyrillic alphabet"
961
+ msgstr "Transliteración del alfabeto Cirílico"
962
+
963
+ #: admin/pages/components.php:355
964
+ msgid ""
965
+ "Converts Cyrillic permalinks of post, pages, taxonomies and media files to "
966
+ "the Latin alphabet. Supports Russian, Ukrainian, Georgian, Bulgarian "
967
+ "languages."
968
+ msgstr ""
969
+ "Convierte los enlaces cirílicos de publicaciones, páginas, taxonomías y "
970
+ "archivos multimedia al alfabeto latino. Soporta idiomas ruso, ucraniano, "
971
+ "georgiano, búlgaro."
972
+
973
+ #: admin/pages/components.php:405
974
+ msgid "<strong>Plugin Components</strong>."
975
+ msgstr "<strong>Componentes de Plugin</strong>."
976
+
977
+ #: admin/pages/components.php:407
978
+ msgid ""
979
+ "These are components of the plugin bundle. When you activate the plugin, all "
980
+ "the components turned on by default. If you don’t need some function, you "
981
+ "can easily turn it off on this page."
982
+ msgstr ""
983
+ "Estos son componentes del paquete de plugins. Cuando activa el complemento, "
984
+ "todos los componentes se activan de forma predeterminada. Si no necesita "
985
+ "alguna función, puede desactivarla fácilmente en esta página."
986
+
987
+ #: admin/pages/components.php:457
988
+ msgid "Premium"
989
+ msgstr "Premium"
990
+
991
+ #: admin/pages/defence.php:35
992
+ msgid "Defence"
993
+ msgstr "Defensa"
994
+
995
+ #: admin/pages/defence.php:36
996
+ msgid "Protective hacks, privacy"
997
+ msgstr "Protección Hacks, privacidad."
998
+
999
+ #: admin/pages/defence.php:54
1000
+ msgid "<strong>Base settings</strong>."
1001
+ msgstr "<strong>Configuración de base</strong>."
1002
+
1003
+ #: admin/pages/defence.php:54
1004
+ msgid "Basic recommended security settings."
1005
+ msgstr "Ajustes básicos de seguridad recomendados."
1006
+
1007
+ #: admin/pages/defence.php:63
1008
+ msgid ""
1009
+ "An attacker can find out the author's login, using a similar request to get "
1010
+ "your site. mysite.com/?author=1"
1011
+ msgstr ""
1012
+ "Un atacante puede averiguar el inicio de sesión del autor, utilizando una "
1013
+ "solicitud similar para tomar su sitio. mysite.com/?author=1"
1014
+
1015
+ #: admin/pages/defence.php:63
1016
+ msgid "Sets the redirect to exclude the possibility of obtaining a login."
1017
+ msgstr ""
1018
+ "Establece el redireccionamiento para excluir la posibilidad de obtener un "
1019
+ "inicio de sesión."
1020
+
1021
+ #: admin/pages/defence.php:73
1022
+ msgid ""
1023
+ "WP by default shows whether you entered a wrong login or incorrect password, "
1024
+ "which allows attackers to understand if there is a certain user on the site, "
1025
+ "and then start searching through the passwords."
1026
+ msgstr ""
1027
+ "Por defecto, WP muestra si ingresó un inicio de sesión incorrecto o una "
1028
+ "contraseña incorrecta, esto permite a los atacantes saber si hay un "
1029
+ "determinado usuario en el sitio y luego comenzar a buscar a través de las "
1030
+ "contraseñas."
1031
+
1032
+ #: admin/pages/defence.php:73
1033
+ msgid ""
1034
+ "Changes in the text of the error so that attackers could not find the login."
1035
+ msgstr ""
1036
+ "Cambios en el texto del error para que los atacantes no ecuentren el inicio "
1037
+ "de sesión."
1038
+
1039
+ #: admin/pages/defence.php:81
1040
+ msgid "Disable XML-RPC"
1041
+ msgstr "Desactivar XML-RPC"
1042
+
1043
+ #: admin/pages/defence.php:83
1044
+ msgid ""
1045
+ "A pingback is basically an automated comment that gets created when another "
1046
+ "blog links to you. A self-pingback is created when you link to an article "
1047
+ "within your own blog. Pingbacks are essentially nothing more than spam and "
1048
+ "simply waste resources."
1049
+ msgstr ""
1050
+ "Un pingback es básicamente un comentario automatizado que se crea cuando "
1051
+ "otro blog te enlaza. Se crea un auto-pingback cuando se vincula a un "
1052
+ "artículo dentro de su propio blog. Los pingbacks son spam y simplemente "
1053
+ "desperdician recursos."
1054
+
1055
+ #: admin/pages/defence.php:83
1056
+ msgid "Removes the server responses a reference to the xmlrpc file."
1057
+ msgstr "Elimina una referencia las respuestas del servidor al archivo xmlrpc."
1058
+
1059
+ #: admin/pages/defence.php:104
1060
+ msgid "<strong>Hide WordPress versions</strong>"
1061
+ msgstr "<strong>Ocultar versiones de WordPress</strong>"
1062
+
1063
+ #: admin/pages/defence.php:104
1064
+ msgid ""
1065
+ "WordPress itself and many plugins shows their version at the public areas of "
1066
+ "your site. An attacker received this information may be aware of the "
1067
+ "vulnerabilities found in the version of the WordPress core or plugins."
1068
+ msgstr ""
1069
+ "WordPress y muchos plugin muestran su versión en las áreas públicas de su "
1070
+ "sitio. Un atacante que capte esta información puede saber las "
1071
+ "vulnerabilidades encontradas en la versión del núcleo o en los plugins de "
1072
+ "WordPress."
1073
+
1074
+ #: admin/pages/defence.php:113
1075
+ msgid ""
1076
+ "This function will remove all html comments in the source code, except for "
1077
+ "special and hidden comments. This is necessary to hide the version of "
1078
+ "installed plugins."
1079
+ msgstr ""
1080
+ "Esta función eliminará todos los comentarios html en el código fuente, "
1081
+ "excepto los comentarios especiales y ocultos. Esto es necesario para ocultar "
1082
+ "la versión de los plugins instalados."
1083
+
1084
+ #: admin/pages/defence.php:113
1085
+ msgid "Remove html comments in source code."
1086
+ msgstr "Eliminar los comentarios html en el código fuente."
1087
+
1088
+ #: admin/pages/defence.php:121 admin/pages/performance.php:337
1089
+ #: admin/pages/performance.php:348 admin/pages/seo.php:79
1090
+ #: admin/pages/seo.php:118 admin/pages/seo.php:132 admin/pages/seo.php:149
1091
+ #: admin/pages/seo.php:163 admin/pages/seo.php:173 admin/pages/seo.php:226
1092
+ msgid "Recommended"
1093
+ msgstr "Recomendado"
1094
+
1095
+ #: admin/pages/defence.php:123
1096
+ msgid ""
1097
+ "Allows attacker to learn the version of WP installed on the site. This meta "
1098
+ "tag has no useful function."
1099
+ msgstr ""
1100
+ "Permite al atacante conocer la versión de WP instalada en el sitio. Esta "
1101
+ "etiqueta meta no tiene ninguna función útil."
1102
+
1103
+ #: admin/pages/defence.php:123
1104
+ #, php-format
1105
+ msgid "Removes the meta tag from the %s section"
1106
+ msgstr "Elimina la etiqueta meta de la sección %s"
1107
+
1108
+ #: admin/pages/defence.php:150
1109
+ msgid ""
1110
+ "<b>Use this option carefully!</b><br> Plugins like jetpack may have problems "
1111
+ "using this option."
1112
+ msgstr ""
1113
+ "<b>¡Use esta opción con cuidado!</b><br> Los plugin como jetpack pueden "
1114
+ "tener problemas al usar esta opción."
1115
+
1116
+ #: admin/pages/hide-login-page.php:96
1117
+ msgid "Install Hide login page component"
1118
+ msgstr "Instalar el plugin (Hide login page)"
1119
+
1120
+ #: admin/pages/hide-login-page.php:98
1121
+ msgid ""
1122
+ "To start protect login page, you need to install the additional component "
1123
+ "Hide login page!"
1124
+ msgstr ""
1125
+ "Para comenzar a proteger la página de inicio de sesión, debe instalar el "
1126
+ "plugin adicional (Hide login page!)"
1127
+
1128
+ #: admin/pages/hide-login-page.php:100
1129
+ msgid ""
1130
+ "Installing the component will not take you long, just click the install "
1131
+ "button, then activate."
1132
+ msgstr ""
1133
+ "La instalación del plugin no le llevará mucho tiempo, simplemente haga clic "
1134
+ "en el botón de instalación, luego active."
1135
+
1136
+ #: admin/pages/image-optimization.php:64
1137
+ msgid "Image optimization"
1138
+ msgstr "Optimización de imágenes"
1139
+
1140
+ #: admin/pages/image-optimization.php:65
1141
+ msgid "Compress bulk of images"
1142
+ msgstr "Comprimir imágenes a granel"
1143
+
1144
+ #: admin/pages/image-optimization.php:98
1145
+ msgid "Install Robin Image Optimizer component"
1146
+ msgstr "Instalar componente Robin Image Optimizer"
1147
+
1148
+ #: admin/pages/image-optimization.php:100
1149
+ msgid ""
1150
+ "To start optimizing images, you need to install the additional component "
1151
+ "Robin image optimizer!"
1152
+ msgstr ""
1153
+ "Para comenzar a optimizar las imágenes, necesita instalar el plugin "
1154
+ "adicional (Robin image optimizer)."
1155
+
1156
+ #: admin/pages/image-optimization.php:102
1157
+ msgid ""
1158
+ "Installing the component will not take you long, just click the install "
1159
+ "button, then\tactivate."
1160
+ msgstr ""
1161
+ "La instalación del plugin no le llevará mucho tiempo, simplemente haga clic "
1162
+ "en el botón de instalación, luego actívelo."
1163
+
1164
+ #: admin/pages/license.php:61
1165
+ msgid "License"
1166
+ msgstr "Licencia"
1167
+
1168
+ #: admin/pages/license.php:62
1169
+ msgid "Product activation"
1170
+ msgstr "Activación del producto"
1171
+
1172
+ #: admin/pages/license.php:160
1173
+ #, php-format
1174
+ msgid "Upgrade to Premium for $%s"
1175
+ msgstr "Actualizar a Premium por $%s"
1176
+
1177
+ #: admin/pages/license.php:164
1178
+ #, php-format
1179
+ msgid "Your current license for %1$s:"
1180
+ msgstr "Su licencia actual por %1$s:"
1181
+
1182
+ #: admin/pages/license.php:168
1183
+ msgid "Delete Key"
1184
+ msgstr "Eliminar Clave"
1185
+
1186
+ #: admin/pages/license.php:170
1187
+ msgid "Synchronization"
1188
+ msgstr "Sincronización"
1189
+
1190
+ #: admin/pages/license.php:176
1191
+ #, php-format
1192
+ msgid "(Automatic renewal, every %s"
1193
+ msgstr "(Renovación automática, cada %s"
1194
+
1195
+ #: admin/pages/license.php:184
1196
+ msgid ""
1197
+ "Public License is a GPLv2 compatible license allowing you to change and use "
1198
+ "this version of the plugin for free. Please keep in mind this license covers "
1199
+ "only free edition of the plugin. Premium versions are distributed with other "
1200
+ "type of a license."
1201
+ msgstr ""
1202
+ "Licencia Pública compatible con GPLv2 que permite cambiar y utilizar esta "
1203
+ "versión del complemento de forma gratuita. Tenga en cuenta que esta licencia "
1204
+ "solo cubre la versión gratuita del plugin. Las versiones premium se "
1205
+ "distribuyen con otro tipo de licencia."
1206
+
1207
+ #: admin/pages/license.php:188
1208
+ msgid ""
1209
+ "You use a paid subscription for the plugin updates. In case you don’t want "
1210
+ "to receive paid updates, please, click <a data-action=\"unsubscribe\" class="
1211
+ "\"wcl-control-btn\" href=\"#\">cancel subscription</a>"
1212
+ msgstr ""
1213
+ "Utilizas una suscripción de pago para las actualizaciones del plugin. En "
1214
+ "caso de que no desee recibir actualizaciones pagas, haga clic en<a data-"
1215
+ "action=\"unsubscribe\" class=\"wcl-control-btn\" href=\"#\">cancelar "
1216
+ "suscripción</ a >"
1217
+
1218
+ #: admin/pages/license.php:193
1219
+ msgid ""
1220
+ "Your license has expired, please extend the license to get updates and "
1221
+ "support."
1222
+ msgstr ""
1223
+ "Su licencia ha caducado, amplíe la licencia para obtener actualizaciones y "
1224
+ "soporte."
1225
+
1226
+ #: admin/pages/license.php:201
1227
+ msgid "domain"
1228
+ msgstr "dominio"
1229
+
1230
+ #: admin/pages/license.php:205
1231
+ msgid "plan"
1232
+ msgstr "plan"
1233
+
1234
+ #: admin/pages/license.php:209
1235
+ msgid "of"
1236
+ msgstr "de"
1237
+
1238
+ #: admin/pages/license.php:210
1239
+ msgid "active sites"
1240
+ msgstr "sitios activos"
1241
+
1242
+ #: admin/pages/license.php:215
1243
+ msgid "version"
1244
+ msgstr "versión"
1245
+
1246
+ #: admin/pages/license.php:216
1247
+ msgid "up-to-date"
1248
+ msgstr "actualizado"
1249
+
1250
+ #: admin/pages/license.php:221
1251
+ msgid "EXPIRED!"
1252
+ msgstr "¡CADUCADO!"
1253
+
1254
+ #: admin/pages/license.php:222
1255
+ msgid "please update the key"
1256
+ msgstr "por favor actualiza la clave"
1257
+
1258
+ #: admin/pages/license.php:231
1259
+ msgid "day(s)"
1260
+ msgstr "día(s)"
1261
+
1262
+ #: admin/pages/license.php:233
1263
+ msgid "remained"
1264
+ msgstr "Se mantuvo"
1265
+
1266
+ #: admin/pages/license.php:244
1267
+ msgid "Have a key to activate the premium version? Paste it here:"
1268
+ msgstr "¿Tienes una Clave para activar la versión premium? Pégala aquí:"
1269
+
1270
+ #: admin/pages/license.php:246
1271
+ msgid "Have a key to activate the plugin? Paste it here:"
1272
+ msgstr "¿Tienes una Clave para activar el plugin? Pégala aquí:"
1273
+
1274
+ #: admin/pages/license.php:250
1275
+ msgid "Submit Key"
1276
+ msgstr "Enviar Clave"
1277
+
1278
+ #: admin/pages/license.php:257
1279
+ #, php-format
1280
+ msgid ""
1281
+ "<a href=\"%s\" target=\"_blank\" rel=\"noopener\">Lean more</a> about the "
1282
+ "premium version and get the license key to activate it now!"
1283
+ msgstr ""
1284
+ "<a href=\"%s\" target=\"_blank\" rel=\"noopener\">Aprender mas</a>acerca de "
1285
+ "la versión premium y obtenga la clave de licencia (KEY) para activarla ahora!"
1286
+
1287
+ #: admin/pages/license.php:261
1288
+ #, php-format
1289
+ msgid ""
1290
+ "Can’t find your key? Go to <a href=\"%s\" target=\"_blank\" rel=\"noopener"
1291
+ "\">this page</a> and login using the e-mail address associated with your "
1292
+ "purchase."
1293
+ msgstr ""
1294
+ "¿No encuentras tu KEY? Ir a <a href=\"%s\" target=\"_blank\" rel=\"noopener"
1295
+ "\">this page</a> e inicie sesión utilizando la dirección de correo "
1296
+ "electrónico asociada con su compra."
1297
+
1298
+ #: admin/pages/performance-google.php:48
1299
+ msgid "Google services"
1300
+ msgstr "Servicios de google"
1301
+
1302
+ #: admin/pages/performance-google.php:87
1303
+ msgid "<strong>Fonts and Maps</strong>."
1304
+ msgstr "<strong>Fuentes y Mapas</strong>."
1305
+
1306
+ #: admin/pages/performance-google.php:87
1307
+ msgid ""
1308
+ "Google Fonts and Maps strongly affect your website loading speed. Use "
1309
+ "settings below to disable or optimize Google fonts and Maps."
1310
+ msgstr ""
1311
+ "Google Fonts y Maps afectan fuertemente la velocidad de carga de tu sitio "
1312
+ "web. Use la configuración a continuación para deshabilitar u optimizar las "
1313
+ "fuentes y los Mapas de Google."
1314
+
1315
+ #: admin/pages/performance-google.php:96
1316
+ msgid ""
1317
+ "By default, WordPress loads Google fonts synchronously, that is, your page "
1318
+ "will not be fully loaded until Google Fonts are loaded. This algorithm slows "
1319
+ "down the loading of your page and leads to errors when checking the site in "
1320
+ "Google Page Speed. Using this option, your Google Fonts will be loaded after "
1321
+ "your page is fully loaded. This method has a negative — you and visitors of "
1322
+ "your site will see how the font changes while loading a page, from the "
1323
+ "system to the downloadable one."
1324
+ msgstr ""
1325
+ "Por defecto, WordPress carga las fuentes de Google de forma síncrona, es "
1326
+ "decir, su página no se cargará completamente hasta que se carguen las "
1327
+ "Fuentes de Google. Este algoritmo ralentiza la carga de su página y genera "
1328
+ "errores al analizar el sitio con Google Page Speed. Con esta opción, las "
1329
+ "fuentes de Google se cargarán una vez que su página esté completamente "
1330
+ "cargada. Este método tiene un aspecto negativo: usted y los visitantes de su "
1331
+ "sitio verán cómo cambian las fuentes al cargar una página."
1332
+
1333
+ #: admin/pages/performance-google.php:106
1334
+ msgid ""
1335
+ "This function stops loading of Open Sans and other fonts used by WordPress "
1336
+ "and bundled themes (Twenty Twelve, Twenty Thirteen, Twenty Fourteen, Twenty "
1337
+ "Fifteen, Twenty Sixteen, Twenty Seventeen) from Google Fonts.\n"
1338
+ "Reasons for not using Google Fonts might be privacy and security, local "
1339
+ "development or production, blocking of Google’s servers, characters not "
1340
+ "supported by font, performance."
1341
+ msgstr ""
1342
+ "Esta función detiene la carga de Open Sans y otras fuentes utilizadas por "
1343
+ "WordPress y los temas combinados (Twenty Twelve, Twenty Thirteen, Twenty "
1344
+ "Fourteen, Twenty Fifteen, Twenty Sixteen, Twenty Seventeen) de Google "
1345
+ "Fonts.\n"
1346
+ "Las razones para no usar Google Fonts pueden ser la privacidad y la "
1347
+ "seguridad, el desarrollo o la producción local, el bloqueo de los servidores "
1348
+ "de Google, los caracteres incompatibles con la fuente, el rendimiento."
1349
+
1350
+ #: admin/pages/performance-google.php:117
1351
+ msgid ""
1352
+ "This function stops loading of Google Maps used by some themes or plugins.\n"
1353
+ "Reasons for not using Google Maps might be privacy and security, local "
1354
+ "development or production, blocking of Google’s servers, performance, not "
1355
+ "necessary, etc."
1356
+ msgstr ""
1357
+ "Esta función detiene la carga de Google Maps que usan algunos temas o "
1358
+ "plugins.\n"
1359
+ "Las razones para no usar Google Maps pueden ser la privacidad y la "
1360
+ "seguridad, el desarrollo o la producción local, el bloqueo de los servidores "
1361
+ "de Google, el rendimiento, no necesitarlo, etc."
1362
+
1363
+ #: admin/pages/performance-google.php:134
1364
+ msgid ""
1365
+ "By default, the \"Disable Google Maps\" option removes maps inserted with "
1366
+ "the SCRIPT tag from the page source code. However, you can also cut out all "
1367
+ "maps inserted via the iframe by enabling this option."
1368
+ msgstr ""
1369
+ "Por defecto, la opción \"Deshabilitar Google Maps \" elimina los mapas "
1370
+ "insertados con la etiqueta SCRIPT del código fuente de la página. Sin "
1371
+ "embargo, también puede cortar todos los mapas insertados a través del iframe "
1372
+ "habilitando esta opción."
1373
+
1374
+ #: admin/pages/performance-google.php:143
1375
+ msgid "Posts or Pages IDs separated by a ,"
1376
+ msgstr "Publicaciones o ID de páginas separadas por una \",\""
1377
+
1378
+ #: admin/pages/performance.php:43
1379
+ msgid "Performance"
1380
+ msgstr "Rendimiento"
1381
+
1382
+ #: admin/pages/performance.php:44
1383
+ msgid "Optimization js, css, fonts"
1384
+ msgstr "Optimización js, css, fuentes"
1385
+
1386
+ #: admin/pages/performance.php:63
1387
+ msgid ""
1388
+ "Warning! In the wp-config.php file, a constant WP_POST_REVISIONS is found, "
1389
+ "it determines the number of revisions. Delete it so you can change this "
1390
+ "value through the admin panel."
1391
+ msgstr ""
1392
+ "¡Advertencia! En el archivo wp-config.php, se encuentra una constante "
1393
+ "WP_POST_REVISIONS, que determina el número de revisiones. Elimínelo para que "
1394
+ "pueda cambiar este valor a través del panel de administración."
1395
+
1396
+ #: admin/pages/performance.php:78
1397
+ msgid "<strong>Clear the unnecessary scripts</strong>"
1398
+ msgstr "<strong>Limpiar scripts innecesarios</strong>"
1399
+
1400
+ #: admin/pages/performance.php:78
1401
+ msgid ""
1402
+ "This set of settings will help you remove unnecessary links and code from "
1403
+ "the head section, as well as reduce your website's pages weight."
1404
+ msgstr ""
1405
+ "Este conjunto de configuraciones lo ayudará a eliminar enlaces y códigos "
1406
+ "innecesarios de la sección de encabezados, así como a reducir el peso de las "
1407
+ "páginas de su sitio web."
1408
+
1409
+ #: admin/pages/performance.php:87
1410
+ msgid ""
1411
+ "By default, WordPress generates all types of different RSS feeds for your "
1412
+ "site. While RSS feeds can be useful if you are running a blog, businesses "
1413
+ "might not always utilize these. Not every site out there has a blog."
1414
+ msgstr ""
1415
+ "Por defecto, WordPress genera todos los tipos de diferentes canales RSS para "
1416
+ "su sitio. Si bien las fuentes RSS pueden ser útiles si está ejecutando un "
1417
+ "blog, es posible que las Webs no la usen. No todos los sitios tienen un blog."
1418
+
1419
+ #: admin/pages/performance.php:87
1420
+ #, php-format
1421
+ msgid ""
1422
+ "Removes a link to the RSS-feed from the %s section, closes and puts the "
1423
+ "redirect from all RSS-feeds."
1424
+ msgstr ""
1425
+ "Elimina un enlace a la fuente RSS de la sección %s, cierra y coloca la "
1426
+ "redirección de todas las fuentes RSS."
1427
+
1428
+ #: admin/pages/performance.php:102
1429
+ msgid "Redirect 301"
1430
+ msgstr "Redirección 301"
1431
+
1432
+ #: admin/pages/performance.php:103
1433
+ msgid "Page 404"
1434
+ msgstr "Página 404"
1435
+
1436
+ #: admin/pages/performance.php:105
1437
+ msgid "Redirect feed requests"
1438
+ msgstr "Redirigir las solicitudes de ingreso"
1439
+
1440
+ #: admin/pages/performance.php:106
1441
+ msgid ""
1442
+ "Forward all requests to page 404 or to the main page through 301 redirects."
1443
+ msgstr ""
1444
+ "Reenvíe todas las solicitudes a la página 404 o a la página principal a "
1445
+ "través de redirecciones 301."
1446
+
1447
+ #: admin/pages/performance.php:117
1448
+ msgid ""
1449
+ "The WordPress REST API provides API endpoints for WordPress data types that "
1450
+ "allow developers to interact with sites remotely by sending and receiving "
1451
+ "JSON (JavaScript Object Notation) objects. However, a lot of sites don’t use "
1452
+ "this, and therefore in most cases, it is just unnecessary code."
1453
+ msgstr ""
1454
+ "La API REST de WordPress proporciona \"endpoint\" de API para los tipos de "
1455
+ "datos de WordPress que permiten a los desarrolladores interactuar con sitios "
1456
+ "de forma remota mediante el envío y la recepción de objetos JSON . Sin "
1457
+ "embargo, muchos sitios no usan esto, por lo tanto, es simplemente un código "
1458
+ "innecesario."
1459
+
1460
+ #: admin/pages/performance.php:117
1461
+ msgid ""
1462
+ "Removes REST API link tag from the front end and the REST API header link "
1463
+ "from page requests."
1464
+ msgstr ""
1465
+ "Elimina la etiqueta de enlace de la API REST de la interfaz y el enlace del "
1466
+ "encabezado de la API REST de las solicitudes de página."
1467
+
1468
+ #: admin/pages/performance.php:138
1469
+ msgid ""
1470
+ "Emojis are fun and all, but if you are aren’t using them they actually load "
1471
+ "a JavaScript file (wp-emoji-release.min.js) on every page of your website. "
1472
+ "For a lot of businesses, this is not needed and simply adds load time to "
1473
+ "your site. So we recommend disabling this."
1474
+ msgstr ""
1475
+ "Los Emojis son simpáticos, pero si no los usas, en realidad ellos cargan un "
1476
+ "archivo JavaScript (wp-emoji-release.min.js) en cada página de tu sitio web. "
1477
+ "Para muchos sitios web, esto es innecesario y solo agrega tiempo de carga a "
1478
+ "su sitio. Recomendamos desactivar esto."
1479
+
1480
+ #: admin/pages/performance.php:138
1481
+ msgid "Removes WordPress Emojis JavaScript file (wp-emoji-release.min.js)."
1482
+ msgstr ""
1483
+ "Elimina el archivo JavaScript de WordPress Emojis (wp-emoji-release.min.js)."
1484
+
1485
+ #: admin/pages/performance.php:148
1486
+ msgid ""
1487
+ "They started adding jQuery migrate in WordPress 3.6. Most up-to-date "
1488
+ "frontend code and plugins don’t require jquery-migrate.min.js. In most "
1489
+ "cases, this simply adds unnecessary load to your site. You can see this "
1490
+ "running if you launch Chrome Devtools console."
1491
+ msgstr ""
1492
+ "Se incluyó jQuery migrate en WordPress 3.6. La mayoría de los códigos y "
1493
+ "complementos de frontend actualizados no requieren jquery-migrate.min.js. "
1494
+ "Casi siempre, esto agrega una carga innecesaria a su sitio. Puedes ver esto "
1495
+ "ejecutándose si inicias la consola de Chrome Devtools."
1496
+
1497
+ #: admin/pages/performance.php:148
1498
+ msgid "Removes jQuery Migrate JavaScript file (jquery-migrate.min.js)."
1499
+ msgstr "Elimina el archivo jQuery Migrate JavaScript (jquery-migrate.min.js)."
1500
+
1501
+ #: admin/pages/performance.php:148
1502
+ msgid "Warning! If there is a broke on your site, disable this option!"
1503
+ msgstr "¡Advertencia! Si hay una falla en su sitio, deshabilite esta opción!"
1504
+
1505
+ #: admin/pages/performance.php:158
1506
+ msgid ""
1507
+ "Embeds were released with WordPress 4.4. This is basically the magic that "
1508
+ "auto converts your YouTube videos, Tweets, and URLs into pretty previews "
1509
+ "while you are editing. However, this actually loads a JavaScript file (wp-"
1510
+ "embed.min.js) on every page of your website. If you don’t care about the "
1511
+ "auto converting preview (which we don’t), you can disable this across your "
1512
+ "site."
1513
+ msgstr ""
1514
+ "Los \"Embeds\" (Insertar) fueron lanzados con WordPress 4.4. Esto es "
1515
+ "básicamente lo que convierte automáticamente tus videos de YouTube, tweets y "
1516
+ "URL en vistas previas mientras estás editando. Sin embargo, esto realmente "
1517
+ "carga un archivo JavaScript (wp-embed.min.js) en cada página de su sitio "
1518
+ "web. Si no desea vista previa de conversión automática (que a nosotros no), "
1519
+ "inabilítela."
1520
+
1521
+ #: admin/pages/performance.php:158
1522
+ msgid "Removes WordPress Embed JavaScript file (wp-embed.min.js)"
1523
+ msgstr "Elimina el archivo JavaScript de WordPress Embed (wp-embed.min.js)"
1524
+
1525
+ #: admin/pages/performance.php:177
1526
+ msgid ""
1527
+ "The above link is used by blog clients. If you edit your site from your "
1528
+ "browser then you don’t need this. It is also used by some 3rd party "
1529
+ "applications that utilize XML-RPC requests. In most cases, this is just "
1530
+ "unnecessary code."
1531
+ msgstr ""
1532
+ "El enlace anterior es utilizado por los clientes del blog. Si edita su sitio "
1533
+ "desde su navegador, entonces no necesita esto. También es usado por algunas "
1534
+ "aplicaciones de terceros que utilizan solicitudes XML-RPC. En la mayoría de "
1535
+ "los casos, este es un código innecesario."
1536
+
1537
+ #: admin/pages/performance.php:177
1538
+ msgid "Remove RSD (Real Simple Discovery) link tag."
1539
+ msgstr "Eliminar la etiqueta de enlace RSD (Real Simple Discovery)."
1540
+
1541
+ #: admin/pages/performance.php:186
1542
+ msgid ""
1543
+ "The profile attribute specifies the metadata profile address. Usually, the "
1544
+ "browser recognizes the value of this attribute and executes some conventions "
1545
+ "related to the specified profile. Loading the document itself at the "
1546
+ "specified address does not really happen, moreover, it may not exist at "
1547
+ "all.\n"
1548
+ "In particular, the profile is used for the XFN microformat (XHTML Friends "
1549
+ "Network) - a way of representing relationships between people using links "
1550
+ "and rel attributes with different values. WordPress also actively uses "
1551
+ "profile in its templates.\n"
1552
+ msgstr ""
1553
+ "El atributo de perfil, especifica la dirección del perfil de metadatos. "
1554
+ "Normalmente, el navegador reconoce el valor de este atributo y ejecuta "
1555
+ "algunas reglas relacionadas con el perfil especificado. Cargar el documento "
1556
+ "en sí mismo en la dirección especificada no garantiza la carga, además, "
1557
+ "puede que no exista en absoluto.\n"
1558
+ "En particular, el perfil se usa para el microformato XFN (XHTML Friends "
1559
+ "Network), es una forma de representar las relaciones entre personas que usan "
1560
+ "enlaces y atributos de rel con diferentes valores. WordPress también usa "
1561
+ "activamente el perfil en sus plantillas.\n"
1562
+
1563
+ #: admin/pages/performance.php:188
1564
+ msgid "Remove link tag"
1565
+ msgstr "Eliminar etiqueta de enlace"
1566
+
1567
+ #: admin/pages/performance.php:198
1568
+ msgid ""
1569
+ "This link is actually used by Windows Live Writer. If you don’t know use "
1570
+ "Windows Live Writer, which we are guessing you don’t, this is just "
1571
+ "unnecessary code."
1572
+ msgstr ""
1573
+ "Este enlace es usado por Windows Live Writer. Si no sabe utilizar Windows "
1574
+ "Live Writer, que suponemos que no sabe, entonces, éste es un código "
1575
+ "innecesario."
1576
+
1577
+ #: admin/pages/performance.php:198
1578
+ msgid "Remove wlwmanifest (Windows Live Writer) link tag."
1579
+ msgstr "Quitar la etiqueta de enlace wlwmanifest (Windows Live Writer)."
1580
+
1581
+ #: admin/pages/performance.php:208
1582
+ #, php-format
1583
+ msgid ""
1584
+ "By default, the following tag shows up in every WordPress install. %s This "
1585
+ "is used for a shortlink to your pages and posts. However, if you are already "
1586
+ "using pretty permalinks, such as domain.com/post, then there is no reason to "
1587
+ "keep this, it is just unnecessary code."
1588
+ msgstr ""
1589
+ "Por defecto, la siguiente etiqueta aparece en cada instalación de WordPress. "
1590
+ "%s Esto se usa para un enlace corto a sus páginas y publicaciones. Sin "
1591
+ "embargo, si ya usa enlaces permanentes, como domain.com/post, entonces no "
1592
+ "aplique esto, simplemente es innecesario."
1593
+
1594
+ #: admin/pages/performance.php:208
1595
+ msgid "Remove Shortlink link tag."
1596
+ msgstr "Eliminar etiqueta de enlace corto."
1597
+
1598
+ #: admin/pages/performance.php:218
1599
+ msgid ""
1600
+ "If you use Wordpress as a CMS, then you can delete these links, they can "
1601
+ "only come in handy for a blog."
1602
+ msgstr ""
1603
+ "Si usa Wordpress como CMS, puede eliminar estos enlaces, solo son útiles "
1604
+ "para un blog."
1605
+
1606
+ #: admin/pages/performance.php:218
1607
+ msgid ""
1608
+ "Remove the previous and next post links within the wp_head of your wordpress "
1609
+ "theme."
1610
+ msgstr ""
1611
+ "Elimine los enlaces de las publicaciones anteriores y siguientes dentro de "
1612
+ "wp_head de su tema de wordpress."
1613
+
1614
+ #: admin/pages/performance.php:228
1615
+ msgid ""
1616
+ "WP by default for the widget \"recent comments\" prescribes in the code "
1617
+ "styles that are almost impossible to change, because to them apply! "
1618
+ "important."
1619
+ msgstr ""
1620
+ "WP por defecto, hace que el widget \"comentarios recientes \" prescriba en "
1621
+ "los estilos de código que son casi imposibles de cambiar, ¡porque son "
1622
+ "recurrentes! muy importante."
1623
+
1624
+ #: admin/pages/performance.php:228
1625
+ msgid "Removes .recentcomments styles from head section."
1626
+ msgstr "Elimina los estilos .recentcomments de la sección head."
1627
+
1628
+ #: admin/pages/performance.php:238
1629
+ msgid ""
1630
+ "By default, WordPress loads Font Awesome icons synchronously, that is, your "
1631
+ "page will not be fully loaded until Font Awesome icons are loaded. This "
1632
+ "algorithm slows down the loading of your page and leads to errors when "
1633
+ "checking the site in Google Page Speed. Using this option, your Font Awesome "
1634
+ "icons will be loaded after your page is fully loaded. This method has a "
1635
+ "negative — you and visitors of your site will see changes while loading a "
1636
+ "page, from the placeholders to icons."
1637
+ msgstr ""
1638
+ "De forma predeterminada, WordPress carga los iconos de Font Awesome de forma "
1639
+ "síncrona, es decir, su página no se cargará completamente hasta que se "
1640
+ "carguen los iconos de Font Awesome. Este algoritmo ralentiza la carga de su "
1641
+ "página y genera errores al revisar el sitio en Google Page Speed. Con esta "
1642
+ "opción, sus iconos de Font Awesome se cargarán una vez que su página esté "
1643
+ "completamente cargada. Este método tiene un aspecto negativo: Se "
1644
+ "visualizarán cambios al cargar una página, desde marcadores de posición "
1645
+ "hasta iconos."
1646
+
1647
+ #: admin/pages/performance.php:248
1648
+ msgid ""
1649
+ "Dashicons is the official icon font of the WordPress admin as of 3.8. Some "
1650
+ "of you have requested that we add a feature to remove Dashicons. Some themes "
1651
+ "and developers utilize this (dashicons.min.css) on the front-end of their "
1652
+ "sites."
1653
+ msgstr ""
1654
+ "Dashicons, es la fuente de ícono oficial del administrador de WordPress a "
1655
+ "partir de 3.8. Nuestros usuarios nos han solicitado que incluir una función "
1656
+ "para eliminar Dashicons. Algunos temas y desarrolladores utilizan (dashicons."
1657
+ "min.css) en la parte delantera de sus sitios."
1658
+
1659
+ #: admin/pages/performance.php:258
1660
+ msgid ""
1661
+ "This function that prevents the user’s gravatar being automatically obtained "
1662
+ "from gravatar.com based on their registered email. This would be useful for "
1663
+ "sites where users require an extra layer of privacy, or if you just want to "
1664
+ "prevent potentially silly or embarrasing avatar accidents.\n"
1665
+ "\t\t\tIf you’re using Identicons or any other generated default avatar, the "
1666
+ "user should keep a consistent avatar unless they change their registered "
1667
+ "email.\n"
1668
+ "\t\t\t"
1669
+ msgstr ""
1670
+ "Esta función evita que el gravatar del usuario se obtenga automáticamente de "
1671
+ "gravatar.com en función de su correo electrónico registrado. Esto sería útil "
1672
+ "para los sitios donde los usuarios requieren una capa adicional de "
1673
+ "privacidad, o si solo desea evitar accidentes de avatar potencialmente "
1674
+ "embarazosos.\n"
1675
+ "\t\t\tSi estás usando Identicons o cualquier otro avatar predeterminado "
1676
+ "generado, el usuario debe mantener un avatar consistente a menos que cambie "
1677
+ "su correo electrónico registrado.\n"
1678
+ "\t\t\t"
1679
+
1680
+ #: admin/pages/performance.php:266
1681
+ msgid "Classic editor and Gutenberg"
1682
+ msgstr ""
1683
+
1684
+ #: admin/pages/performance.php:266
1685
+ msgid "In this group of options, you can manage revisions and post autosave."
1686
+ msgstr ""
1687
+ "En este grupo de opciones, puede administrar revisiones y guardar "
1688
+ "automáticamente."
1689
+
1690
+ #: admin/pages/performance.php:288 admin/pages/performance.php:419
1691
+ msgid "Wordpress default"
1692
+ msgstr "Wordpress por defecto"
1693
+
1694
+ #: admin/pages/performance.php:289 admin/pages/performance.php:290
1695
+ #: admin/pages/performance.php:291 admin/pages/performance.php:292
1696
+ #: admin/pages/performance.php:293 admin/pages/performance.php:294
1697
+ #: admin/pages/performance.php:295 admin/pages/performance.php:296
1698
+ #: admin/pages/performance.php:297 admin/pages/performance.php:298
1699
+ msgid "revisions"
1700
+ msgstr "Revisiones"
1701
+
1702
+ #: admin/pages/performance.php:301
1703
+ msgid ""
1704
+ "WordPress automatically saves revisions when you are working on posts and "
1705
+ "pages. These can begin to add up pretty quick. By default, there is no limit "
1706
+ "in place. We have seen posts with over 1,000 revisions. Multiply this by 50 "
1707
+ "pages and suddenly you have over 50,000 revisions sitting in your database. "
1708
+ "The problem with this is that you will most likely never use them and they "
1709
+ "can start slowing down your database as well as using disk space.\n"
1710
+ "So we recommend either disabling or limiting your revisions. "
1711
+ msgstr ""
1712
+ "WordPress guarda automáticamente las revisiones cuando está trabajando en "
1713
+ "publicaciones y páginas. Estos pueden aumentar rápidamente. Por defecto, no "
1714
+ "hay límite para su sitio. Hemos visto publicaciones con más de 1.000 "
1715
+ "revisiones. Multiplique esto por 50 páginas y, de repente, tiene más de "
1716
+ "50,000 revisiones en su base de datos. El problema con esto es que lo más "
1717
+ "probable es que nunca las use haciendo lenta su base de datos, así como el "
1718
+ "uso en espacio en disco.\n"
1719
+ "Por lo tanto, recomendamos desactivar o limitar sus revisiones."
1720
+
1721
+ #: admin/pages/performance.php:311
1722
+ msgid "Gutenberg autosave control"
1723
+ msgstr ""
1724
+
1725
+ #: admin/pages/performance.php:313
1726
+ msgid ""
1727
+ "By activating this option autosave feature in the Gutenberg editor will be "
1728
+ "disabled. Alternatively it also provides options in the editor to select a "
1729
+ "longer autosave interval time than the default 10 seconds."
1730
+ msgstr ""
1731
+
1732
+ #: admin/pages/performance.php:323
1733
+ msgid ""
1734
+ "WordPress by default automatically saves a draft every 60 seconds (1 "
1735
+ "minute). There are reasons why you might want to change this."
1736
+ msgstr ""
1737
+ "Por defecto, WordPress guarda automáticamente un borrador cada 60 segundos "
1738
+ "(1 minuto). Hay razones por las que podrías querer cambiar esto."
1739
+
1740
+ #: admin/pages/performance.php:323
1741
+ msgid "Disables automatic saving of drafts."
1742
+ msgstr "Desactiva el guardado automático de borradores."
1743
+
1744
+ #: admin/pages/performance.php:330
1745
+ msgid "Remove query strings from static resources"
1746
+ msgstr "Eliminar cadenas de consulta de recursos estáticos"
1747
+
1748
+ #: admin/pages/performance.php:330
1749
+ msgid ""
1750
+ "This funcitons will remove query strings from static resources like CSS & JS "
1751
+ "files inside the HTML <head> element to improve your speed scores in "
1752
+ "services like Pingdom, GTmetrix, PageSpeed and YSlow. <b style=\"color:"
1753
+ "#ff5722\">Important:</b> This does not work for authorized users. To avoid "
1754
+ "problems after plugins update!"
1755
+ msgstr ""
1756
+
1757
+ #: admin/pages/performance.php:339 admin/pages/performance.php:350
1758
+ msgid ""
1759
+ "To make it more difficult for others to hack your website you can remove the "
1760
+ "WordPress version number from your site, your css and js. Without that "
1761
+ "number it's not possible to see if you run not the current version to "
1762
+ "exploit bugs from the older versions. <br><br>\n"
1763
+ "\t\t\t\t\tAdditionally it can improve the loading speed of your site, "
1764
+ "because without query strings in the URL the css and js files can be cached."
1765
+ msgstr ""
1766
+ "Para hacer que sea más difícil el Hackeo de su web, elimine el número de "
1767
+ "versión de WordPress de su sitio, igual con el css y js. Sin ese número, la "
1768
+ "versión no será visible a los hacker evitando ataques y explotación de "
1769
+ "errores de versiones anteriores. <br><br>\n"
1770
+ "\t \t\t\t\tAdemás, puede mejorar la velocidad de carga de su sitio, ya que "
1771
+ "sin cadenas de consulta en la URL, los archivos css y js se pueden almacenar "
1772
+ "en caché."
1773
+
1774
+ #: admin/pages/performance.php:340
1775
+ msgid ""
1776
+ "Removes wordpress version number from scripts (not logged in user only)."
1777
+ msgstr ""
1778
+ "Elimina el número de versión de wordpress de los scripts (solo para usuarios "
1779
+ "no registrados)."
1780
+
1781
+ #: admin/pages/performance.php:351
1782
+ msgid ""
1783
+ "Removes the wordpress version number from stylesheets (not logged in user "
1784
+ "only)."
1785
+ msgstr ""
1786
+ "Elimina el número de versión de wordpress de las hojas de estilo (no está "
1787
+ "registrado solo por el usuario)."
1788
+
1789
+ #: admin/pages/performance.php:374
1790
+ msgid "Exclude stylesheet/script file names"
1791
+ msgstr "Excluir nombres de hojas de estilo / archivos de script"
1792
+
1793
+ #: admin/pages/performance.php:376
1794
+ msgid ""
1795
+ "Enter Stylesheet/Script file names to exclude from version removal (each "
1796
+ "exclude file starts with a new line)"
1797
+ msgstr ""
1798
+ "Ingrese los nombres de archivo de hoja de estilo/Script para excluir de la "
1799
+ "eliminación de la versión (cada archivo de exclusión comienza con una nueva "
1800
+ "línea)"
1801
+
1802
+ #: admin/pages/performance.php:376
1803
+ msgid "Example"
1804
+ msgstr "Ejemplo"
1805
+
1806
+ #: admin/pages/performance.php:381
1807
+ msgid "Heartbeat"
1808
+ msgstr "Heartbeat"
1809
+
1810
+ #: admin/pages/performance.php:381
1811
+ msgid ""
1812
+ "The WordPress Heartbeat API uses /wp-admin/admin-ajax.php to run AJAX calls "
1813
+ "from the web-browser. While this is great and all it can also cause high CPU "
1814
+ "usage and crazy amounts of PHP calls. For example, if you leave your "
1815
+ "dashboard open it will keep sending POST requests to this file on a regular "
1816
+ "interval, every 15 seconds. Here is an example below of it happening."
1817
+ msgstr ""
1818
+ "La API de WordPress Heartbeat utiliza /wp-admin/admin-ajax.php para ejecutar "
1819
+ "llamadas AJAX desde el navegador web. Si bien esto es excelente tambien "
1820
+ "puede causar un alto uso de la CPU y una gran cantidad de llamadas de PHP. "
1821
+ "Por ejemplo, si deja su panel abierto, seguirá enviando solicitudes POST a "
1822
+ "este archivo en un intervalo regular, cada 15 segundos. Aquí hay un ejemplo "
1823
+ "de lo que está pasando."
1824
+
1825
+ #: admin/pages/performance.php:390
1826
+ msgid "Default"
1827
+ msgstr "Default"
1828
+
1829
+ #: admin/pages/performance.php:391
1830
+ msgid "Everywhere"
1831
+ msgstr "Donde sea"
1832
+
1833
+ #: admin/pages/performance.php:392
1834
+ msgid "On dashboard page"
1835
+ msgstr "En el Panel de Control"
1836
+
1837
+ #: admin/pages/performance.php:393
1838
+ msgid "Only allow when editing Posts/Pages"
1839
+ msgstr "Solo se permite cuando se editan Publicaciones/Páginas."
1840
+
1841
+ #: admin/pages/performance.php:420 admin/pages/performance.php:421
1842
+ #: admin/pages/performance.php:422 admin/pages/performance.php:423
1843
+ #: admin/pages/performance.php:424 admin/pages/performance.php:425
1844
+ #: admin/pages/performance.php:426 admin/pages/performance.php:427
1845
+ #: admin/pages/performance.php:428 admin/pages/performance.php:429
1846
+ #: admin/pages/performance.php:430 admin/pages/performance.php:431
1847
+ #: admin/pages/performance.php:432 admin/pages/performance.php:433
1848
+ #: admin/pages/performance.php:434 admin/pages/performance.php:435
1849
+ #: admin/pages/performance.php:436
1850
+ msgid "seconds"
1851
+ msgstr "segundos"
1852
+
1853
+ #: admin/pages/performance.php:439
1854
+ msgid ""
1855
+ "Select the heartbeat frequency wordpress. We recommend you 60 seconds, "
1856
+ "default is 20 seconds."
1857
+ msgstr ""
1858
+ "Seleccione la frecuencia heartbeat wordpress. recomendamos 60 segundos, el "
1859
+ "valor predeterminado es 20 segundos."
1860
+
1861
+ #: admin/pages/performance.php:463
1862
+ msgid ""
1863
+ "<b>Use this option carefully!</b><br> Plugins like Contact form 7, "
1864
+ "Anycomments may have problems using this option."
1865
+ msgstr ""
1866
+
1867
+ #: admin/pages/quick-start.php:66
1868
+ msgid "Clearfy menu"
1869
+ msgstr "Menú Clearfy"
1870
+
1871
+ #: admin/pages/quick-start.php:67
1872
+ msgid "One-click settings"
1873
+ msgstr "Configuración de un clic"
1874
+
1875
+ #: admin/pages/quick-start.php:76
1876
+ msgid "Quick start"
1877
+ msgstr "Inicio rápido"
1878
+
1879
+ #: admin/pages/quick-start.php:123
1880
+ msgid ""
1881
+ "On this page you can quickly configure the plug-in without going into "
1882
+ "details."
1883
+ msgstr ""
1884
+ "En esta página puede configurar rápidamente el plugin sin entrar en detalles."
1885
+
1886
+ #: admin/pages/quick-start.php:131
1887
+ msgid "One click code clearing"
1888
+ msgstr "limpieza de código con un click"
1889
+
1890
+ #: admin/pages/quick-start.php:132
1891
+ msgid "One click security"
1892
+ msgstr "Seguridad con un click"
1893
+
1894
+ #: admin/pages/quick-start.php:134
1895
+ msgid "One click seo optimization"
1896
+ msgstr "Optimización SEO con un Click"
1897
+
1898
+ #: admin/pages/quick-start.php:138
1899
+ msgid "One click remove default Widgets"
1900
+ msgstr "Remover los widgets por defecto con un click"
1901
+
1902
+ #: admin/pages/quick-start.php:148
1903
+ msgid "Reset all settings"
1904
+ msgstr "Restablecer todos los ajustes"
1905
+
1906
+ #: admin/pages/quick-start.php:154
1907
+ msgid "Are you sure you want to enable the this options?"
1908
+ msgstr "¿Estás seguro de que quieres habilitar estas opciones?"
1909
+
1910
+ #: admin/pages/quick-start.php:157 admin/pages/quick-start.php:205
1911
+ msgid ""
1912
+ "After confirmation, all the settings of the plug-in will return to the "
1913
+ "default state. Make backup settings by copying data from the export field."
1914
+ msgstr ""
1915
+ "Después de la confirmación, todos los ajustes del plugin volverán al estado "
1916
+ "predeterminado. Haga ajustes de copia de seguridad copiando datos del campo "
1917
+ "de exportación."
1918
+
1919
+ #: admin/pages/quick-start.php:161
1920
+ msgid "Confirm"
1921
+ msgstr "Confirmar"
1922
+
1923
+ #: admin/pages/quick-start.php:162
1924
+ msgid "Cancel"
1925
+ msgstr "Cancelar"
1926
+
1927
+ #: admin/pages/quick-start.php:167
1928
+ msgid "<strong>Quick start</strong>."
1929
+ msgstr "<strong>Inicio rápido</strong>."
1930
+
1931
+ #: admin/pages/quick-start.php:168
1932
+ msgid ""
1933
+ "These are quick optimization options for your website. You can activate the "
1934
+ "groups of necessary settings in one click. With the fast optimization mode, "
1935
+ "we are enable the only safe settings that do not break your website. That is "
1936
+ "why we recommend you to look at each setting of the plugin individually. The "
1937
+ "settings with grey and red question mark will not be active, until you do it "
1938
+ "yourself."
1939
+ msgstr ""
1940
+ "Estas son opciones de optimización rápida para su sitio web. Active los "
1941
+ "grupos de ajustes que necesitecon un clic. Con el modo de optimización "
1942
+ "rápida, habilitamos las únicas configuraciones seguras que no rompen su "
1943
+ "sitio web. Por eso le recomendamos que mire cada configuración del "
1944
+ "complemento de forma individual. Los ajustes con el signo de interrogación "
1945
+ "gris y rojo no estarán activos hasta que lo haga usted mismo."
1946
+
1947
+ #: admin/pages/quick-start.php:174
1948
+ msgid "Select what you need to do"
1949
+ msgstr "Seleccione que necesita hacer"
1950
+
1951
+ #: admin/pages/quick-start.php:176
1952
+ msgid ""
1953
+ "After selecting any optimization case, the plugin will automatically enable "
1954
+ "the necessary settings in safe mode and one click."
1955
+ msgstr ""
1956
+ "Después de seleccionar cualquier modo de optimización, el plugin habilitará "
1957
+ "automáticamente la configuración necesaria en modo seguro y con un clic."
1958
+
1959
+ #: admin/pages/quick-start.php:204
1960
+ msgid "Reset settings"
1961
+ msgstr "Resetear configuraciones"
1962
+
1963
+ #: admin/pages/quick-start.php:217
1964
+ msgid "Reset"
1965
+ msgstr "Resetear"
1966
+
1967
+ #: admin/pages/quick-start.php:219
1968
+ msgid "Do It!"
1969
+ msgstr "Házlo!"
1970
+
1971
+ #: admin/pages/seo-double-pages.php:39
1972
+ msgid "Duplicate pages"
1973
+ msgstr "Páginas duplicadas"
1974
+
1975
+ #: admin/pages/seo-double-pages.php:74
1976
+ msgid "<strong>Delete duplicate pages.</strong>."
1977
+ msgstr "<strong>Borrar páginas duplicadas.</strong>."
1978
+
1979
+ #: admin/pages/seo-double-pages.php:74
1980
+ msgid ""
1981
+ "Search engines perceive these pages as website separate pages, therefore "
1982
+ "their content ceases to be unique because of duplication. In addition, page "
1983
+ "reference weight is reduced if it has a duplicate. A small number of "
1984
+ "duplicated pages will not be a serious problem, but if there are more than "
1985
+ "50 percents of them - you urgently need to correct the situation."
1986
+ msgstr ""
1987
+ "Los motores de búsqueda perciben estas páginas como páginas separadas del "
1988
+ "sitio web, por lo que su contenido deja de ser único debido a la "
1989
+ "duplicación. Además, el Ranking de la página se reduce si tiene un "
1990
+ "duplicado. Un pequeño número de páginas duplicadas no será un problema "
1991
+ "grave, pero si hay más del 50 por ciento de ellas, debe corregir la "
1992
+ "situación con urgencia."
1993
+
1994
+ #: admin/pages/seo-double-pages.php:83
1995
+ #, php-format
1996
+ msgid ""
1997
+ "Many duplicates in date archives. Imagine, in addition, that your article "
1998
+ "will be displayed in the main and in the category, you will still receive at "
1999
+ "least 3 duplicates: in archives by year, month and date, for example %s."
2000
+ msgstr ""
2001
+ "Muchos duplicados en fecha de archivos. Imagine, además, que tu artículo se "
2002
+ "mostrará en la categoría principal y en categorías, recibirás al menos 3 "
2003
+ "duplicados: en archivos por año, mes y fecha, por ejemplo,%s."
2004
+
2005
+ #: admin/pages/seo-double-pages.php:83
2006
+ msgid "Removes all pages with the date archives and puts a redirect."
2007
+ msgstr ""
2008
+ "Elimina todas las páginas con los archivos de fecha y pone una redirección."
2009
+
2010
+ #: admin/pages/seo-double-pages.php:93
2011
+ #, php-format
2012
+ msgid ""
2013
+ "If the site is only filled by you - a mandatory item. Allows you to get rid "
2014
+ "of duplicates on user archives, for example %s."
2015
+ msgstr ""
2016
+ "Si el sitio solo está ocupado por usted - un elemento obligatorio. Le "
2017
+ "permite deshacerse de los duplicados en los archivos de usuario, por ejemplo,"
2018
+ "%s."
2019
+
2020
+ #: admin/pages/seo-double-pages.php:93
2021
+ msgid "Removes all pages with the author archives and puts a redirect."
2022
+ msgstr ""
2023
+ "Elimina todas las páginas con los archivos de autor y pone una redirección."
2024
+
2025
+ #: admin/pages/seo-double-pages.php:103
2026
+ msgid ""
2027
+ "If you use tags only for the block Similar records, or do not use them at "
2028
+ "all - it will be more correct to close them to avoid duplicates."
2029
+ msgstr ""
2030
+ "Si usa etiquetas solo para el bloque Registros similares, o no los usa en "
2031
+ "absoluto, ciérrelos para evitar duplicados."
2032
+
2033
+ #: admin/pages/seo-double-pages.php:103
2034
+ msgid "Removes all pages with the tag archives and puts a redirect."
2035
+ msgstr ""
2036
+ "Elimina todas las páginas con los archivos de etiquetas y pone una "
2037
+ "redirección."
2038
+
2039
+ #: admin/pages/seo-double-pages.php:113
2040
+ msgid ""
2041
+ "Every of the pictures has its own page on the site. Such pages are "
2042
+ "successfully indexed and create duplicates. The site can have thousands of "
2043
+ "same-type attachment pages."
2044
+ msgstr ""
2045
+ "Cada una de las imágenes tiene su propia página en el sitio. Dichas páginas "
2046
+ "son indexadas con éxito y crean duplicados. El sitio puede tener miles de "
2047
+ "páginas adjuntas del mismo tipo."
2048
+
2049
+ #: admin/pages/seo-double-pages.php:113
2050
+ msgid "Removes attachment pages and puts a redirect."
2051
+ msgstr "Elimina las páginas adjuntas y pone una redirección."
2052
+
2053
+ #: admin/pages/seo-double-pages.php:123
2054
+ #, php-format
2055
+ msgid ""
2056
+ "In WordPress, any post can be divided into parts (pages), each part will "
2057
+ "have its own address. But this functionality is rarely used, but it can "
2058
+ "create trouble for you. For example, you can add a number to the address of "
2059
+ "any entry of your blog, %s - the post itself will open, which will be a "
2060
+ "duplicate. You can substitute any number."
2061
+ msgstr ""
2062
+ "En WordPress, cualquier publicación se puede dividir en partes (páginas), "
2063
+ "cada parte tendrá su propia dirección. Pero esta funcionalidad rara vez se "
2064
+ "utiliza, esto puede crear problemas para usted. Por ejemplo, puede agregar "
2065
+ "un número a la dirección de cualquier entrada de su blog, %s - se abrirá la "
2066
+ "publicación, que será un duplicado. Puede sustituir cualquier número."
2067
+
2068
+ #: admin/pages/seo-double-pages.php:123
2069
+ #, php-format
2070
+ msgid "Removes the pagination from the post and puts a redirect. Example: %s"
2071
+ msgstr ""
2072
+ "Elimina la paginación de la publicación y pone una redirección. Ejemplo: %s"
2073
+
2074
+ #: admin/pages/seo-double-pages.php:133
2075
+ #, php-format
2076
+ msgid ""
2077
+ "WordPress adds %s to the link \"Reply\" in the comments, if you use "
2078
+ "hierarchical comments."
2079
+ msgstr ""
2080
+ "WordPress agrega %s al enlace \"Responder \" en los comentarios, si usa "
2081
+ "comentarios jerárquicos."
2082
+
2083
+ #: admin/pages/seo-double-pages.php:133
2084
+ msgid "?relpytocom remove and and puts a redirect."
2085
+ msgstr "Eliminar ?replytocom y poner una redirección."
2086
+
2087
+ #: admin/pages/seo.php:37
2088
+ msgid "SEO"
2089
+ msgstr "SEO"
2090
+
2091
+ #: admin/pages/seo.php:38
2092
+ msgid "Additional small fixes SEO"
2093
+ msgstr "Pequeñas correcciones adicionales de SEO"
2094
+
2095
+ #: admin/pages/seo.php:72
2096
+ msgid "<strong>Basic SEO optimization settings</strong>."
2097
+ msgstr "<strong>Configuración básica de optimización SEO</strong>."
2098
+
2099
+ #: admin/pages/seo.php:72
2100
+ msgid "Recommended settings that can complement your SEO plugin."
2101
+ msgstr "Configuraciones recomendadas que pueden complementar tu plugin SEO."
2102
+
2103
+ #: admin/pages/seo.php:81
2104
+ msgid ""
2105
+ "The alt attribute is mandatory, so most SEO experts say. If you missed or "
2106
+ "did not fill it at all, it will be automatically assigned and will be equal "
2107
+ "to the title of the article."
2108
+ msgstr ""
2109
+ "El atributo alt es obligatorio y necesario para el SEO, en caso de no "
2110
+ "existir, lo asignaremos automáticamente usando el título del artículo."
2111
+
2112
+ #: admin/pages/seo.php:81
2113
+ #, php-format
2114
+ msgid "Replaces the %s, on attribute with an article name %s"
2115
+ msgstr "Reemplaza el %s, en atributo con un nombre de artículo %s"
2116
+
2117
+ #: admin/pages/seo.php:91
2118
+ msgid ""
2119
+ "After installation, WP does not contain a robots.txt file and create it "
2120
+ "manually. We re-read about 30 different articles, instructions from Yandex "
2121
+ "and Google to create the perfect robots.txt"
2122
+ msgstr ""
2123
+ "Si después de la instalación de WP no existe un archivo robots.txt, créelo "
2124
+ "manualmente. Yandex y Google poseen unos 30 artículos para crear el archivo "
2125
+ "robots.txt perfecto."
2126
+
2127
+ #: admin/pages/seo.php:91
2128
+ msgid "Automatically creates the perfect robots.txt file"
2129
+ msgstr "Crear automáticamente archivo robots.txt perfecto para tu web"
2130
+
2131
+ #: admin/pages/seo.php:111
2132
+ msgid "Server headers and response"
2133
+ msgstr "Cebeceras de respuesta de servidor"
2134
+
2135
+ #: admin/pages/seo.php:111
2136
+ msgid ""
2137
+ "WordPress does not know how to give the Last Modified header in the server's "
2138
+ "responses. You can do this using the settings below."
2139
+ msgstr ""
2140
+ "WordPress no sabe cómo darte la última modificación del encabezado en las "
2141
+ "respuestas del servidor. Puedes hacer esto usando la configuración de abajo."
2142
+
2143
+ #: admin/pages/seo.php:132
2144
+ msgid "Disable Last Modified header on front page"
2145
+ msgstr ""
2146
+ "Deshabilitar la última modificación del encabezado de la página frontal"
2147
+
2148
+ #: admin/pages/seo.php:142
2149
+ #, php-format
2150
+ msgid ""
2151
+ "You can specify a page mask, for example: %s or %s. All pages that contain "
2152
+ "the string will be excluded. Each exclude must begin with a new line."
2153
+ msgstr ""
2154
+ "Puede especificar una máscara de página, por ejemplo: %s o %s. Se excluirán "
2155
+ "todas las páginas que contengan la cadena. Cada exclusión debe comenzar con "
2156
+ "una nueva línea."
2157
+
2158
+ #: admin/pages/seo.php:156
2159
+ msgid "For the Yoast SEO plugin"
2160
+ msgstr "Para el plugin Yoast SEO"
2161
+
2162
+ #: admin/pages/seo.php:156
2163
+ msgid ""
2164
+ "These settings will help you eliminate some problems associated with the "
2165
+ "popular Yoast SEO plugin"
2166
+ msgstr ""
2167
+ "Esta configuración te ayudará a eliminar algunos problemas asociados con el "
2168
+ "popular complemento SEO de Yoast"
2169
+
2170
+ #: admin/pages/seo.php:165
2171
+ msgid ""
2172
+ "The last element in the breadcrumbs in the Yoast SEO plugin duplicates the "
2173
+ "title of the article. Some SEO-specialists consider this duplication to be "
2174
+ "superfluous."
2175
+ msgstr ""
2176
+ "El último elemento dentro del breadcrumbs en el plugin Yoast SEO duplica el "
2177
+ "título del artículo. Algunos especialistas en SEO consideran que esta "
2178
+ "duplicación es inútil."
2179
+
2180
+ #: admin/pages/seo.php:165
2181
+ msgid ""
2182
+ "Removes duplication of the name in the breadcrumbs of the WP SEO plugin from "
2183
+ "Yoast."
2184
+ msgstr ""
2185
+ "Elimina la duplicación del nombre en las rutas de navegación del complemento "
2186
+ "WP SEO de Yoast."
2187
+
2188
+ #: admin/pages/seo.php:175
2189
+ msgid ""
2190
+ "Yandex.Webmaster swears on a standard XML card from the plugin Yoast, tk. it "
2191
+ "has a specific tag"
2192
+ msgstr ""
2193
+
2194
+ #: admin/pages/seo.php:175
2195
+ #, php-format
2196
+ msgid "Remove the tag %s from XML site map of the plugin Yoast SEO."
2197
+ msgstr "Elimine la etiqueta %s del mapa de sitio XML del plugin Yoast SEO."
2198
+
2199
+ #: admin/pages/seo.php:175
2200
+ msgid ""
2201
+ "Attention! After activation, turn off the site map and enable it back to "
2202
+ "regenerate it."
2203
+ msgstr ""
2204
+ "¡Atención! Después de la activación, desactive el mapa del sitio y "
2205
+ "habilítelo de nuevo para regenerarlo."
2206
+
2207
+ #: admin/pages/seo.php:175
2208
+ msgid "In older versions of Yoast SEO may not work - update the plugin Yoast"
2209
+ msgstr ""
2210
+ "Tal vez no funcione en versiones anteriores de Yoast SEO - actualice el "
2211
+ "plugin Yoast"
2212
+
2213
+ #: admin/pages/seo.php:193
2214
+ msgid ""
2215
+ "If you’re not familiar with Search Action it’s the mark-up that helps search "
2216
+ "engines add a shiny Sitelinks Search Box below your search engine results. "
2217
+ "For the majority of webmasters the extra search box is an absolutely "
2218
+ "fantastic feature but for many it’s not required or wanted, especially if a "
2219
+ "site only has a few pages or if the site uses a customised search platform "
2220
+ "that only searches blog posts and not pages."
2221
+ msgstr ""
2222
+ "En caso de no saber que es el (Search Action); Es el margen que ayuda a los "
2223
+ "motores de búsqueda a agregar un campo de enlaces de sitio en cuestión "
2224
+ "debajo de los resultados del motor de búsqueda. Para los webmasters, el "
2225
+ "cuadro de búsqueda adicional es excelente, pero para muchos no aplica si un "
2226
+ "sitio solo tiene unas pocas páginas o si el sitio utiliza una plataforma de "
2227
+ "búsqueda personalizada que solo busca publicaciones de blogs y no páginas."
2228
+
2229
+ #: admin/pages/seo.php:193
2230
+ msgid ""
2231
+ "Disable JSON-LD sitelinks searchbox using WordPress in plugin Yoast SEO."
2232
+ msgstr ""
2233
+ "Deshabilite el cuadro de búsqueda de enlaces de sitio JSON-LD desde "
2234
+ "WordPress en el plugin Yoast SEO."
2235
+
2236
+ #: admin/pages/seo.php:203
2237
+ msgid ""
2238
+ "Prevents output of the script tag of type application/ld+json containing\n"
2239
+ "schema.org data from the popular Yoast SEO and Yoast SEO Premium plugins.\n"
2240
+ "There is currently no UI to do so."
2241
+ msgstr ""
2242
+ "Evita la salida de la etiqueta de script de tipo application/ld+json que "
2243
+ "contiene\n"
2244
+ "Datos de schema.org de los populares complementos de Yoast SEO y Yoast SEO "
2245
+ "Premium.\n"
2246
+ "Actualmente no hay una interfaz de usuario para hacerlo."
2247
+
2248
+ #: admin/pages/seo.php:205
2249
+ msgid "Disable Structured Data in plugin Yoast SEO."
2250
+ msgstr "Desactivar los datos estructurados del plugin Yoast SEO."
2251
+
2252
+ #: admin/pages/seo.php:228
2253
+ #, php-format
2254
+ msgid "The Yoast SEO plugin displays a comment of the form %s in %s section"
2255
+ msgstr ""
2256
+ "El complemento Yoast SEO muestra un comentario del formulario %s en la "
2257
+ "sección %s"
2258
+
2259
+ #: admin/pages/seo.php:228
2260
+ #, php-format
2261
+ msgid "Removes the Yoast SEO plugin comment of their section %s"
2262
+ msgstr "Elimina el comentario del plugin Yoast SEO de su sección %s"
2263
+
2264
+ #: admin/pages/widgets.php:35
2265
+ msgid "Widgets"
2266
+ msgstr "Widgets"
2267
+
2268
+ #: admin/pages/widgets.php:36
2269
+ msgid "Disable unused widgets"
2270
+ msgstr "Deshabilitar los widgets no utilizados"
2271
+
2272
+ #: admin/pages/widgets.php:55
2273
+ msgid "<strong>Disable unused widgets</strong>."
2274
+ msgstr "<strong>Deshabilitar widgets no utilizados</strong>."
2275
+
2276
+ #: admin/pages/widgets.php:55
2277
+ msgid ""
2278
+ "Some widgets, such as the Calendar or Tag Cloud, create an extra query to "
2279
+ "the database, even if they are not displayed on the website. Of course, a "
2280
+ "couple of hits to the database will not do much harm to the whole site. "
2281
+ "However, if the resource contains a huge amount of content, and the speed of "
2282
+ "its work above all else, disabling unused functionality is the first step to "
2283
+ "optimizing and accelerating it."
2284
+ msgstr ""
2285
+ "Algunos widgets, como el calendario o la nube de etiquetas, crean una "
2286
+ "consulta adicional a la base de datos, incluso si no se muestran en el sitio "
2287
+ "web. Por supuesto, un par de visitas a la base de datos no harán mucho daño "
2288
+ "a todo el sitio. Sin embargo, si el recurso contiene una gran cantidad de "
2289
+ "contenido, y la velocidad de su trabajo es proridad, deshabilitar la "
2290
+ "funcionalidad no utilizada es el primer paso para optimizarla y acelerarla."
2291
+
2292
+ #: clearfy.php:84 includes/boot.php:113
2293
+ msgid "Clearfy"
2294
+ msgstr "Clearfy"
2295
+
2296
+ #: includes/boot.php:76
2297
+ msgid "Documentation"
2298
+ msgstr "Documentación"
2299
+
2300
+ #: includes/boot.php:82
2301
+ msgid "Do you like our plugin?"
2302
+ msgstr "¿Te gusta nuestro plugin?"
2303
+
2304
+ #: includes/boot.php:87
2305
+ msgid "Getting started free support"
2306
+ msgstr "Aprender a usar el soporte gratuito"
2307
+
2308
+ #: includes/boot.php:97
2309
+ msgid "Upgrade to premium"
2310
+ msgstr "Actualizar a premium"
2311
+
2312
+ #: includes/class.plugin.php:239
2313
+ msgid "Some components of Clearfy were suspended"
2314
+ msgstr "Algunos componentes de Clearfy fueron suspendidos"
2315
+
2316
+ #: includes/class.plugin.php:241
2317
+ #, php-format
2318
+ msgid ""
2319
+ "Component %s is not compatible with the current version of the plugin "
2320
+ "Clearfy, you must update the component to the latest version."
2321
+ msgstr ""
2322
+ "El componente %s no es compatible con la versión actual del plugin Clearfy, "
2323
+ "debes actualizar este componente a la última versión."
2324
+
2325
+ #: includes/class.plugin.php:244
2326
+ msgid "Click here to update the components"
2327
+ msgstr "Clik aquí para actualizar los componentes."
2328
+
2329
+ #: includes/classes/class.configurate-performance.php:149
2330
+ msgid "No interval specified"
2331
+ msgstr ""
2332
+
2333
+ #: includes/classes/class.configurate-performance.php:350
2334
+ msgid "REST API restricted to authenticated users."
2335
+ msgstr "REST API restringida a usuarios autenticados."
2336
+
2337
+ #: includes/classes/class.configurate-security.php:214
2338
+ msgid "<strong>ERROR</strong>: Wrong login or password"
2339
+ msgstr "<strong>ERROR</strong>: nombre de usuario o contraseña incorrectos"
2340
+
2341
+ #: includes/classes/class.package.php:206
2342
+ msgid "Sorry, you are not allowed to install plugins on this site."
2343
+ msgstr "Disculpe, no está permitido instalar complementos en este sitio."
2344
+
2345
+ #: includes/classes/class.package.php:271
2346
+ msgid ""
2347
+ "Updates are available for one of the components. Please, update your current "
2348
+ "package of components to the newest version."
2349
+ msgstr ""
2350
+ "Hay actualizaciones disponibles para uno de los componentes. Por favor, "
2351
+ "actualícelo a la versión más reciente."
2352
+
2353
+ #: includes/classes/class.package.php:274
2354
+ msgid ""
2355
+ "You’ve changed the component configuration. For the further work, please, "
2356
+ "update the current package of components!"
2357
+ msgstr ""
2358
+ "Has cambiado la configuración del componente. Para opciones adicionales, por "
2359
+ "favor, actualice el paquete de componentes!"
2360
+
2361
+ #: includes/classes/class.package.php:278
2362
+ msgid "Update now"
2363
+ msgstr "Actualizar ahora"
2364
+
2365
+ #: includes/classes/class.zip-archive.php:15
2366
+ msgid "The ZipArchive class does not exist in this version of php."
2367
+ msgstr "La clase ZipArchive no existe en esta versión de php."
languages/clearfy-nl_BE.po CHANGED
@@ -2080,1449 +2080,4 @@ msgstr ""
2080
 
2081
  #: includes/classes/class.zip-archive.php:15
2082
  msgid "The ZipArchive class does not exist in this version of php."
2083
- msgstr "De ZipArchive klasse bestaat niet in deze versie van php."
2084
-
2085
- #~ msgid ""
2086
- #~ "We found that you have the \"Clearfy - disable unused features\" plugin "
2087
- #~ "installed, this plugin already has disable comments functions, so you can "
2088
- #~ "deactivate plugin \"Webcraftic Cyrlitera\"!"
2089
- #~ msgstr ""
2090
- #~ "We hebben vastgesteld dat de plugin \"Clearfy - niet-gebruikte functies "
2091
- #~ "uitschakelen\" is geïnstalleerd. Deze plugin heeft reeds de functie "
2092
- #~ "opmerkingen uitschakelen, zodat u de plugin \"Webcraftic Cyrlitera\" kunt "
2093
- #~ "deactiveren!"
2094
-
2095
- #~ msgid "http://webcraftic.com"
2096
- #~ msgstr "http://webcraftic.com"
2097
-
2098
- #~ msgid "Webcraftic Hide login page"
2099
- #~ msgstr "Webcartic Verberg Loginpagina"
2100
-
2101
- #~ msgid "Webcraftic Cyrlitera"
2102
- #~ msgstr "Webcraftic Cyrlitera"
2103
-
2104
- #~ msgid "The rollback of new changes was successful!"
2105
- #~ msgstr "Het terugdraaien van nieuwe wijzigingen was succesvol!"
2106
-
2107
- #~ msgid "Rollback changes"
2108
- #~ msgstr "Wijzigingen terugdraaien"
2109
-
2110
- #~ msgid ""
2111
- #~ "Allows you to restore converted URLs by using the \"Convert already created "
2112
- #~ "posts and categories\" button. This can be useful in case of incorrect URLs "
2113
- #~ "or incorrect transliteration of some characters. You can roll back changes "
2114
- #~ "and advance the character sets above to correct the plugin's work. "
2115
- #~ msgstr ""
2116
- #~ "Hiermee kunt u geconverteerde URL's herstellen met behulp van de knop "
2117
- #~ "\"Bestaande berichten en categorieën converteren\". Dit kan handig zijn in "
2118
- #~ "het geval van onjuiste URL's of onjuiste transliteratie van sommige tekens. "
2119
- #~ "U kunt wijzigingen terugdraaien en de tekensets hierboven verbeteren om het "
2120
- #~ "werk van de plugin te corrigeren."
2121
-
2122
- #~ msgid "Url of old posts, pages,terms,tags successfully converted into Latin!"
2123
- #~ msgstr ""
2124
- #~ "Url van oude berichten, pagina's, voorwaarden, tags omgezet in Latijn!"
2125
-
2126
- #~ msgid "Convert already created posts and categories"
2127
- #~ msgstr "Converteer eerder gemaakte berichten en categorieën"
2128
-
2129
- #~ msgid ""
2130
- #~ "If at the time of the plugin installation you already had posts, pages, "
2131
- #~ "tags and categories, click on this button and the plugin will automatically "
2132
- #~ "convert URLs into Latin. Attention! Previously uploaded files will not be "
2133
- #~ "converted."
2134
- #~ msgstr ""
2135
- #~ "Als u tijdens de installatie van de plugin al berichten, pagina's, tags en "
2136
- #~ "categorieën had, klik dan op deze knop en de plugin converteert URL's "
2137
- #~ "automatisch naar Latijn. Aandacht! Eerder geüploade bestanden worden niet "
2138
- #~ "geconverteerd."
2139
-
2140
- #~ msgid ""
2141
- #~ "You can supplement current base of transliteration characters. Write pairs "
2142
- #~ "of values separated by commas. Example:"
2143
- #~ msgstr ""
2144
- #~ "U kunt de huidige basis van transliteratie tekens aanvullen. Schrijf paren "
2145
- #~ "van waardes gescheiden door komma's. Voorbeeld:"
2146
-
2147
- #~ msgid ""
2148
- #~ "If at the time of the plugin installation you had pages with unconverted "
2149
- #~ "links, use this option to redirect users from old to new URLs with the "
2150
- #~ "Latin alphabet."
2151
- #~ msgstr ""
2152
- #~ "Als u op het moment van de installatie van de plugin pagina's had met niet-"
2153
- #~ "geconverteerde links, gebruikt u deze optie om gebruikers om te leiden van "
2154
- #~ "oude naar nieuwe URL's met het Latijnse a
2080
 
2081
  #: includes/classes/class.zip-archive.php:15
2082
  msgid "The ZipArchive class does not exist in this version of php."