Version Description
- [New] Added new column dt_out to our table structure, to capture when a visitor leaves the page. This allows us to measure things like time on page and time on site. Please consider purchasing our Heartbeat add-on to increase this metric's accuracy.
- [Update] New icon added to our custom font package, and removed unneded font files for faster loading.
- [Update] Plugin Update Checker version 2.2 is now part of the package.
- [Fix] Bug preventing the stylesheet from loading on the Settings pages, under certain circumstances.
Download this release
Release Info
Developer | coolmann |
Plugin | Slimstat Analytics |
Version | 4.1.7 |
Comparing to | |
See all releases |
Code changes from version 4.1.6.3 to 4.1.7
- admin/css/fontello.eot +0 -0
- admin/css/fontello.woff +0 -0
- admin/css/slimstat.css +68 -1
- admin/css/{fontello.ttf → slimstat.eot} +0 -0
- admin/css/{fontello.svg → slimstat.svg} +31 -31
- admin/js/slimstat.admin.js +2 -2
- admin/update-checker/debug-bar-panel.php +1 -1
- admin/update-checker/debug-bar-plugin.php +2 -2
- admin/update-checker/github-checker.php +8 -6
- admin/update-checker/plugin-update-checker.php +107 -52
- admin/update-checker/vendor/readme-parser.php +1 -1
- admin/view/right-now.php +9 -4
- admin/view/wp-slimstat-db.php +2 -1
- admin/view/wp-slimstat-reports.php +10 -10
- admin/wp-slimstat-admin.php +17 -5
- readme.txt +9 -5
- wp-slimstat.php +5 -2
admin/css/fontello.eot
DELETED
Binary file
|
admin/css/fontello.woff
DELETED
Binary file
|
admin/css/slimstat.css
CHANGED
@@ -664,4 +664,71 @@
|
|
664 |
#ui-datepicker-div{display:none;}.ui-datepicker{background-color:#fff;border:1px solid #ccc;width:17em;padding:.2em .2em 0;display:none;}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}
|
665 |
|
666 |
/* Fontello - Custom Icon Fonts for SlimStat | Uses Fontelico (C) 2012 by Fontello project, Elusive (C) 2013 by Aristeides Stathopoulos, Font Awesome (C) 2012 by Dave Gandy | http://www.fontello.com */
|
667 |
-
@font-face
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
664 |
#ui-datepicker-div{display:none;}.ui-datepicker{background-color:#fff;border:1px solid #ccc;width:17em;padding:.2em .2em 0;display:none;}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}
|
665 |
|
666 |
/* Fontello - Custom Icon Fonts for SlimStat | Uses Fontelico (C) 2012 by Fontello project, Elusive (C) 2013 by Aristeides Stathopoulos, Font Awesome (C) 2012 by Dave Gandy | http://www.fontello.com */
|
667 |
+
@font-face {
|
668 |
+
font-family: 'slimstat';
|
669 |
+
src: url('slimstat.eot?37610477');
|
670 |
+
src: url('slimstat.eot?37610477#iefix') format('embedded-opentype'),
|
671 |
+
url('slimstat.svg?37610477#fontello') format('svg');
|
672 |
+
font-weight: normal;
|
673 |
+
font-style: normal;
|
674 |
+
}
|
675 |
+
@font-face {
|
676 |
+
font-family: 'slimstat';
|
677 |
+
src: url('data:application/octet-stream;base64,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') format('woff'),
|
678 |
+
url('data:application/octet-stream;base64,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') format('truetype');
|
679 |
+
}
|
680 |
+
|
681 |
+
[class^="slimstat-font-"]:before, [class*=" slimstat-font-"]:before {
|
682 |
+
font-family: "slimstat";
|
683 |
+
font-style: normal;
|
684 |
+
font-weight: normal;
|
685 |
+
speak: none;
|
686 |
+
|
687 |
+
display: inline-block;
|
688 |
+
text-decoration: inherit;
|
689 |
+
width: 1em;
|
690 |
+
margin-right: .2em;
|
691 |
+
text-align: center;
|
692 |
+
/* opacity: .8; */
|
693 |
+
|
694 |
+
/* For safety - reset parent styles, that can break glyph codes*/
|
695 |
+
font-variant: normal;
|
696 |
+
text-transform: none;
|
697 |
+
|
698 |
+
/* fix buttons height, for twitter bootstrap */
|
699 |
+
line-height: 1em;
|
700 |
+
|
701 |
+
/* Animation center compensation - margins should be symmetric */
|
702 |
+
/* remove if not needed */
|
703 |
+
margin-left: .2em;
|
704 |
+
|
705 |
+
/* you can be more comfortable with increased icons size */
|
706 |
+
/* font-size: 120%; */
|
707 |
+
|
708 |
+
/* Uncomment for 3D effect */
|
709 |
+
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
|
710 |
+
}
|
711 |
+
.slimstat-font-spin1:before { content: '\e800'; } /* '' */
|
712 |
+
.slimstat-font-clock:before { content: '\e801'; } /* '' */
|
713 |
+
.slimstat-font-search:before { content: '\e802'; } /* '' */
|
714 |
+
.slimstat-font-cancel:before { content: '\e803'; } /* '' */
|
715 |
+
.slimstat-font-download:before { content: '\e804'; } /* '' */
|
716 |
+
.slimstat-font-upload:before { content: '\e805'; } /* '' */
|
717 |
+
.slimstat-font-download-cloud:before { content: '\e806'; } /* '' */
|
718 |
+
.slimstat-font-upload-cloud:before { content: '\e807'; } /* '' */
|
719 |
+
.slimstat-font-location-1:before { content: '\e808'; } /* '' */
|
720 |
+
.slimstat-font-arrows-cw-1:before { content: '\e809'; } /* '' */
|
721 |
+
.slimstat-font-login:before { content: '\e80a'; } /* '' */
|
722 |
+
.slimstat-font-logout:before { content: '\e80b'; } /* '' */
|
723 |
+
.slimstat-font-angle-left:before { content: '\e80c'; } /* '' */
|
724 |
+
.slimstat-font-angle-right:before { content: '\e80d'; } /* '' */
|
725 |
+
.slimstat-font-angle-double-left:before { content: '\e80e'; } /* '' */
|
726 |
+
.slimstat-font-angle-double-right:before { content: '\e80f'; } /* '' */
|
727 |
+
.slimstat-font-arrows-cw:before { content: '\e810'; } /* '' */
|
728 |
+
.slimstat-font-doc:before { content: '\e811'; } /* '' */
|
729 |
+
.slimstat-font-spin3:before { content: '\e812'; } /* '' */
|
730 |
+
.slimstat-font-edit:before { content: '\e813'; } /* '' */
|
731 |
+
.slimstat-font-gauge:before { content: '\e814'; } /* '' */
|
732 |
+
.slimstat-font-stopwatch:before { content: '\e815'; } /* '' */
|
733 |
+
|
734 |
+
.animate-spin{-moz-animation:spin 3s infinite linear;-o-animation:spin 3s infinite linear;-webkit-animation:spin 3s infinite linear;animation:spin 3s infinite linear;display:inline-block}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-o-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-ms-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}
|
admin/css/{fontello.ttf → slimstat.eot}
RENAMED
Binary file
|
admin/css/{fontello.svg → slimstat.svg}
RENAMED
@@ -1,32 +1,32 @@
|
|
1 |
-
<?xml version="1.0" standalone="no"?>
|
2 |
-
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
3 |
-
<svg xmlns="http://www.w3.org/2000/svg">
|
4 |
-
<metadata>Copyright (C)
|
5 |
-
<defs>
|
6 |
-
<font id="fontello" horiz-adv-x="1000" >
|
7 |
-
<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
|
8 |
-
<missing-glyph horiz-adv-x="1000" />
|
9 |
-
<glyph glyph-name="
|
10 |
-
<glyph glyph-name="
|
11 |
-
<glyph glyph-name="
|
12 |
-
<glyph glyph-name="
|
13 |
-
<glyph glyph-name="
|
14 |
-
<glyph glyph-name="
|
15 |
-
<glyph glyph-name="
|
16 |
-
<glyph glyph-name="
|
17 |
-
<glyph glyph-name="
|
18 |
-
<glyph glyph-name="
|
19 |
-
<glyph glyph-name="
|
20 |
-
<glyph glyph-name="
|
21 |
-
<glyph glyph-name="angle-
|
22 |
-
<glyph glyph-name="angle-
|
23 |
-
<glyph glyph-name="angle-double-
|
24 |
-
<glyph glyph-name="
|
25 |
-
<glyph glyph-name="
|
26 |
-
<glyph glyph-name="
|
27 |
-
<glyph glyph-name="
|
28 |
-
<glyph glyph-name="
|
29 |
-
<glyph glyph-name="
|
30 |
-
</font>
|
31 |
-
</defs>
|
32 |
</svg>
|
1 |
+
<?xml version="1.0" standalone="no"?>
|
2 |
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
3 |
+
<svg xmlns="http://www.w3.org/2000/svg">
|
4 |
+
<metadata>Copyright (C) 2015 by original authors @ fontello.com</metadata>
|
5 |
+
<defs>
|
6 |
+
<font id="fontello" horiz-adv-x="1000" >
|
7 |
+
<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
|
8 |
+
<missing-glyph horiz-adv-x="1000" />
|
9 |
+
<glyph glyph-name="clock" unicode="" d="m500 546v-250q0-7-5-12t-13-5h-178q-8 0-13 5t-5 12v36q0 8 5 13t13 5h125v196q0 8 5 13t12 5h36q8 0 13-5t5-13z m232-196q0 83-41 152t-110 111-152 41-153-41-110-111-41-152 41-152 110-111 153-41 152 41 110 111 41 152z m125 0q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
|
10 |
+
<glyph glyph-name="search" unicode="" d="m643 386q0 103-74 176t-176 74-177-74-73-176 73-177 177-73 176 73 74 177z m286-465q0-29-22-50t-50-21q-30 0-50 21l-191 191q-100-69-223-69-80 0-153 31t-125 84-84 125-31 153 31 152 84 126 125 84 153 31 152-31 126-84 84-126 31-152q0-123-69-223l191-191q21-21 21-51z" horiz-adv-x="928.6" />
|
11 |
+
<glyph glyph-name="cancel" unicode="" d="m724 112q0-22-15-38l-76-76q-16-15-38-15t-38 15l-164 165-164-165q-16-15-38-15t-38 15l-76 76q-16 16-16 38t16 38l164 164-164 164q-16 16-16 38t16 38l76 76q16 16 38 16t38-16l164-164 164 164q16 16 38 16t38-16l76-76q15-15 15-38t-15-38l-164-164 164-164q15-15 15-38z" horiz-adv-x="785.7" />
|
12 |
+
<glyph glyph-name="download" unicode="" d="m714 100q0 15-10 25t-25 11-26-11-10-25 10-25 26-11 25 11 10 25z m143 0q0 15-10 25t-26 11-25-11-10-25 10-25 25-11 26 11 10 25z m72 125v-179q0-22-16-37t-38-16h-821q-23 0-38 16t-16 37v179q0 22 16 38t38 16h259l75-76q33-32 76-32t76 32l76 76h259q22 0 38-16t16-38z m-182 318q10-23-8-40l-250-250q-10-10-25-10t-25 10l-250 250q-17 17-8 40 10 21 33 21h143v250q0 15 11 25t25 11h143q14 0 25-11t10-25v-250h143q24 0 33-21z" horiz-adv-x="928.6" />
|
13 |
+
<glyph glyph-name="upload" unicode="" d="m714 29q0 14-10 25t-25 10-26-10-10-25 10-26 26-10 25 10 10 26z m143 0q0 14-10 25t-26 10-25-10-10-25 10-26 25-10 26 10 10 26z m72 125v-179q0-22-16-38t-38-16h-821q-23 0-38 16t-16 38v179q0 22 16 38t38 15h238q12-31 39-51t62-20h143q34 0 61 20t40 51h238q22 0 38-15t16-38z m-182 361q-9-22-33-22h-143v-250q0-15-10-25t-25-11h-143q-15 0-25 11t-11 25v250h-143q-23 0-33 22-9 22 8 39l250 250q10 10 25 10t25-10l250-250q18-17 8-39z" horiz-adv-x="928.6" />
|
14 |
+
<glyph glyph-name="download-cloud" unicode="" d="m714 332q0 8-5 13t-13 5h-125v196q0 8-5 13t-12 5h-108q-7 0-12-5t-5-13v-196h-125q-8 0-13-5t-5-13q0-8 5-13l196-196q5-5 13-5t13 5l196 196q5 6 5 13z m357-125q0-89-62-151t-152-63h-607q-103 0-177 73t-73 177q0 72 39 134t105 92q-1 17-1 24 0 118 84 202t202 84q87 0 159-49t105-129q40 35 93 35 59 0 101-42t42-101q0-43-23-77 72-17 119-76t46-133z" horiz-adv-x="1071.4" />
|
15 |
+
<glyph glyph-name="upload-cloud" unicode="" d="m714 368q0 8-5 13l-196 196q-5 5-13 5t-13-5l-196-196q-5-6-5-13 0-8 5-13t13-5h125v-196q0-8 5-13t12-5h108q7 0 12 5t5 13v196h125q8 0 13 5t5 13z m357-161q0-89-62-151t-152-63h-607q-103 0-177 73t-73 177q0 72 39 134t105 92q-1 17-1 24 0 118 84 202t202 84q87 0 159-49t105-129q40 35 93 35 59 0 101-42t42-101q0-43-23-77 72-17 119-76t46-133z" horiz-adv-x="1071.4" />
|
16 |
+
<glyph glyph-name="location-1" unicode="" d="m429 493q0 59-42 101t-101 42-101-42-42-101 42-101 101-42 101 42 42 101z m142 0q0-61-18-100l-203-432q-9-18-27-29t-37-11-38 11-26 29l-204 432q-18 39-18 100 0 118 84 202t202 84 202-84 83-202z" horiz-adv-x="571.4" />
|
17 |
+
<glyph glyph-name="arrows-cw-1" unicode="" d="m0-150l0 402 402 0-160-160q108-107 258-107 125 0 222 75t130 192l138 0q-35-173-173-288t-317-114q-207 0-353 146z m10 598q35 174 173 288t317 114q207 0 354-146l146 146 0-402-402 0 160 160q-108 107-258 107-125 0-222-75t-130-192l-138 0z" horiz-adv-x="1000" />
|
18 |
+
<glyph glyph-name="login" unicode="" d="m661 350q0-14-11-25l-303-304q-11-10-26-10t-25 10-10 25v161h-250q-15 0-25 11t-11 25v214q0 15 11 25t25 11h250v161q0 14 10 25t25 10 26-10l303-304q11-10 11-25z m196 196v-392q0-67-47-114t-114-47h-178q-7 0-13 5t-5 13q0 2-1 11t0 15 2 13 5 11 12 3h178q37 0 63 27t27 63v392q0 37-27 63t-63 27h-174t-6 0-6 2-5 3-4 5-1 8q0 2-1 11t0 15 2 13 5 11 12 3h178q67 0 114-47t47-114z" horiz-adv-x="857.1" />
|
19 |
+
<glyph glyph-name="logout" unicode="" d="m357 46q0-2 1-11t0-14-2-14-5-11-12-3h-178q-67 0-114 47t-47 114v392q0 67 47 114t114 47h178q8 0 13-5t5-13q0-2 1-11t0-15-2-13-5-11-12-3h-178q-37 0-63-27t-27-63v-392q0-37 27-63t63-27h174t6 0 7-2 4-3 4-5 1-8z m518 304q0-14-11-25l-303-304q-11-10-25-10t-25 10-11 25v161h-250q-14 0-25 11t-11 25v214q0 15 11 25t25 11h250v161q0 14 11 25t25 10 25-10l303-304q11-10 11-25z" horiz-adv-x="928.6" />
|
20 |
+
<glyph glyph-name="angle-left" unicode="" d="m350 546q0-7-6-12l-219-220 219-219q6-6 6-13t-6-13l-28-28q-5-5-12-5t-13 5l-260 260q-6 6-6 13t6 13l260 260q5 6 13 6t12-6l28-28q6-5 6-13z" horiz-adv-x="357.1" />
|
21 |
+
<glyph glyph-name="angle-right" unicode="" d="m332 314q0-7-6-13l-260-260q-5-5-12-5t-13 5l-28 28q-6 6-6 13t6 13l219 219-219 220q-6 5-6 12t6 13l28 28q5 6 13 6t12-6l260-260q6-5 6-13z" horiz-adv-x="357.1" />
|
22 |
+
<glyph glyph-name="angle-double-left" unicode="" d="m350 82q0-7-6-13l-28-28q-5-5-12-5t-13 5l-260 260q-6 6-6 13t6 13l260 260q5 6 13 6t12-6l28-28q6-5 6-13t-6-12l-219-220 219-219q6-6 6-13z m214 0q0-7-5-13l-28-28q-6-5-13-5t-13 5l-260 260q-6 6-6 13t6 13l260 260q6 6 13 6t13-6l28-28q5-5 5-13t-5-12l-220-220 220-219q5-6 5-13z" horiz-adv-x="571.4" />
|
23 |
+
<glyph glyph-name="angle-double-right" unicode="" d="m332 314q0-7-6-13l-260-260q-5-5-12-5t-13 5l-28 28q-6 6-6 13t6 13l219 219-219 220q-6 5-6 12t6 13l28 28q5 6 13 6t12-6l260-260q6-5 6-13z m214 0q0-7-5-13l-260-260q-6-5-13-5t-13 5l-28 28q-5 6-5 13t5 13l219 219-219 220q-5 5-5 12t5 13l28 28q6 6 13 6t13-6l260-260q5-5 5-13z" horiz-adv-x="571.4" />
|
24 |
+
<glyph glyph-name="arrows-cw" unicode="" d="m843 261q0-3 0-4-36-150-150-243t-267-93q-81 0-157 31t-136 88l-72-72q-11-11-25-11t-25 11-11 25v250q0 14 11 25t25 11h250q14 0 25-11t10-25-10-25l-77-77q40-37 90-57t105-20q74 0 139 37t104 99q6 10 29 66 5 13 17 13h107q8 0 13-6t5-12z m14 446v-250q0-14-10-25t-26-11h-250q-14 0-25 11t-10 25 10 25l77 77q-82 77-194 77-75 0-140-37t-104-99q-6-10-29-66-5-13-17-13h-111q-7 0-13 6t-5 12v4q36 150 151 243t268 93q81 0 158-31t137-88l72 72q11 11 25 11t26-11 10-25z" horiz-adv-x="857.1" />
|
25 |
+
<glyph glyph-name="doc" unicode="" d="m71-7h572v428h-232q-23 0-38 16t-16 38v232h-286v-714z m358 500h209q-5 16-12 23l-175 174q-6 7-22 13v-210z m285-18v-500q0-22-15-38t-38-16h-607q-23 0-38 16t-16 38v750q0 22 16 38t38 16h357q22 0 49-12t42-26l174-175q16-15 27-42t11-49z" horiz-adv-x="714.3" />
|
26 |
+
<glyph glyph-name="spin4" unicode="" d="m498 850c-114 0-228-39-320-116l0 0c173 140 428 130 588-31 134-134 164-332 89-495-10-29-5-50 12-68 21-20 61-23 84 0 3 3 12 15 15 24 71 180 33 393-112 539-99 98-228 147-356 147z m-409-274c-14 0-29-5-39-16-3-3-13-15-15-24-71-180-34-393 112-539 185-185 479-195 676-31l0 0c-173-140-428-130-589 31-134 134-163 333-89 495 11 29 6 50-12 68-11 11-27 17-44 16z" horiz-adv-x="1001" />
|
27 |
+
<glyph glyph-name="edit" unicode="" d="m0 154v464q0 66 47 113t114 48h464q35 0 65-14 9-4 10-13 2-10-5-16l-27-28q-8-8-18-4-13 3-25 3h-464q-37 0-63-26t-27-63v-464q0-37 27-63t63-27h464q37 0 63 27t26 63v70q0 7 5 12l36 36q8 8 20 4t11-16v-106q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114z m357-18v160l375 375 161-160-375-375h-161z m54 107h53v-54h32l64 65-85 85-64-65v-31z m116 134q9-9 18 0l196 196q9 9 0 18t-18 0l-196-196q-9-9 0-18z m241 330l51 51q16 16 38 16t38-16l85-84q16-16 16-38t-16-38l-51-52z" horiz-adv-x="1000" />
|
28 |
+
<glyph glyph-name="gauge" unicode="" d="m0 207q0 102 40 194t106 160 160 107 194 39 194-39 160-107 106-160 40-194q0-145-79-269-10-17-30-17h-782q-20 0-30 17-79 123-79 269z m71 0q0-29 21-50t51-21 50 21 21 50-21 51-50 21-51-21-21-51z m108 250q0-29 21-50t50-21 51 21 20 50-20 51-51 21-50-21-21-51z m217-330q-11-43 11-81t66-50 81 11 50 66q9 33-4 65t-40 51l57 213q3 14-5 27t-21 16-27-3-17-22l-56-213q-33-3-60-25t-35-55z m33 437q0-29 21-50t50-21 51 21 20 50-20 51-51 21-50-21-21-51z m250-107q0-29 21-50t50-21 51 21 20 50-20 51-51 21-50-21-21-51z m107-250q0-29 21-50t50-21 51 21 21 50-21 51-51 21-50-21-21-51z" horiz-adv-x="1000" />
|
29 |
+
<glyph glyph-name="stopwatch" unicode="" d="m855 537q83-117 83-265 0-194-138-331t-331-138-331 138-138 331q0 180 120 313t298 152l0 1-2 3 0 51-51 0q-21 0-37 16t-15 37 15 36 37 16l208 0q21 0 36-16t16-36-16-37-36-16l-52 0 0-51-1-1 0-3q156-17 270-125 1 1 3 4t3 5l27 26q15 15 36 15t37-15 15-37-15-37l-26-26q-5-5-15-10z m-386-630q151 0 258 107t107 258-107 258-258 106-258-106-107-258 107-258 258-107z m52 416l104 0q21 0 37-15t16-36-16-37-37-15l-156 0q-21 0-37 15t-16 37l0 156q0 22 16 37t37 15 37-15 15-37l0-105z m-52 262q129 0 220-92t92-221-92-221-220-92-221 92-92 221 92 221 221 92z m0-574q107 0 184 77t76 184-76 184-184 76-184-76-76-184 76-184 184-77z" horiz-adv-x="938" />
|
30 |
+
</font>
|
31 |
+
</defs>
|
32 |
</svg>
|
admin/js/slimstat.admin.js
CHANGED
@@ -208,7 +208,7 @@ var SlimStatAdmin = {
|
|
208 |
else{
|
209 |
report_id = 'slim_p7_02';
|
210 |
data = {action: 'slimstat_load_report', report_id: report_id, security: jQuery('#meta-box-order-nonce').val(), page: SlimStatAdmin.get_query_string_value( 'page' ) };
|
211 |
-
jQuery('#'+report_id+' .inside').html('<p class="loading"></p>');
|
212 |
SlimStatAdmin.refresh_report(report_id, data);
|
213 |
|
214 |
window.clearTimeout(refresh_handle);
|
@@ -225,7 +225,7 @@ var SlimStatAdmin = {
|
|
225 |
data[filters_input[i]['name']] = filters_input[i]['value'];
|
226 |
}
|
227 |
|
228 |
-
jQuery('#'+report_id+' .inside').html('<p class="loading"><i class="slimstat-font-
|
229 |
|
230 |
jQuery.post(ajaxurl, data, function(response){
|
231 |
if (report_id.indexOf('_01') > 0){
|
208 |
else{
|
209 |
report_id = 'slim_p7_02';
|
210 |
data = {action: 'slimstat_load_report', report_id: report_id, security: jQuery('#meta-box-order-nonce').val(), page: SlimStatAdmin.get_query_string_value( 'page' ) };
|
211 |
+
jQuery('#'+report_id+' .inside').html('<p class="loading"><i class="slimstat-font-spin3 animate-spin"></i></p>');
|
212 |
SlimStatAdmin.refresh_report(report_id, data);
|
213 |
|
214 |
window.clearTimeout(refresh_handle);
|
225 |
data[filters_input[i]['name']] = filters_input[i]['value'];
|
226 |
}
|
227 |
|
228 |
+
jQuery('#'+report_id+' .inside').html('<p class="loading"><i class="slimstat-font-spin3 animate-spin"></i></p>');
|
229 |
|
230 |
jQuery.post(ajaxurl, data, function(response){
|
231 |
if (report_id.indexOf('_01') > 0){
|
admin/update-checker/debug-bar-panel.php
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
if ( !class_exists('PluginUpdateCheckerPanel') && class_exists('Debug_Bar_Panel') ) {
|
4 |
|
5 |
/**
|
6 |
* A Debug Bar panel for the plugin update checker.
|
1 |
<?php
|
2 |
|
3 |
+
if ( !class_exists('PluginUpdateCheckerPanel', false) && class_exists('Debug_Bar_Panel', false) ) {
|
4 |
|
5 |
/**
|
6 |
* A Debug Bar panel for the plugin update checker.
|
admin/update-checker/debug-bar-plugin.php
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
<?php
|
2 |
-
if ( !class_exists('PucDebugBarPlugin') ) {
|
3 |
|
4 |
class PucDebugBarPlugin {
|
5 |
/** @var PluginUpdateChecker */
|
@@ -23,7 +23,7 @@ class PucDebugBarPlugin {
|
|
23 |
*/
|
24 |
public function addDebugBarPanel($panels) {
|
25 |
require_once dirname(__FILE__) . '/debug-bar-panel.php';
|
26 |
-
if ( current_user_can('update_plugins') && class_exists('PluginUpdateCheckerPanel') ) {
|
27 |
$panels[] = new PluginUpdateCheckerPanel($this->updateChecker);
|
28 |
}
|
29 |
return $panels;
|
1 |
<?php
|
2 |
+
if ( !class_exists('PucDebugBarPlugin', false) ) {
|
3 |
|
4 |
class PucDebugBarPlugin {
|
5 |
/** @var PluginUpdateChecker */
|
23 |
*/
|
24 |
public function addDebugBarPanel($panels) {
|
25 |
require_once dirname(__FILE__) . '/debug-bar-panel.php';
|
26 |
+
if ( current_user_can('update_plugins') && class_exists('PluginUpdateCheckerPanel', false) ) {
|
27 |
$panels[] = new PluginUpdateCheckerPanel($this->updateChecker);
|
28 |
}
|
29 |
return $panels;
|
admin/update-checker/github-checker.php
CHANGED
@@ -1,8 +1,8 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
if ( !class_exists('
|
4 |
|
5 |
-
class
|
6 |
/**
|
7 |
* @var string GitHub username.
|
8 |
*/
|
@@ -57,7 +57,7 @@ class PucGitHubChecker_2_0 extends PluginUpdateChecker_2_0 {
|
|
57 |
* @return PluginInfo
|
58 |
*/
|
59 |
public function requestInfo($unusedQueryArgs = array()) {
|
60 |
-
$info = new
|
61 |
$info->filename = $this->pluginFile;
|
62 |
$info->slug = $this->slug;
|
63 |
$info->sections = array();
|
@@ -94,6 +94,8 @@ class PucGitHubChecker_2_0 extends PluginUpdateChecker_2_0 {
|
|
94 |
|
95 |
if ( empty($info->download_url) ) {
|
96 |
$info->download_url = $this->buildArchiveDownloadUrl($ref);
|
|
|
|
|
97 |
}
|
98 |
|
99 |
//Get headers from the main plugin file in this branch/tag. Its "Version" header and other metadata
|
@@ -254,7 +256,7 @@ class PucGitHubChecker_2_0 extends PluginUpdateChecker_2_0 {
|
|
254 |
* @return string
|
255 |
*/
|
256 |
protected function parseMarkdown($markdown) {
|
257 |
-
if ( !class_exists('Parsedown') ) {
|
258 |
require_once(dirname(__FILE__) . '/vendor/Parsedown.php');
|
259 |
}
|
260 |
|
@@ -375,7 +377,7 @@ class PucGitHubChecker_2_0 extends PluginUpdateChecker_2_0 {
|
|
375 |
* Copy plugin metadata from a file header to a PluginInfo object.
|
376 |
*
|
377 |
* @param array $fileHeader
|
378 |
-
* @param
|
379 |
*/
|
380 |
protected function setInfoFromHeader($fileHeader, $pluginInfo) {
|
381 |
$headerToPropertyMap = array(
|
@@ -406,7 +408,7 @@ class PucGitHubChecker_2_0 extends PluginUpdateChecker_2_0 {
|
|
406 |
}
|
407 |
|
408 |
protected function parseReadme($content) {
|
409 |
-
if ( !class_exists('PucReadmeParser') ) {
|
410 |
require_once(dirname(__FILE__) . '/vendor/readme-parser.php');
|
411 |
}
|
412 |
$parser = new PucReadmeParser();
|
1 |
<?php
|
2 |
|
3 |
+
if ( !class_exists('PucGitHubChecker_2_2', false) ):
|
4 |
|
5 |
+
class PucGitHubChecker_2_2 extends PluginUpdateChecker_2_2 {
|
6 |
/**
|
7 |
* @var string GitHub username.
|
8 |
*/
|
57 |
* @return PluginInfo
|
58 |
*/
|
59 |
public function requestInfo($unusedQueryArgs = array()) {
|
60 |
+
$info = new PluginInfo_2_2();
|
61 |
$info->filename = $this->pluginFile;
|
62 |
$info->slug = $this->slug;
|
63 |
$info->sections = array();
|
94 |
|
95 |
if ( empty($info->download_url) ) {
|
96 |
$info->download_url = $this->buildArchiveDownloadUrl($ref);
|
97 |
+
} else if ( !empty($this->accessToken) ) {
|
98 |
+
$info->download_url = add_query_arg('access_token', $this->accessToken, $info->download_url);
|
99 |
}
|
100 |
|
101 |
//Get headers from the main plugin file in this branch/tag. Its "Version" header and other metadata
|
256 |
* @return string
|
257 |
*/
|
258 |
protected function parseMarkdown($markdown) {
|
259 |
+
if ( !class_exists('Parsedown', false) ) {
|
260 |
require_once(dirname(__FILE__) . '/vendor/Parsedown.php');
|
261 |
}
|
262 |
|
377 |
* Copy plugin metadata from a file header to a PluginInfo object.
|
378 |
*
|
379 |
* @param array $fileHeader
|
380 |
+
* @param PluginInfo_2_2 $pluginInfo
|
381 |
*/
|
382 |
protected function setInfoFromHeader($fileHeader, $pluginInfo) {
|
383 |
$headerToPropertyMap = array(
|
408 |
}
|
409 |
|
410 |
protected function parseReadme($content) {
|
411 |
+
if ( !class_exists('PucReadmeParser', false) ) {
|
412 |
require_once(dirname(__FILE__) . '/vendor/readme-parser.php');
|
413 |
}
|
414 |
$parser = new PucReadmeParser();
|
admin/update-checker/plugin-update-checker.php
CHANGED
@@ -1,23 +1,23 @@
|
|
1 |
<?php
|
2 |
/**
|
3 |
-
* Plugin Update Checker Library 2.
|
4 |
* http://w-shadow.com/
|
5 |
*
|
6 |
* Copyright 2015 Janis Elsts
|
7 |
-
* Released under the
|
8 |
*/
|
9 |
|
10 |
-
if ( !class_exists('
|
11 |
|
12 |
/**
|
13 |
* A custom plugin update checker.
|
14 |
*
|
15 |
* @author Janis Elsts
|
16 |
* @copyright 2015
|
17 |
-
* @version 2.
|
18 |
* @access public
|
19 |
*/
|
20 |
-
class
|
21 |
public $metadataUrl = ''; //The URL of the plugin's metadata file.
|
22 |
public $pluginAbsolutePath = ''; //Full path of the main plugin file.
|
23 |
public $pluginFile = ''; //Plugin filename relative to the plugins directory. Many WP APIs use this to identify plugins.
|
@@ -36,6 +36,8 @@ class PluginUpdateChecker_2_0 {
|
|
36 |
private $debugBarPlugin = null;
|
37 |
private $cachedInstalledVersion = null;
|
38 |
|
|
|
|
|
39 |
/**
|
40 |
* Class constructor.
|
41 |
*
|
@@ -149,6 +151,11 @@ class PluginUpdateChecker_2_0 {
|
|
149 |
|
150 |
//Rename the update directory to be the same as the existing directory.
|
151 |
add_filter('upgrader_source_selection', array($this, 'fixDirectoryName'), 10, 3);
|
|
|
|
|
|
|
|
|
|
|
152 |
}
|
153 |
|
154 |
/**
|
@@ -223,7 +230,7 @@ class PluginUpdateChecker_2_0 {
|
|
223 |
//Try to parse the response
|
224 |
$pluginInfo = null;
|
225 |
if ( !is_wp_error($result) && isset($result['response']['code']) && ($result['response']['code'] == 200) && !empty($result['body']) ){
|
226 |
-
$pluginInfo =
|
227 |
$pluginInfo->filename = $this->pluginFile;
|
228 |
$pluginInfo->slug = $this->slug;
|
229 |
} else if ( $this->debugMode ) {
|
@@ -256,7 +263,7 @@ class PluginUpdateChecker_2_0 {
|
|
256 |
if ( $pluginInfo == null ){
|
257 |
return null;
|
258 |
}
|
259 |
-
return
|
260 |
}
|
261 |
|
262 |
/**
|
@@ -419,7 +426,7 @@ class PluginUpdateChecker_2_0 {
|
|
419 |
}
|
420 |
|
421 |
if ( !empty($state) && isset($state->update) && is_object($state->update) ){
|
422 |
-
$state->update =
|
423 |
}
|
424 |
return $state;
|
425 |
}
|
@@ -531,8 +538,8 @@ class PluginUpdateChecker_2_0 {
|
|
531 |
* GitHub and other repositories provide ZIP downloads, but they often use directory names like
|
532 |
* "project-branch" or "project-tag-hash". We need to change the name to the actual plugin folder.
|
533 |
*
|
534 |
-
* @param string $source
|
535 |
-
* @param string $remoteSource
|
536 |
* @param WP_Upgrader $upgrader
|
537 |
* @return string|WP_Error
|
538 |
*/
|
@@ -551,33 +558,33 @@ class PluginUpdateChecker_2_0 {
|
|
551 |
if ( isset($skin->plugin) && is_string($skin->plugin) && ($skin->plugin !== '') ) {
|
552 |
$pluginFile = $skin->plugin;
|
553 |
}
|
554 |
-
} elseif ( $
|
555 |
-
//This case is tricky because Bulk_Plugin_Upgrader_Skin doesn't actually store the plugin
|
556 |
//filename anywhere. Instead, it has the plugin headers in $plugin_info. So the best we can
|
557 |
//do is compare those headers to the headers of installed plugins.
|
558 |
-
if (
|
559 |
-
|
560 |
-
|
561 |
-
}
|
562 |
-
|
563 |
-
$installedPlugins = get_plugins();
|
564 |
-
$matches = array();
|
565 |
-
foreach($installedPlugins as $pluginBasename => $headers) {
|
566 |
-
$diff1 = array_diff_assoc($headers, $skin->plugin_info);
|
567 |
-
$diff2 = array_diff_assoc($skin->plugin_info, $headers);
|
568 |
-
if ( empty($diff1) && empty($diff2) ) {
|
569 |
-
$matches[] = $pluginBasename;
|
570 |
-
}
|
571 |
-
}
|
572 |
|
573 |
-
|
574 |
-
|
575 |
-
|
576 |
-
|
|
|
|
|
|
|
577 |
}
|
|
|
578 |
|
579 |
-
|
|
|
|
|
|
|
580 |
}
|
|
|
|
|
|
|
|
|
581 |
}
|
582 |
|
583 |
//If WordPress is upgrading anything other than our plugin, leave the directory name unchanged.
|
@@ -592,6 +599,26 @@ class PluginUpdateChecker_2_0 {
|
|
592 |
}
|
593 |
$correctedSource = trailingslashit($remoteSource) . $pluginDirectoryName . '/';
|
594 |
if ( $source !== $correctedSource ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
595 |
$upgrader->skin->feedback(sprintf(
|
596 |
'Renaming %s to %s…',
|
597 |
'<span class="code">' . basename($source) . '</span>',
|
@@ -612,6 +639,32 @@ class PluginUpdateChecker_2_0 {
|
|
612 |
return $source;
|
613 |
}
|
614 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
615 |
|
616 |
/**
|
617 |
* Get the details of the currently available update, if any.
|
@@ -825,8 +878,9 @@ class PluginUpdateChecker_2_0 {
|
|
825 |
* Initialize the update checker Debug Bar plugin/add-on thingy.
|
826 |
*/
|
827 |
public function initDebugBarPanel() {
|
828 |
-
|
829 |
-
|
|
|
830 |
$this->debugBarPlugin = new PucDebugBarPlugin($this);
|
831 |
}
|
832 |
}
|
@@ -834,17 +888,17 @@ class PluginUpdateChecker_2_0 {
|
|
834 |
|
835 |
endif;
|
836 |
|
837 |
-
if ( !class_exists('
|
838 |
|
839 |
/**
|
840 |
* A container class for holding and transforming various plugin metadata.
|
841 |
*
|
842 |
* @author Janis Elsts
|
843 |
* @copyright 2015
|
844 |
-
* @version 2.
|
845 |
* @access public
|
846 |
*/
|
847 |
-
class
|
848 |
//Most fields map directly to the contents of the plugin's info.json file.
|
849 |
//See the relevant docs for a description of their meaning.
|
850 |
public $name;
|
@@ -865,6 +919,7 @@ class PluginInfo_2_0 {
|
|
865 |
public $rating;
|
866 |
public $num_ratings;
|
867 |
public $downloaded;
|
|
|
868 |
public $last_updated;
|
869 |
|
870 |
public $id = 0; //The native WP.org API returns numeric plugin IDs, but they're not used for anything.
|
@@ -924,7 +979,7 @@ class PluginInfo_2_0 {
|
|
924 |
//as those returned by the native WordPress.org API. These can be assigned directly.
|
925 |
$sameFormat = array(
|
926 |
'name', 'slug', 'version', 'requires', 'tested', 'rating', 'upgrade_notice',
|
927 |
-
'num_ratings', 'downloaded', 'homepage', 'last_updated',
|
928 |
);
|
929 |
foreach($sameFormat as $field){
|
930 |
if ( isset($this->$field) ) {
|
@@ -964,17 +1019,17 @@ class PluginInfo_2_0 {
|
|
964 |
|
965 |
endif;
|
966 |
|
967 |
-
if ( !class_exists('
|
968 |
|
969 |
/**
|
970 |
* A simple container class for holding information about an available update.
|
971 |
*
|
972 |
* @author Janis Elsts
|
973 |
* @copyright 2015
|
974 |
-
* @version 2.
|
975 |
* @access public
|
976 |
*/
|
977 |
-
class
|
978 |
public $id = 0;
|
979 |
public $slug;
|
980 |
public $version;
|
@@ -996,7 +1051,7 @@ class PluginUpdate_2_0 {
|
|
996 |
//Since update-related information is simply a subset of the full plugin info,
|
997 |
//we can parse the update JSON as if it was a plugin info string, then copy over
|
998 |
//the parts that we care about.
|
999 |
-
$pluginInfo =
|
1000 |
if ( $pluginInfo != null ) {
|
1001 |
return self::fromPluginInfo($pluginInfo);
|
1002 |
} else {
|
@@ -1080,7 +1135,7 @@ class PluginUpdate_2_0 {
|
|
1080 |
|
1081 |
endif;
|
1082 |
|
1083 |
-
if ( !class_exists('PucFactory') ):
|
1084 |
|
1085 |
/**
|
1086 |
* A factory that builds instances of other classes from this library.
|
@@ -1172,23 +1227,23 @@ endif;
|
|
1172 |
require_once(dirname(__FILE__) . '/github-checker.php');
|
1173 |
|
1174 |
//Register classes defined in this file with the factory.
|
1175 |
-
PucFactory::addVersion('PluginUpdateChecker', '
|
1176 |
-
PucFactory::addVersion('PluginUpdate', '
|
1177 |
-
PucFactory::addVersion('PluginInfo', '
|
1178 |
-
PucFactory::addVersion('PucGitHubChecker', '
|
1179 |
|
1180 |
/**
|
1181 |
* Create non-versioned variants of the update checker classes. This allows for backwards
|
1182 |
* compatibility with versions that did not use a factory, and it simplifies doc-comments.
|
1183 |
*/
|
1184 |
-
if ( !class_exists('PluginUpdateChecker') ) {
|
1185 |
-
class PluginUpdateChecker extends
|
1186 |
}
|
1187 |
|
1188 |
-
if ( !class_exists('PluginUpdate') ) {
|
1189 |
-
class PluginUpdate extends
|
1190 |
}
|
1191 |
|
1192 |
-
if ( !class_exists('PluginInfo') ) {
|
1193 |
-
class PluginInfo extends
|
1194 |
}
|
1 |
<?php
|
2 |
/**
|
3 |
+
* Plugin Update Checker Library 2.2.0
|
4 |
* http://w-shadow.com/
|
5 |
*
|
6 |
* Copyright 2015 Janis Elsts
|
7 |
+
* Released under the MIT license. See license.txt for details.
|
8 |
*/
|
9 |
|
10 |
+
if ( !class_exists('PluginUpdateChecker_2_2', false) ):
|
11 |
|
12 |
/**
|
13 |
* A custom plugin update checker.
|
14 |
*
|
15 |
* @author Janis Elsts
|
16 |
* @copyright 2015
|
17 |
+
* @version 2.2
|
18 |
* @access public
|
19 |
*/
|
20 |
+
class PluginUpdateChecker_2_2 {
|
21 |
public $metadataUrl = ''; //The URL of the plugin's metadata file.
|
22 |
public $pluginAbsolutePath = ''; //Full path of the main plugin file.
|
23 |
public $pluginFile = ''; //Plugin filename relative to the plugins directory. Many WP APIs use this to identify plugins.
|
36 |
private $debugBarPlugin = null;
|
37 |
private $cachedInstalledVersion = null;
|
38 |
|
39 |
+
private $upgradedPluginFile = null; //The plugin that is currently being upgraded by WordPress.
|
40 |
+
|
41 |
/**
|
42 |
* Class constructor.
|
43 |
*
|
151 |
|
152 |
//Rename the update directory to be the same as the existing directory.
|
153 |
add_filter('upgrader_source_selection', array($this, 'fixDirectoryName'), 10, 3);
|
154 |
+
|
155 |
+
//Keep track of which plugin WordPress is currently upgrading.
|
156 |
+
add_filter('upgrader_pre_install', array($this, 'setUpgradedPlugin'), 10, 2);
|
157 |
+
add_filter('upgrader_post_install', array($this, 'clearUpgradedPlugin'), 10, 1);
|
158 |
+
add_action('upgrader_process_complete', array($this, 'clearUpgradedPlugin'), 10, 1);
|
159 |
}
|
160 |
|
161 |
/**
|
230 |
//Try to parse the response
|
231 |
$pluginInfo = null;
|
232 |
if ( !is_wp_error($result) && isset($result['response']['code']) && ($result['response']['code'] == 200) && !empty($result['body']) ){
|
233 |
+
$pluginInfo = PluginInfo_2_2::fromJson($result['body'], $this->debugMode);
|
234 |
$pluginInfo->filename = $this->pluginFile;
|
235 |
$pluginInfo->slug = $this->slug;
|
236 |
} else if ( $this->debugMode ) {
|
263 |
if ( $pluginInfo == null ){
|
264 |
return null;
|
265 |
}
|
266 |
+
return PluginUpdate_2_2::fromPluginInfo($pluginInfo);
|
267 |
}
|
268 |
|
269 |
/**
|
426 |
}
|
427 |
|
428 |
if ( !empty($state) && isset($state->update) && is_object($state->update) ){
|
429 |
+
$state->update = PluginUpdate_2_2::fromObject($state->update);
|
430 |
}
|
431 |
return $state;
|
432 |
}
|
538 |
* GitHub and other repositories provide ZIP downloads, but they often use directory names like
|
539 |
* "project-branch" or "project-tag-hash". We need to change the name to the actual plugin folder.
|
540 |
*
|
541 |
+
* @param string $source The directory to copy to /wp-content/plugins. Usually a subdirectory of $remoteSource.
|
542 |
+
* @param string $remoteSource WordPress has extracted the update to this directory.
|
543 |
* @param WP_Upgrader $upgrader
|
544 |
* @return string|WP_Error
|
545 |
*/
|
558 |
if ( isset($skin->plugin) && is_string($skin->plugin) && ($skin->plugin !== '') ) {
|
559 |
$pluginFile = $skin->plugin;
|
560 |
}
|
561 |
+
} elseif ( isset($skin->plugin_info) && is_array($skin->plugin_info) ) {
|
562 |
+
//This case is tricky because Bulk_Plugin_Upgrader_Skin (etc) doesn't actually store the plugin
|
563 |
//filename anywhere. Instead, it has the plugin headers in $plugin_info. So the best we can
|
564 |
//do is compare those headers to the headers of installed plugins.
|
565 |
+
if ( !function_exists('get_plugins') ){
|
566 |
+
require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
|
567 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
568 |
|
569 |
+
$installedPlugins = get_plugins();
|
570 |
+
$matches = array();
|
571 |
+
foreach($installedPlugins as $pluginBasename => $headers) {
|
572 |
+
$diff1 = array_diff_assoc($headers, $skin->plugin_info);
|
573 |
+
$diff2 = array_diff_assoc($skin->plugin_info, $headers);
|
574 |
+
if ( empty($diff1) && empty($diff2) ) {
|
575 |
+
$matches[] = $pluginBasename;
|
576 |
}
|
577 |
+
}
|
578 |
|
579 |
+
//It's possible (though very unlikely) that there could be two plugins with identical
|
580 |
+
//headers. In that case, we can't unambiguously identify the plugin that's being upgraded.
|
581 |
+
if ( count($matches) !== 1 ) {
|
582 |
+
return $source;
|
583 |
}
|
584 |
+
|
585 |
+
$pluginFile = reset($matches);
|
586 |
+
} elseif ( !empty($this->upgradedPluginFile) ) {
|
587 |
+
$pluginFile = $this->upgradedPluginFile;
|
588 |
}
|
589 |
|
590 |
//If WordPress is upgrading anything other than our plugin, leave the directory name unchanged.
|
599 |
}
|
600 |
$correctedSource = trailingslashit($remoteSource) . $pluginDirectoryName . '/';
|
601 |
if ( $source !== $correctedSource ) {
|
602 |
+
//The update archive should contain a single directory that contains the rest of plugin files. Otherwise,
|
603 |
+
//WordPress will try to copy the entire working directory ($source == $remoteSource). We can't rename
|
604 |
+
//$remoteSource because that would break WordPress code that cleans up temporary files after update.
|
605 |
+
$sourceFiles = $wp_filesystem->dirlist($remoteSource);
|
606 |
+
if ( is_array($sourceFiles) ) {
|
607 |
+
$sourceFiles = array_keys($sourceFiles);
|
608 |
+
$firstFilePath = trailingslashit($remoteSource) . $sourceFiles[0];
|
609 |
+
|
610 |
+
if ( (count($sourceFiles) > 1) || (!$wp_filesystem->is_dir($firstFilePath)) ) {
|
611 |
+
return new WP_Error(
|
612 |
+
'puc-incorrect-directory-structure',
|
613 |
+
sprintf(
|
614 |
+
'The directory structure of the update is incorrect. All plugin files should be inside ' .
|
615 |
+
'a directory named <span class="code">%s</span>, not at the root of the ZIP file.',
|
616 |
+
htmlentities($this->slug)
|
617 |
+
)
|
618 |
+
);
|
619 |
+
}
|
620 |
+
}
|
621 |
+
|
622 |
$upgrader->skin->feedback(sprintf(
|
623 |
'Renaming %s to %s…',
|
624 |
'<span class="code">' . basename($source) . '</span>',
|
639 |
return $source;
|
640 |
}
|
641 |
|
642 |
+
/**
|
643 |
+
* @access private
|
644 |
+
*
|
645 |
+
* @param mixed $input
|
646 |
+
* @param array $hookExtra
|
647 |
+
* @return mixed Returns $input unaltered.
|
648 |
+
*/
|
649 |
+
public function setUpgradedPlugin($input, $hookExtra) {
|
650 |
+
if (!empty($hookExtra['plugin']) && is_string($hookExtra['plugin'])) {
|
651 |
+
$this->upgradedPluginFile = $hookExtra['plugin'];
|
652 |
+
} else {
|
653 |
+
$this->upgradedPluginFile = null;
|
654 |
+
}
|
655 |
+
return $input;
|
656 |
+
}
|
657 |
+
|
658 |
+
/**
|
659 |
+
* @access private
|
660 |
+
*
|
661 |
+
* @param mixed $input
|
662 |
+
* @return mixed Returns $input unaltered.
|
663 |
+
*/
|
664 |
+
public function clearUpgradedPlugin($input = null) {
|
665 |
+
$this->upgradedPluginFile = null;
|
666 |
+
return $input;
|
667 |
+
}
|
668 |
|
669 |
/**
|
670 |
* Get the details of the currently available update, if any.
|
878 |
* Initialize the update checker Debug Bar plugin/add-on thingy.
|
879 |
*/
|
880 |
public function initDebugBarPanel() {
|
881 |
+
$debugBarPlugin = dirname(__FILE__) . '/debug-bar-plugin.php';
|
882 |
+
if ( class_exists('Debug_Bar', false) && file_exists($debugBarPlugin) ) {
|
883 |
+
require_once $debugBarPlugin;
|
884 |
$this->debugBarPlugin = new PucDebugBarPlugin($this);
|
885 |
}
|
886 |
}
|
888 |
|
889 |
endif;
|
890 |
|
891 |
+
if ( !class_exists('PluginInfo_2_2', false) ):
|
892 |
|
893 |
/**
|
894 |
* A container class for holding and transforming various plugin metadata.
|
895 |
*
|
896 |
* @author Janis Elsts
|
897 |
* @copyright 2015
|
898 |
+
* @version 2.2
|
899 |
* @access public
|
900 |
*/
|
901 |
+
class PluginInfo_2_2 {
|
902 |
//Most fields map directly to the contents of the plugin's info.json file.
|
903 |
//See the relevant docs for a description of their meaning.
|
904 |
public $name;
|
919 |
public $rating;
|
920 |
public $num_ratings;
|
921 |
public $downloaded;
|
922 |
+
public $active_installs;
|
923 |
public $last_updated;
|
924 |
|
925 |
public $id = 0; //The native WP.org API returns numeric plugin IDs, but they're not used for anything.
|
979 |
//as those returned by the native WordPress.org API. These can be assigned directly.
|
980 |
$sameFormat = array(
|
981 |
'name', 'slug', 'version', 'requires', 'tested', 'rating', 'upgrade_notice',
|
982 |
+
'num_ratings', 'downloaded', 'active_installs', 'homepage', 'last_updated',
|
983 |
);
|
984 |
foreach($sameFormat as $field){
|
985 |
if ( isset($this->$field) ) {
|
1019 |
|
1020 |
endif;
|
1021 |
|
1022 |
+
if ( !class_exists('PluginUpdate_2_2', false) ):
|
1023 |
|
1024 |
/**
|
1025 |
* A simple container class for holding information about an available update.
|
1026 |
*
|
1027 |
* @author Janis Elsts
|
1028 |
* @copyright 2015
|
1029 |
+
* @version 2.2
|
1030 |
* @access public
|
1031 |
*/
|
1032 |
+
class PluginUpdate_2_2 {
|
1033 |
public $id = 0;
|
1034 |
public $slug;
|
1035 |
public $version;
|
1051 |
//Since update-related information is simply a subset of the full plugin info,
|
1052 |
//we can parse the update JSON as if it was a plugin info string, then copy over
|
1053 |
//the parts that we care about.
|
1054 |
+
$pluginInfo = PluginInfo_2_2::fromJson($json, $triggerErrors);
|
1055 |
if ( $pluginInfo != null ) {
|
1056 |
return self::fromPluginInfo($pluginInfo);
|
1057 |
} else {
|
1135 |
|
1136 |
endif;
|
1137 |
|
1138 |
+
if ( !class_exists('PucFactory', false) ):
|
1139 |
|
1140 |
/**
|
1141 |
* A factory that builds instances of other classes from this library.
|
1227 |
require_once(dirname(__FILE__) . '/github-checker.php');
|
1228 |
|
1229 |
//Register classes defined in this file with the factory.
|
1230 |
+
PucFactory::addVersion('PluginUpdateChecker', 'PluginUpdateChecker_2_2', '2.2');
|
1231 |
+
PucFactory::addVersion('PluginUpdate', 'PluginUpdate_2_2', '2.2');
|
1232 |
+
PucFactory::addVersion('PluginInfo', 'PluginInfo_2_2', '2.2');
|
1233 |
+
PucFactory::addVersion('PucGitHubChecker', 'PucGitHubChecker_2_2', '2.2');
|
1234 |
|
1235 |
/**
|
1236 |
* Create non-versioned variants of the update checker classes. This allows for backwards
|
1237 |
* compatibility with versions that did not use a factory, and it simplifies doc-comments.
|
1238 |
*/
|
1239 |
+
if ( !class_exists('PluginUpdateChecker', false) ) {
|
1240 |
+
class PluginUpdateChecker extends PluginUpdateChecker_2_2 { }
|
1241 |
}
|
1242 |
|
1243 |
+
if ( !class_exists('PluginUpdate', false) ) {
|
1244 |
+
class PluginUpdate extends PluginUpdate_2_2 {}
|
1245 |
}
|
1246 |
|
1247 |
+
if ( !class_exists('PluginInfo', false) ) {
|
1248 |
+
class PluginInfo extends PluginInfo_2_2 {}
|
1249 |
}
|
admin/update-checker/vendor/readme-parser.php
CHANGED
@@ -237,7 +237,7 @@ Class PucReadmeParser {
|
|
237 |
$text = call_user_func( array( __CLASS__, 'code_trick' ), $text, $markdown ); // A better parser than Markdown's for: backticks -> CODE
|
238 |
|
239 |
if ( $markdown ) { // Parse markdown.
|
240 |
-
if ( !class_exists('Parsedown') ) {
|
241 |
require_once(dirname(__FILE__) . '/Parsedown.php');
|
242 |
}
|
243 |
$instance = Parsedown::instance();
|
237 |
$text = call_user_func( array( __CLASS__, 'code_trick' ), $text, $markdown ); // A better parser than Markdown's for: backticks -> CODE
|
238 |
|
239 |
if ( $markdown ) { // Parse markdown.
|
240 |
+
if ( !class_exists('Parsedown', false) ) {
|
241 |
require_once(dirname(__FILE__) . '/Parsedown.php');
|
242 |
}
|
243 |
$instance = Parsedown::instance();
|
admin/view/right-now.php
CHANGED
@@ -53,7 +53,7 @@ else {
|
|
53 |
if ($gethostbyaddr != $host_by_ip && !empty($gethostbyaddr)) $host_by_ip .= ', '.$gethostbyaddr;
|
54 |
}
|
55 |
|
56 |
-
$
|
57 |
|
58 |
// Print visit header?
|
59 |
if ($i == 0 || $results[$i-1]['visit_id'] != $results[$i]['visit_id'] || ($results[$i]['visit_id'] == 0 && ($results[$i-1]['ip'] != $results[$i]['ip'] || $results[$i-1]['browser'] != $results[$i]['browser'] || $results[$i-1]['platform'] != $results[$i]['platform']))){
|
@@ -136,11 +136,18 @@ else {
|
|
136 |
echo "<p class='header$highlight_row'>{$results[$i]['country']} $browser_filtered $platform_filtered $browser_type_filtered $ip_address $other_ip_address $notes <span class='plugins'>$plugins</span> $screen_resolution</p>";
|
137 |
}
|
138 |
|
|
|
139 |
$performance = '';
|
140 |
if ( !$is_dashboard && ( !empty( $results[ $i ][ 'server_latency' ] ) || !empty( $results[ $i ][ 'page_performance' ] ) ) ) {
|
141 |
$performance = "<i class='slimstat-font-gauge spaced' title='".__('Server Latency and Page Speed in milliseconds','wp-slimstat')."'></i> ".__('SL','wp-slimstat').": {$results[$i]['server_latency']} / ".__('PS','wp-slimstat').": {$results[$i]['page_performance']}";
|
142 |
}
|
143 |
|
|
|
|
|
|
|
|
|
|
|
|
|
144 |
// Permalink: find post title, if available
|
145 |
$parse_url = parse_url(get_site_url(empty($results[$i]['blog_id'])?1:$results[$i]['blog_id']));
|
146 |
$base_host = $parse_url['host'];
|
@@ -179,9 +186,7 @@ else {
|
|
179 |
$results[$i]['referer'] = $results[$i][ 'outbound_resource' ] = $results[$i][ 'content_type' ] = '';
|
180 |
}
|
181 |
|
182 |
-
$results[$i]['
|
183 |
-
|
184 |
-
echo "<p>{$results[$i]['resource']} <span class='details'>{$results[$i]['searchterms']} {$results[$i]['referer']} {$results[$i]['outbound_resource']} {$results[$i]['content_type']} $performance {$results[$i]['dt']} {$delete_row}</span></p>";
|
185 |
}
|
186 |
|
187 |
// Pagination
|
53 |
if ($gethostbyaddr != $host_by_ip && !empty($gethostbyaddr)) $host_by_ip .= ', '.$gethostbyaddr;
|
54 |
}
|
55 |
|
56 |
+
$date_time = "<i class='spaced slimstat-font-clock' title='".__( 'Date and Time', 'wp-slimstat' )."'></i> " . date_i18n( wp_slimstat::$options[ 'date_format' ] . ' ' . wp_slimstat::$options[ 'time_format' ], $results[ $i ][ 'dt' ], true );
|
57 |
|
58 |
// Print visit header?
|
59 |
if ($i == 0 || $results[$i-1]['visit_id'] != $results[$i]['visit_id'] || ($results[$i]['visit_id'] == 0 && ($results[$i-1]['ip'] != $results[$i]['ip'] || $results[$i-1]['browser'] != $results[$i]['browser'] || $results[$i-1]['platform'] != $results[$i]['platform']))){
|
136 |
echo "<p class='header$highlight_row'>{$results[$i]['country']} $browser_filtered $platform_filtered $browser_type_filtered $ip_address $other_ip_address $notes <span class='plugins'>$plugins</span> $screen_resolution</p>";
|
137 |
}
|
138 |
|
139 |
+
// Server Latency and Page Speed
|
140 |
$performance = '';
|
141 |
if ( !$is_dashboard && ( !empty( $results[ $i ][ 'server_latency' ] ) || !empty( $results[ $i ][ 'page_performance' ] ) ) ) {
|
142 |
$performance = "<i class='slimstat-font-gauge spaced' title='".__('Server Latency and Page Speed in milliseconds','wp-slimstat')."'></i> ".__('SL','wp-slimstat').": {$results[$i]['server_latency']} / ".__('PS','wp-slimstat').": {$results[$i]['page_performance']}";
|
143 |
}
|
144 |
|
145 |
+
// Time on page
|
146 |
+
$time_on_page = '';
|
147 |
+
if ( !$is_dashboard && !empty( $results[ $i ][ 'dt_out' ] ) ) {
|
148 |
+
$time_on_page = "<i class='slimstat-font-stopwatch spaced' title='" . __( 'Time spent on this page in seconds', 'wp-slimstat' ) . "'></i> " . date( 'i:s', $results[ $i ][ 'dt_out' ] - $results[ $i ][ 'dt' ] );
|
149 |
+
}
|
150 |
+
|
151 |
// Permalink: find post title, if available
|
152 |
$parse_url = parse_url(get_site_url(empty($results[$i]['blog_id'])?1:$results[$i]['blog_id']));
|
153 |
$base_host = $parse_url['host'];
|
186 |
$results[$i]['referer'] = $results[$i][ 'outbound_resource' ] = $results[$i][ 'content_type' ] = '';
|
187 |
}
|
188 |
|
189 |
+
echo "<p>{$results[$i]['resource']} <span class='details'>$time_on_page {$results[$i]['searchterms']} {$results[$i]['referer']} {$results[$i]['outbound_resource']} {$results[$i]['content_type']} $performance $date_time {$delete_row}</span></p>";
|
|
|
|
|
190 |
}
|
191 |
|
192 |
// Pagination
|
admin/view/wp-slimstat-db.php
CHANGED
@@ -79,7 +79,8 @@ class wp_slimstat_db {
|
|
79 |
'interval' => array( __( 'days', 'wp-slimstat' ), 'int' ),
|
80 |
'interval_hours' => array( __( 'hours', 'wp-slimstat' ), 'int' ),
|
81 |
'interval_minutes' => array( __( 'minutes', 'wp-slimstat' ), 'int' ),
|
82 |
-
'dt' => array( __( '
|
|
|
83 |
|
84 |
// Other columns
|
85 |
'language_calculated' => array( __( 'Language', 'wp-slimstat' ), 'varchar' ),
|
79 |
'interval' => array( __( 'days', 'wp-slimstat' ), 'int' ),
|
80 |
'interval_hours' => array( __( 'hours', 'wp-slimstat' ), 'int' ),
|
81 |
'interval_minutes' => array( __( 'minutes', 'wp-slimstat' ), 'int' ),
|
82 |
+
'dt' => array( __( 'Timestamp', 'wp-slimstat' ), 'int' ),
|
83 |
+
'dt_out' => array( __( 'Exit Timestamp', 'wp-slimstat' ), 'int' ),
|
84 |
|
85 |
// Other columns
|
86 |
'language_calculated' => array( __( 'Language', 'wp-slimstat' ), 'varchar' ),
|
admin/view/wp-slimstat-reports.php
CHANGED
@@ -835,7 +835,7 @@ class wp_slimstat_reports {
|
|
835 |
|
836 |
public static function report_header( $_report_id = '' ) {
|
837 |
$header_classes = !empty( self::$reports_info[ $_report_id ][ 'classes' ] ) ? implode( ' ', self::$reports_info[ $_report_id ][ 'classes' ] ) : '';
|
838 |
-
$header_buttons = '<div class="slimstat-header-buttons">'.apply_filters('slimstat_report_header_buttons', '<a class="button-ajax refresh slimstat-font-
|
839 |
$header_tooltip = !empty( self::$reports_info[ $_report_id ][ 'tooltip' ] ) ? "<i class='slimstat-tooltip-trigger corner'></i><span class='slimstat-tooltip-content'>".self::$reports_info[ $_report_id ][ 'tooltip' ]."</span>" : '';
|
840 |
|
841 |
echo "<div class='postbox $header_classes' id='$_report_id'>$header_buttons<h3 class='hndle'>".self::$reports_info[ $_report_id ][ 'title' ]." $header_tooltip</h3><div class='inside' id='{$_report_id}_inside'>";
|
@@ -1351,45 +1351,45 @@ class wp_slimstat_reports {
|
|
1351 |
$total_human_visits = wp_slimstat_db::count_records( 'visit_id', 'visit_id > 0 AND browser_type <> 1' );
|
1352 |
$results = array();
|
1353 |
|
1354 |
-
$count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', '
|
1355 |
$average_time = 30 * $count_results;
|
1356 |
$results[ 0 ][ 'metric' ] = __( '0 - 30 seconds', 'wp-slimstat' );
|
1357 |
$results[ 0 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
|
1358 |
$results[ 0 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
|
1359 |
|
1360 |
-
$count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', '
|
1361 |
$average_time += 60 * $count_results;
|
1362 |
$results[ 1 ][ 'metric' ] = __( '31 - 60 seconds', 'wp-slimstat' );
|
1363 |
$results[ 1 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
|
1364 |
$results[ 1 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
|
1365 |
|
1366 |
-
$count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', '
|
1367 |
$average_time += 180 * $count_results;
|
1368 |
$results[ 2 ][ 'metric' ] = __( '1 - 3 minutes', 'wp-slimstat' );
|
1369 |
$results[ 2 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
|
1370 |
$results[ 2 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
|
1371 |
|
1372 |
-
$count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', '
|
1373 |
$average_time += 300 * $count_results;
|
1374 |
$results[ 3 ][ 'metric' ] = __( '3 - 5 minutes', 'wp-slimstat' );
|
1375 |
$results[ 3 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
|
1376 |
$results[ 3 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
|
1377 |
|
1378 |
-
$count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', '
|
1379 |
$average_time += 420 * $count_results;
|
1380 |
$results[ 4 ][ 'metric' ] = __( '5 - 7 minutes', 'wp-slimstat' );
|
1381 |
$results[ 4 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
|
1382 |
$results[ 4 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
|
1383 |
|
1384 |
-
$count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', '
|
1385 |
$average_time += 600* $count_results;
|
1386 |
$results[ 5 ][ 'metric' ] = __( '7 - 10 minutes', 'wp-slimstat' );
|
1387 |
$results[ 5 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
|
1388 |
$results[ 5 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
|
1389 |
|
1390 |
-
$count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', '
|
1391 |
$average_time += 900 * $count_results;
|
1392 |
-
$results[ 6 ][ 'metric' ] = __( 'More than minutes', 'wp-slimstat' );
|
1393 |
$results[ 6 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
|
1394 |
$results[ 6 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
|
1395 |
|
@@ -1401,7 +1401,7 @@ class wp_slimstat_reports {
|
|
1401 |
$average_time = '0:00';
|
1402 |
}
|
1403 |
|
1404 |
-
$results[ 7 ][ 'metric' ] = __( 'Average
|
1405 |
$results[ 7 ][ 'value' ] = $average_time;
|
1406 |
$results[ 7 ][ 'details' ] = '';
|
1407 |
|
835 |
|
836 |
public static function report_header( $_report_id = '' ) {
|
837 |
$header_classes = !empty( self::$reports_info[ $_report_id ][ 'classes' ] ) ? implode( ' ', self::$reports_info[ $_report_id ][ 'classes' ] ) : '';
|
838 |
+
$header_buttons = '<div class="slimstat-header-buttons">'.apply_filters('slimstat_report_header_buttons', '<a class="button-ajax refresh slimstat-font-arrows-cw" title="'.__('Refresh','wp-slimstat').'" href="'.self::fs_url().'"></a>', $_report_id).'</div>';
|
839 |
$header_tooltip = !empty( self::$reports_info[ $_report_id ][ 'tooltip' ] ) ? "<i class='slimstat-tooltip-trigger corner'></i><span class='slimstat-tooltip-content'>".self::$reports_info[ $_report_id ][ 'tooltip' ]."</span>" : '';
|
840 |
|
841 |
echo "<div class='postbox $header_classes' id='$_report_id'>$header_buttons<h3 class='hndle'>".self::$reports_info[ $_report_id ][ 'title' ]." $header_tooltip</h3><div class='inside' id='{$_report_id}_inside'>";
|
1351 |
$total_human_visits = wp_slimstat_db::count_records( 'visit_id', 'visit_id > 0 AND browser_type <> 1' );
|
1352 |
$results = array();
|
1353 |
|
1354 |
+
$count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', ' GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) >= 0 AND GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) <= 30' );
|
1355 |
$average_time = 30 * $count_results;
|
1356 |
$results[ 0 ][ 'metric' ] = __( '0 - 30 seconds', 'wp-slimstat' );
|
1357 |
$results[ 0 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
|
1358 |
$results[ 0 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
|
1359 |
|
1360 |
+
$count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) > 30 AND GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) <= 60' );
|
1361 |
$average_time += 60 * $count_results;
|
1362 |
$results[ 1 ][ 'metric' ] = __( '31 - 60 seconds', 'wp-slimstat' );
|
1363 |
$results[ 1 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
|
1364 |
$results[ 1 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
|
1365 |
|
1366 |
+
$count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) > 60 AND GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) <= 180' );
|
1367 |
$average_time += 180 * $count_results;
|
1368 |
$results[ 2 ][ 'metric' ] = __( '1 - 3 minutes', 'wp-slimstat' );
|
1369 |
$results[ 2 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
|
1370 |
$results[ 2 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
|
1371 |
|
1372 |
+
$count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) > 180 AND GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) <= 300' );
|
1373 |
$average_time += 300 * $count_results;
|
1374 |
$results[ 3 ][ 'metric' ] = __( '3 - 5 minutes', 'wp-slimstat' );
|
1375 |
$results[ 3 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
|
1376 |
$results[ 3 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
|
1377 |
|
1378 |
+
$count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) > 300 AND GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) <= 420' );
|
1379 |
$average_time += 420 * $count_results;
|
1380 |
$results[ 4 ][ 'metric' ] = __( '5 - 7 minutes', 'wp-slimstat' );
|
1381 |
$results[ 4 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
|
1382 |
$results[ 4 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
|
1383 |
|
1384 |
+
$count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) > 420 AND GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) <= 600' );
|
1385 |
$average_time += 600* $count_results;
|
1386 |
$results[ 5 ][ 'metric' ] = __( '7 - 10 minutes', 'wp-slimstat' );
|
1387 |
$results[ 5 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
|
1388 |
$results[ 5 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
|
1389 |
|
1390 |
+
$count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) > 600' );
|
1391 |
$average_time += 900 * $count_results;
|
1392 |
+
$results[ 6 ][ 'metric' ] = __( 'More than 10 minutes', 'wp-slimstat' );
|
1393 |
$results[ 6 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
|
1394 |
$results[ 6 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
|
1395 |
|
1401 |
$average_time = '0:00';
|
1402 |
}
|
1403 |
|
1404 |
+
$results[ 7 ][ 'metric' ] = __( 'Average visit duration', 'wp-slimstat' );
|
1405 |
$results[ 7 ][ 'value' ] = $average_time;
|
1406 |
$results[ 7 ][ 'details' ] = '';
|
1407 |
|
admin/wp-slimstat-admin.php
CHANGED
@@ -11,7 +11,7 @@ class wp_slimstat_admin{
|
|
11 |
*/
|
12 |
public static function init(){
|
13 |
if ((wp_slimstat::$options['enable_ads_network'] == 'yes' || wp_slimstat::$options['enable_ads_network'] == 'no')){
|
14 |
-
self::$admin_notice = "
|
15 |
self::$admin_notice .= '<br/><br/><a id="slimstat-hide-admin-notice" href="#" class="button-secondary">Got it, thanks</a>';
|
16 |
}
|
17 |
else {
|
@@ -122,8 +122,8 @@ class wp_slimstat_admin{
|
|
122 |
add_action('admin_enqueue_scripts', array(__CLASS__, 'wp_slimstat_stylesheet_icon'));
|
123 |
|
124 |
// Update the table structure and options, if needed
|
125 |
-
if (!empty(wp_slimstat::$options['version']) && wp_slimstat::$options['version'] != wp_slimstat::$version){
|
126 |
-
add_action('admin_init', array(__CLASS__, 'update_tables_and_options'));
|
127 |
}
|
128 |
}
|
129 |
|
@@ -264,7 +264,9 @@ class wp_slimstat_admin{
|
|
264 |
|
265 |
outbound_resource VARCHAR(2048) DEFAULT NULL,
|
266 |
|
|
|
267 |
dt INT(10) UNSIGNED DEFAULT 0,
|
|
|
268 |
CONSTRAINT PRIMARY KEY (id),
|
269 |
INDEX idx_{$GLOBALS['wpdb']->prefix}slim_stats_dt (dt)
|
270 |
) COLLATE utf8_general_ci $use_innodb";
|
@@ -383,7 +385,9 @@ class wp_slimstat_admin{
|
|
383 |
|
384 |
outbound_resource VARCHAR(2048) DEFAULT NULL,
|
385 |
|
|
|
386 |
dt INT(10) UNSIGNED DEFAULT 0,
|
|
|
387 |
CONSTRAINT PRIMARY KEY (id),
|
388 |
INDEX idx_{$GLOBALS['wpdb']->prefix}slim_stats_dt (dt)
|
389 |
) COLLATE utf8_general_ci $use_innodb", $GLOBALS['wpdb']->prefix.'slim_stats_4', $my_wpdb );
|
@@ -514,7 +518,7 @@ class wp_slimstat_admin{
|
|
514 |
// --- Updates for version 4.1.3 ---
|
515 |
if (version_compare(wp_slimstat::$options['version'], '4.1.3', '<')){
|
516 |
// Change column type to add IPv6 support
|
517 |
-
$my_wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats ADD ip_temp VARCHAR(39) DEFAULT NULL AFTER
|
518 |
$my_wpdb->query( "UPDATE {$GLOBALS['wpdb']->prefix}slim_stats SET ip_temp = INET_NTOA(ip), other_ip_temp = INET_NTOA(other_ip)" );
|
519 |
$my_wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats CHANGE ip ip_num INT UNSIGNED DEFAULT 0" );
|
520 |
$my_wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats CHANGE other_ip other_ip_num INT UNSIGNED DEFAULT 0" );
|
@@ -523,6 +527,12 @@ class wp_slimstat_admin{
|
|
523 |
}
|
524 |
// --- END: Updates for version 4.1.3 ---
|
525 |
|
|
|
|
|
|
|
|
|
|
|
|
|
526 |
// Now we can update the version stored in the database
|
527 |
wp_slimstat::$options['version'] = wp_slimstat::$version;
|
528 |
|
@@ -682,10 +692,12 @@ class wp_slimstat_admin{
|
|
682 |
$minimum_capability = wp_slimstat::$options['capability_can_admin'];
|
683 |
}
|
684 |
|
685 |
-
$new_entry = add_submenu_page(null, __('Settings','wp-slimstat'), __('Settings','wp-slimstat'), $minimum_capability, 'wp-slim-config', array(__CLASS__, 'wp_slimstat_include_config'));
|
686 |
if (wp_slimstat::$options['use_separate_menu'] == 'yes'){
|
687 |
$new_entry = add_submenu_page('wp-slim-view-1', __('Settings','wp-slimstat'), __('Settings','wp-slimstat'), $minimum_capability, 'wp-slim-config', array(__CLASS__, 'wp_slimstat_include_config'));
|
688 |
}
|
|
|
|
|
|
|
689 |
|
690 |
// Load styles and Javascript needed to make the reports look nice and interactive
|
691 |
add_action('load-'.$new_entry, array(__CLASS__, 'wp_slimstat_stylesheet'));
|
11 |
*/
|
12 |
public static function init(){
|
13 |
if ((wp_slimstat::$options['enable_ads_network'] == 'yes' || wp_slimstat::$options['enable_ads_network'] == 'no')){
|
14 |
+
self::$admin_notice = "Last time we asked our users to send us suggestions on what they would like us to focus on. Fabian came up with a great idea: free premium add-ons for reviewing Slimstat. We liked it so much that we decided to extend it to all our users: write a review and get a $50 coupon (to be used on our store). Just follow these three easy steps: [1] send us your website URL so that we can approve your request; [2] write a review and leave it online for at least two weeks; [3] send us a link to your review and earn a $50 discount code. What are you waiting for?";
|
15 |
self::$admin_notice .= '<br/><br/><a id="slimstat-hide-admin-notice" href="#" class="button-secondary">Got it, thanks</a>';
|
16 |
}
|
17 |
else {
|
122 |
add_action('admin_enqueue_scripts', array(__CLASS__, 'wp_slimstat_stylesheet_icon'));
|
123 |
|
124 |
// Update the table structure and options, if needed
|
125 |
+
if ( !empty( wp_slimstat::$options[ 'version' ] ) && wp_slimstat::$options[ 'version' ] != wp_slimstat::$version ) {
|
126 |
+
add_action( 'admin_init', array(__CLASS__, 'update_tables_and_options' ) );
|
127 |
}
|
128 |
}
|
129 |
|
264 |
|
265 |
outbound_resource VARCHAR(2048) DEFAULT NULL,
|
266 |
|
267 |
+
dt_out INT(10) UNSIGNED DEFAULT 0,
|
268 |
dt INT(10) UNSIGNED DEFAULT 0,
|
269 |
+
|
270 |
CONSTRAINT PRIMARY KEY (id),
|
271 |
INDEX idx_{$GLOBALS['wpdb']->prefix}slim_stats_dt (dt)
|
272 |
) COLLATE utf8_general_ci $use_innodb";
|
385 |
|
386 |
outbound_resource VARCHAR(2048) DEFAULT NULL,
|
387 |
|
388 |
+
dt_out INT(10) UNSIGNED DEFAULT 0,
|
389 |
dt INT(10) UNSIGNED DEFAULT 0,
|
390 |
+
|
391 |
CONSTRAINT PRIMARY KEY (id),
|
392 |
INDEX idx_{$GLOBALS['wpdb']->prefix}slim_stats_dt (dt)
|
393 |
) COLLATE utf8_general_ci $use_innodb", $GLOBALS['wpdb']->prefix.'slim_stats_4', $my_wpdb );
|
518 |
// --- Updates for version 4.1.3 ---
|
519 |
if (version_compare(wp_slimstat::$options['version'], '4.1.3', '<')){
|
520 |
// Change column type to add IPv6 support
|
521 |
+
$my_wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats ADD ip_temp VARCHAR(39) DEFAULT NULL AFTER outbound_resource, ADD other_ip_temp VARCHAR(39) DEFAULT NULL AFTER id" );
|
522 |
$my_wpdb->query( "UPDATE {$GLOBALS['wpdb']->prefix}slim_stats SET ip_temp = INET_NTOA(ip), other_ip_temp = INET_NTOA(other_ip)" );
|
523 |
$my_wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats CHANGE ip ip_num INT UNSIGNED DEFAULT 0" );
|
524 |
$my_wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats CHANGE other_ip other_ip_num INT UNSIGNED DEFAULT 0" );
|
527 |
}
|
528 |
// --- END: Updates for version 4.1.3 ---
|
529 |
|
530 |
+
// --- Updates for version 4.1.7 ---
|
531 |
+
if ( version_compare( wp_slimstat::$options[ 'version' ], '4.1.7', '<' ) ) {
|
532 |
+
// Change column type to add IPv6 support
|
533 |
+
$my_wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats ADD dt_out INT(10) UNSIGNED DEFAULT 0 AFTER outbound_resource" );
|
534 |
+
}
|
535 |
+
|
536 |
// Now we can update the version stored in the database
|
537 |
wp_slimstat::$options['version'] = wp_slimstat::$version;
|
538 |
|
692 |
$minimum_capability = wp_slimstat::$options['capability_can_admin'];
|
693 |
}
|
694 |
|
|
|
695 |
if (wp_slimstat::$options['use_separate_menu'] == 'yes'){
|
696 |
$new_entry = add_submenu_page('wp-slim-view-1', __('Settings','wp-slimstat'), __('Settings','wp-slimstat'), $minimum_capability, 'wp-slim-config', array(__CLASS__, 'wp_slimstat_include_config'));
|
697 |
}
|
698 |
+
else {
|
699 |
+
$new_entry = add_submenu_page(null, __('Settings','wp-slimstat'), __('Settings','wp-slimstat'), $minimum_capability, 'wp-slim-config', array(__CLASS__, 'wp_slimstat_include_config'));
|
700 |
+
}
|
701 |
|
702 |
// Load styles and Javascript needed to make the reports look nice and interactive
|
703 |
add_action('load-'.$new_entry, array(__CLASS__, 'wp_slimstat_stylesheet'));
|
readme.txt
CHANGED
@@ -4,7 +4,7 @@ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_i
|
|
4 |
Tags: analytics, tracking, reports, analyze, wassup, geolocation, online users, spider, tracker, pageviews, stats, maxmind, statistics, statpress
|
5 |
Requires at least: 3.8
|
6 |
Tested up to: 4.3
|
7 |
-
Stable tag: 4.1.
|
8 |
|
9 |
== Description ==
|
10 |
[youtube https://www.youtube.com/watch?v=iJCtjxArq4U]
|
@@ -59,11 +59,15 @@ Our knowledge base is available on our [support center](http://docs.wp-slimstat.
|
|
59 |
|
60 |
== Changelog ==
|
61 |
|
62 |
-
= 4.1.
|
63 |
-
* [New]
|
64 |
-
* [Update]
|
65 |
-
* [
|
|
|
66 |
|
|
|
|
|
|
|
67 |
|
68 |
= 4.1.6.2 =
|
69 |
* [Note] Yep, our team is active even in August, while sunbathing somewhere on the US East Coast.
|
4 |
Tags: analytics, tracking, reports, analyze, wassup, geolocation, online users, spider, tracker, pageviews, stats, maxmind, statistics, statpress
|
5 |
Requires at least: 3.8
|
6 |
Tested up to: 4.3
|
7 |
+
Stable tag: 4.1.7
|
8 |
|
9 |
== Description ==
|
10 |
[youtube https://www.youtube.com/watch?v=iJCtjxArq4U]
|
59 |
|
60 |
== Changelog ==
|
61 |
|
62 |
+
= 4.1.7 =
|
63 |
+
* [New] Added new column dt_out to our table structure, to capture when a visitor leaves the page. This allows us to measure things like time on page and time on site. Please consider purchasing our [Heartbeat](http://www.wp-slimstat.com/downloads/heartbeat/) add-on to increase this metric's accuracy.
|
64 |
+
* [Update] New icon added to our custom font package, and removed unneded font files for faster loading.
|
65 |
+
* [Update] [Plugin Update Checker](https://github.com/YahnisElsts/plugin-update-checker) version 2.2 is now part of the package.
|
66 |
+
* [Fix] Bug preventing the stylesheet from loading on the Settings pages, under certain circumstances.
|
67 |
|
68 |
+
= 4.1.6.3 =
|
69 |
+
* [New] Polish localization added. Thank you, [DFactory Team](https://www.dfactory.eu/).
|
70 |
+
* [Fix] Bug affecting the admin bar: permissions to display the link to just administrators were not being honored. (thank you, Nils)
|
71 |
|
72 |
= 4.1.6.2 =
|
73 |
* [Note] Yep, our team is active even in August, while sunbathing somewhere on the US East Coast.
|
wp-slimstat.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
Plugin Name: WP Slimstat
|
4 |
Plugin URI: http://wordpress.org/plugins/wp-slimstat/
|
5 |
Description: The leading web analytics plugin for WordPress
|
6 |
-
Version: 4.1.
|
7 |
Author: Camu
|
8 |
Author URI: http://www.wp-slimstat.com/
|
9 |
*/
|
@@ -11,7 +11,7 @@ Author URI: http://www.wp-slimstat.com/
|
|
11 |
if ( !empty( wp_slimstat::$options ) ) return true;
|
12 |
|
13 |
class wp_slimstat {
|
14 |
-
public static $version = '4.1.
|
15 |
public static $options = array();
|
16 |
|
17 |
public static $wpdb = '';
|
@@ -138,6 +138,9 @@ class wp_slimstat {
|
|
138 |
// ID of the pageview to update
|
139 |
self::$stat[ 'id' ] = abs( intval( self::$data_js[ 'id' ] ) );
|
140 |
|
|
|
|
|
|
|
141 |
// Are we tracking an outbound click?
|
142 |
if (!empty(self::$data_js['res'])){
|
143 |
$outbound_resource = strip_tags( trim( base64_decode( self::$data_js[ 'res' ] ) ) );
|
3 |
Plugin Name: WP Slimstat
|
4 |
Plugin URI: http://wordpress.org/plugins/wp-slimstat/
|
5 |
Description: The leading web analytics plugin for WordPress
|
6 |
+
Version: 4.1.7
|
7 |
Author: Camu
|
8 |
Author URI: http://www.wp-slimstat.com/
|
9 |
*/
|
11 |
if ( !empty( wp_slimstat::$options ) ) return true;
|
12 |
|
13 |
class wp_slimstat {
|
14 |
+
public static $version = '4.1.7';
|
15 |
public static $options = array();
|
16 |
|
17 |
public static $wpdb = '';
|
138 |
// ID of the pageview to update
|
139 |
self::$stat[ 'id' ] = abs( intval( self::$data_js[ 'id' ] ) );
|
140 |
|
141 |
+
// Visitor is still on this page, record the timestamp in the corresponding field
|
142 |
+
self::$stat['dt_out'] = date_i18n( 'U' );
|
143 |
+
|
144 |
// Are we tracking an outbound click?
|
145 |
if (!empty(self::$data_js['res'])){
|
146 |
$outbound_resource = strip_tags( trim( base64_decode( self::$data_js[ 'res' ] ) ) );
|