From d11ff2677298a63ec8c4f8c848a9e1e1d859e4ce Mon Sep 17 00:00:00 2001 From: Oldperl <44996956+oldperl@users.noreply.github.com> Date: Tue, 23 Aug 2011 14:08:57 +0000 Subject: [PATCH] images and localizing --- _psd/statzR_small_sfnet.psd | Bin 0 -> 45570 bytes _psd/statz_small.psd | Bin 0 -> 27632 bytes img/statzR.png | Bin 0 -> 6725 bytes includes/functions.semr.php | 473 +++++++++++ includes/functions.semr_template.php | 267 +++++++ semmelstatzR-options.php | 17 +- semmelstatzR.php | 1108 +++++--------------------- semr_image.php | 25 + 8 files changed, 997 insertions(+), 893 deletions(-) create mode 100644 _psd/statzR_small_sfnet.psd create mode 100644 _psd/statz_small.psd create mode 100644 img/statzR.png create mode 100644 includes/functions.semr.php create mode 100644 includes/functions.semr_template.php create mode 100644 semr_image.php diff --git a/_psd/statzR_small_sfnet.psd b/_psd/statzR_small_sfnet.psd new file mode 100644 index 0000000000000000000000000000000000000000..b58221f53bd9d48ac3cc096ece54073bec989704 GIT binary patch literal 45570 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�(A@W&nNcf}}N_<3yQlCgeG;pRNF)-LrGH|4!bl?y}G|1hM7-VNC8PwfS zI>^!x4K^?&1|vhs;I{_S!Q}>M$WsGiNUnio$Xx^Jkjn;W=vf0|=rIGy&^-pyp_>g5 zvC4oT78^*21Oq7{FhIUx288c41Bvf=1F5gS0rK-PApD#SBz}Diq<+>0Xqc%1F-*rm zGOR&gI;=(?`9Ieu{2%E{{4@2X{x|i}@QeDy@KgGd;fM64!*}STfc5%Bz)F2dzirPcmLlPdZ+%izd9*B__Pkl}vc7 zE1i(7i@x|nm-yn6uH=g|y3#L>=%S!qxD_fC(=BzR(+zac3{snz@m5Iy zv)bsZW7@=5d$c8AZPJ#0wMrY!TBJ?PO3;?f5@<_jg=wRZY1%}{IBiLYzqT~QM;mdR zwFyoiZ3(A~wv=P4jY4&_iO>cuNob9hG_*tug+0*J~l(N-csnUrWLhYe{)gS}1&$77;#4OAOBzmSp$HExBEmsS6466T8qq-u zMH*=lku)tyrRvXX(K3K&FG9zzm!k0Fh^%0RQvF^JheG9Lpmphf%rTI!Jp2M@Fy^&`~U`u9>gG`T^N#RTZS~cD+3A48H7NOArZ*wQo(CF z5|+{l;bXc)m`#@o|DdCoOLQXUG+h#Ngf5NQNk?-x(uuj>&?R#vbm`oAbR?QXCqx{& zL^Opi6^*5%SU)-u>qVEuI?|=Fz352XiB5=_bcvWjmx}9XD6X1D#1+vbaSv$HxHKA? zcb!JeJ5Q6$`%Nt1ICO1XoGl*>qx@(Yrt978B| zHzHCuAxY{gBu!m}(EJ2M%#TKr`C&*pA6|1>Fb)w5{E=kAt@Lap`_JAGuHz8;Q*8#y zM&8mAOTCa}3mo>}w&V8#+G`UI$1h&|zp{T!5AEsZbJ%~zeSojo=dHB{KGru|Oa1rz zKBkAy;r|);?&s_9`8s^=1OHupAP?E;;#bHqR+g9~Tm1LWGM`)cSp%On@L2=@ zK4|_1f>ylpO9A+U75dmsJ^iBkut0MF#OmQ#^=GrOn|foh&F2kFa0I;n7#oA%!<@%! z6K&ZhdOZF(UK<$$EE6PzFBYgjkN&~84_aR#{7nee7q%>MJ==b@fQnar6AIoBQht%E z`HMyj9RE*#(TKoboq&z-Q=Z}L6Yw4XfBKh3{`0@jEz#^M{_|HPjr@E~G`uFVw152f zzjRIh@ph!iKDR`(-gSrk=YMcby27t7y!~PiUtP3=qa*b$j1zLEK4R{Q*vK7uz|RwY z?y!46hzoo#(Y@8r1wLfu0zWpSbB0{Zp{*>`8^O~VNK0NtR?A;D)Sy@OugN#^xAJ%7 zdwH#*uD)L0@K9utY3OUHhNrjfYu>qH-C~uZVP$&5-^0oX8`IdaA_rA8auC}(mu1-;ppl*tC zdPQZW9CB65HNK(0ep#s~H>j+B`Ld?w<*Qe3>l*6i^FUcCk zt4?ogUl(UzJ9S{^_O07@@7}Td#~V*x*VkixzaY!xAg$D^O8Q;>+vmC0e%$))q6JG< zu2`~s^O@`_P{W7PikdF3Ucak1|8IG4qm><|VE=o>pF43%XP0Ew6xo8KJI( z^~)O2((8A1?_a&hzjpBJ_!x0=a(vR7pEAndzgN7Kmy$2!P#F>u(5m3d;j3)*=KY(R zio$z8uU`-q#6)#`EegF1VbydOb9W%6ROr2q5M(&wcwUX+!WS5}oi&b)muub{l9rlRQK&ExA9#0cUSf46<__ma8s z8-C3#EK!u=G|s9t(6_29pWZsLd+#rQJa}GFoO9*ing#P>Vv@eubN7AcBR32u;GS!Gpuc~RQ&HHpdVj$O&g&%L~V#XM15eDdOrC(<9^*}rtbx|6a8 z1vpWmqKH;pqQI$MRFpmY^UjIyV!sNRx8}gPD;ExaGnW?;le~1@zTaedw@+-_wEtqp z!)K66QQ%rwR8(ACQd(YKQSto#wWHs~^QO(<&tJ2B|L%3EQ6ZsGiL3XXI`_-zlP6D~ zyDH0jTv%LEq9|}urg~9cQC|AwkK?OixgoPcXN!^+uUxhuHZn9cBI)~+7f)>ZdgG6` z{(So6X@R`BsiYTW&!6VpII>DGebRJJSSTkX6u!><)huq5X!-76&+SQ!TyQM!_4^83 ztD+)#flFagNhy?5oO9{mH)77@;OVnwP6--2deq1O|FIzn-|qSO)S=Z;GZT+JeBV%2 z42cR08w>1pk(}z+ zWep(jP*_y_G%w@gj?~Zz<0gef#U;!Q4IT!MC3_B?BwDlg_<;?JVrGTTKb&4xRr0j4 zKwi+lu%O^^`o*K)#Y`UVGr)hEc+IXKmdyUb$I)d}Qqo%l%I3`;KGn0{dzmNxci2Ddp0Ngmksl#2Toh`OYX%4!hT4kB$3NWJ(N~jQS`X+ z3HijS;Cb<%H;*m*YDf=rt3IA1XQggGd+WxDtt%4eCU3rQ=Ww`-jVDi%1ZfV+o|hNq zH$G-R$uD?OlKtz3D1ZA7%no+LdCPYlJ92Q(){W~nZrOS8r~Qj2IQ7QmfX4RUD=8~@ z)R@oCfAp-hIP>%xp1&ijdw+k; zzIyJgh~@i_Zd(*9PECbBo*Fr8{&#D?PM9%-N|O*eD|z3YqSB`i8Xq=3aCrFSS=PC& zOTRsQ>Fma+;2Gl7IRX9chH#P=ElK1M4i5fNsqr|$?ZW3z{%m}p_>;_Ycv$%2*}YRc zwjKOwNAg7fFZc;z1FSnb1q+i>#4~()_a4GcjGZ|>Vb86ClE-UbhJa}4|pMLq+ zmX*oj!T!U7qGD&dTbbF7pEEB(ILW0;7tfg@{^a1fJ8nRN`;B>x_Z{*cKD?iC=eKQ% zGe-K2oXCw!iWp|w+h<1H0!jR=A^rOKh9`<=%}CsR^GVU8+{XKjIrh1E_j5ASuO3_y zIc*wGB>8rYBy4=(%!F^&t^YPLWWt2d`KwnZCagaG$D^kY8gd$P>~intWTf3VvwPi& zuh(wgeem$E)r%K>v+dBa-%8KP&1%SQ$Rx9LGSlzfxqbVN;vSMI z(zIpw?%us8lcyFMyiZqTkeMh; zo{2IPkQ3~1R%DSGIOKi0TvnS-W}r-Y2BIWEnmW@n($nSOCe!LcrXj6ShSKU}q-uYk zCcl>^!#jYQF7WGv98gbyAblxdgQ1N*K$HFu%5E3bumQq+2x^*PO+RD}pL^_zx>MkW zUROKttA@Y=)ZnhRRObA^-Gu&$yYQAz`zV#-xj_+ew6>Lu~@g{IiQz% zj9&1>Ue^}8WZb)(o|)AeyR?#1yw(BSQkZ?~qT(#=*K>;Bbk5(*E2D6W8aLIeP>U6y zmLfnc2X}4%VaFaoEkE6S@~XZ;(FCxRg5;|XfI;4t=3e`0`>LgjmVL8w*~%?vb1Q2< zBKfZ3$-Of_EK3l@r=}#NtobRkqP9*^t1cWMBeYymgTYEo%_{&aHD&qN53foT#m`So zOkH~-tMdIj04pj$)=DA`6pgpJjZEk-G? z0i`_6{{7$@Ny?(-i&GbT_hXt8rBHB8UcsoWss`MqQ}c?#D2lfhmHD^N?peEZe(IuS z3lrj(ANZq?!YC@t)Vrdxs^(>N#fx$Zqrf$NcKgT8OHxu6EMEETl6cXA?Ux@@7zL*P z{x8bPFhIe0<7L^?>^m~RC@*U&iyz(mah*gIldyE%&i$Jg#U_1!PKi+qPN^^oAPqzTF1w2Amz9+z89%R0PF;We zYVPB_tB1ZxjEhf9UAE;^#*=#omn~R-N`+AX9n+qdDnJQ#uyDS3`7RYk`Lh|L6uAI?DuY|BH1Epc)$!bE zQ@#qF^=0t5F{4M195J4gxN6T&A7Ydu`;r&s66E?d8PsbY~qYm8FpR8&&(?CJf>`<90TMsaf)I7M>!`j!2F zQ9OroH=aAu4n`?(Dtca$pL_GrqFIA&`%oBV)!CdJj8Vo;Rbmu}HW-Ed>}lbP=Xp1e z14dz)S@rRPseI?zTh}p0iTNl-c?@Z?f87We#mcyYT>x+S?&C)e?*3Ga(%nXhQ4VkU z1dQ@biBSfsFv_}>pMX*F?`Pa-iBVEgqyGtvQu_4X>6RG9rwv9C&72;;`=%13DDuer zfKmz`wMHp!mMu_<#|#RkY;T29@-puNN|}jKN|-n)!mqCyr3~)ZkKn0MN^w3$DFAE! z{4+NzW}RiYB5jGqv;VD;A+rQFVc_7Eq?wZEU2mzzc5l$GDC z+p_2I(LHOIEMC1GaLVEBs~0c%ZqLy}+kZH6LH6KLUPEqU4w-A4mz#O-*5&i(&iwN0 zZx=6Lz4R-FC(W z^zQ*E$w*I2%gB76U7JPAOjo2~xX}QxqcKwfPz0ni-)Gfk=4aGqz6U^32cZaHikt!~ z^vn!6W4KbArbw>?aKp&R%*>EeNQEj0BNbVF+PkzjO&EoqCWDYWvO5@~VB)1WV3Iz7 zP%t`iQ2j80;tm9h3q`sp$rntoxI=jR7zGnAO6sLQ;2w-odLSkyoBoPi`O7$pOu(~T zGfrtsyI?$k$&tUOT-1`Saf-GQrzlixOIx9qTuXH;t_4*#v;`}zxE3W^0bT)7=;&{` z7K*-UW@Y|@X~8G}Rn)g&S}Pn{X4$rC$-<>8 zS1w(#6*V23IhLjK=FUq2&SdqE>E#%;C|=NECYJ-*gX^nAEzK0mp>GmE zJS8FdyPq>FFlteh(qST(LjscGr&@C?C)P_6Qx`9uzi8vB?8-N<6*c5@Mkyr^luWr6 zKnx(Cs;sM9@+=2dFGyavY*EVmHGp6M$5ttx(}DlMJPyVrm=t@d#4t*po^D_uoAo~~PRn-+0#pyq- zO-iAdmit!@ew`qmmyoh_^XbedcMmk97^QJz{etMQu-Qqg_bV|>GtVL~ zlo!!TN)_e3Up&42(`s=zCnRikZ1R$?moJ>h59dZEZamqVWWfm>0gIGAyMOEG>X?~R zW`=TsVhIc9aYHz~IkC&s=%txqX@pM}VS=TyB=_>6RrA88PMXO9@Dey?^r#U5fguU2 zcC`au3Teg9fjE0~b?;JPSjendT%HoUczL+{0l)IgnO6KtLm^qx@7bT3zwewM7Bqe` zXHI-lEN`N}7u&^iXuH@2sH|=Ug-*C+vViu=3t5iBNw1pq*pGU`T6J5 z7cNuC1u)FTD^iSHGIHd}e zh0H=3a)2+508r`yzBFcFc=86^WM($Sx72?GyfgspkyG4EJMcx3){y=_?R67;d9Q{p z9pN9wJ5n?Xwi4k#yLCq0;msg_ML6=WLo|Q08hm(<4-iZ$@@eFedPK_)hj7vj!bvwO z9MQ~32q!@vk?+6(s3p8gf%-u*vwSk&3@1NNlK#j)pE{D{iYjFc@~7NRDE=<|J=OX1 zD1QYyza=~$Z8>kYA|K_)BRE#Yn^oOa#;Dvhv_($#J8$M+g;03@it~tszgovt4?mKR z!}7N%W0Y=qBIIs7lx>DnY2|O(f-7fCnpKhcRp+-H0r7Z<(9Ksmkv^*ON9f23v}KDN zS>=aAZBTsG3aH@S_$^zY9Df`^Zh>Y(lW3qAWCsPs=OeSKc+$-c>XN?#^71Fcq4Fz8 zRgBUN%B+&3exw_!sv?izIv*j)^T>_N&#wwMBdhYE_Ee0@4O$L&Yk)Eph~^e92UYtw z;vn#v`NO}8edJM+Ow``*qtZ5+?fgC}O=h<9Q$5;(pQV`q|Ds5FX(~|c2%y*ze$CcM zH-N&fu&a;Q8u_uG(i+JIOJpZ14F=W9Uw6tD`!RB`Id^4Am@rhQ{P2uRaRdn813PKica+bKJ?Z>NN8Kd@7F{Ft3m30qs6DLa15OxadgQPa5@LASM1HUna% zk+R!g87besRfF4BM#_%u8!2mQl+rDYlwDhb=Qc*lswyQAZegVC{?|sziVBQ`v5~Ux zCmAWr%7BV0(a1(wTG}GXreDq++h51FqwMsEaH;U1*=4e#Ofxqibk}_r%n$856y)g?7#8 zDolqXGv+GO9>;hEr!j?Bm>|lKrKJVSk)4-x6EjVgVjbcoL(;S~cqe{S%5ZBOW*xMN zDU+pi-ONl&>l&PvW^hj?vlGZRSxaR>a-?M)6qLeL$c&MciL9AkLBnM-YXL;)Su33~ z8K^|Y+$56?50M20$z@j7DJj-6nSdE$hcgNalF85}96<(=G6n)c;75@{W(&m%tYuQB z0PWw8q%!Le$Z!)%39*)iAXNTWlH8w%@?+3wFEc=v(rbcmilU| zB_I@#YH78kkjw{G%eHbKSS|HbR!b06p(wT05@VQltd{jna7%5q?DP?MKjYRU>42nk{GjSWRz@y zSw77oi7|^t=17cLG_pnhtC;1}Es=m(G_ymhG0P|0Apx^!W`~3X8rdNmb4g9?kPSKV zY~6j|e!XIc$_~lceLcOkA#(RM%;q&@)A!!WmS-Uwg(t&iS{h|bWO#m^sj^9unc6l# zW`LQoA&YMF6FfhqZ38slbsNAgHrD~W*faq5N4Lq$1oW~J@C8I=-te^Xym7-OBV(M6 z&EAaNo;EgnGWXipi0m_P%(e90Ha2rXRFUSC;+vL!EpS|hrzm4w_)5=o-nbhg&veh! zbdhI<{rv0pe(4Ys$dlQpT($R2O9OK$Pi|uucx9)(Ot!)!CQxQ`B`wWHCfm7Un#WH2 zG?@pNitz+@nkNqu$aH;EWIH{s$hdMFEe|etg*`wQn=AG<9`=FUX)>8d3Pk96D4iII z=-Ka-$)?4~xLiOk9xGOO02H#1@s-JZQ@C82%w{K!Ai02CY(Nl@iwz(bC^W@GcEvu$ z=IBwID>9E5$Zx03iWm=BjEyRWa#P4f)h+Kky)&%kD^k6JM)CI+mS zb#;^+e#A>{#QZ1`L!pwEM$C`WFbw=GP)i%8iiK%w!vtKSvNbk8Sgz(^+SoALind~4 zTH7!I!>DpqS}ptm{mCXvZOo&TfRPmVnol%XDtQr&%#}zpYb8A6 z4hi~eWUV9%oi#O9lA72m0mNuzs{|0EnWYjyOtFI|W=a4tn%O7;#As%q1Q4T{b+QGB z`83lc1~D4hCEFuj{?aJNj|{T z3;7T*jW!AJC7T5JLS_SeA%S`!De9%L5x`3}nVC~Z*5%|t*lUt}l969Wl8-Z=kYrh7 z29C)}2b(#4_y0VPdm4$Wb6|Zy3>eA~<(#z^H8lPu3zDtLgR~2cE z#aZCS&w5qJNxN4W4;y8&g4)toG7=tBCuOpS1=Y0=8`EU9gCVfCyu6?hzzdntNY*yKDzBEwYKtL4uU6@#z)RypnXI~02G8rrtZEAiYGtzG z#?rSk+1ujsa+!>Lh$FyOAY+gq2;hYT@B)Pv*UB;)i^;q^GDB8d3i&-G3rcHcrKBo` za#P^tVIzPSGEdgnNLB+4BdaFKSF${^wzjb#gKVsYmQgX3n*uKdc>rD>0$Rx{0Pup_ OPAkX*FLq(@^8W$$=12zu#|m(g;fQ+Q-Z6XJ_a4er4YK{@(As zH*aRAxO{pe5+Qz*z>kr9l?Wfhmh|`H@|rs7NK(LceKt}z0+Y;R#!c+>+Z}C8$kxoX zy1nBwj&FKC!{&C5&zN0MN7eZ&7?-=cE5I~%O>1&=wK+bW9GGNGnv!%45vMM?tl*VVcLLq-?c6LWc zM^;B(mM_qnol{a$l1=4i=jLWYi_G9MZ^+)6=?xBt^ASeebGo~EgIR>9EQhZ>+dU^c zCyUC46RB5IJRgJ3gz;HVz1Nb)}U)N4TBwhH5G&@Q68m z4mhpfYiVi53^ZSafpOUv3?X2^^pfgGQ40H1(lViMS#pY$Rb&r45#LKq%8=#4eKPngmbyFZB_{lwCT*%wc1sJ? zcwjG&_Tnk`ue-aOl1qlZ681uy0z%2`p^!1pK^Y-GLXiPC$st@lU{&OY)DdLx&hp4`EL~ERG=b+QRdqw;v-2d?4l#!ax_zjkOl=&2-)G=g%-kb zI~;r9Lq;Yod+&r?Bc|cA^Rv;bMehazIm#w3dcz((G!{q>*)*>+Sl_(Z0i|fa21h6d zN`(0)pWo*3d0U}Owy8`@sCT(MT@0$sRObZ zz6w&Psq8hjqBYgOzJMDNql`D)4t=zf8u94$ga&1uJsk2)X1q+m9%7t8Kuyd1 zOti6@Z;UCprl!5s20#C7`6c0ir)kohCOB0TTnv6+N?ov(=|hp*J)tIhYag24!9YKz zGgK3-ZmOHw3^`gnpi&_BX{>Vj0$pVucdLMuffv47AVW`ulWDPsJs~($EoB0s0h-Se z$bFk@np-P;9$%mrxF&x5^2yy5&;?ENc`??ikk4Nq4h0!OF>syQ1B!G3RomkdZbk z5=C~yniWM}5={gyWg@Zx!+4W`a8j9Ep;W0gqW+cOJ0wD-5s9QCiC8L@Ddb9-M4Jbd zCW$o7oFglnVYj3&xh7X`z3u)d%7>4LX?USIFF$bY+ZBqDw>O^n$kic-gl}hNXs!xfrBOK7Fq5!w^=aM1oKahlw$@IqY7Sp2bg#;&N*pjVTjq=&BDbw$mn4qvI}V?Pa{aq7g9V^5B`>&wiICs&`E_vTw0*!i!IIdd$0%NNxPXFc~y-R`<$Tb9=S za?}SpFSGu4_rKBh^}P56%*NTXBBFIMV8*Y{M$qJ2&&K-KUw(2`{mlZ6Bd1@uHDBTW%%7A18b zFBXlCwgGn|${|h%uhM`hxBGbY8aHt^nC*MvyA{5$3dx!!zhw2@cu*pS|C~x4Cd-xZ{_V6!C z?ae>f2W(rgw4=m5W0S#P*N10>rtW|*N6sL$z}CmeQ$%7i4n!9)8i_ExzCe2fjlpgI z9_=t1$2OPp)l|E^aO1Bv0NxzWl_%_V!x+i%)c{{^kQ-JWf(9J1WPGE`}BWghayVmyDLF7h1MjpWh8`ig3%Lh6goW1T`C~g+=5C zM1?+41U>d;0WwApf@D^I0D?SEgF_Hc6lfI8I>bYWM-ZcpV9nyX%Si2Im{VTgu(0JH z;s&r?GJ>K89;H;<_(nzb!A>}2uOOnH{^yW${uWV*@=d$CwXzOT4@j2L(Y&L zWJk7f<7~F9dXsapVV94F#cG$^n_FP+b zl{*j&O$7mJyiT|YZlkg&TXti}9tia&O!7K=7aQRL2Bw^8@dcP@2TUky0prA%%OFOt zUgmc(UI@}{p+K0iWp|gIvwZ<)qq~c-6=DtW;5Qw};L`Qf2Q=nM;J{i9qNz2B=h7AYfkx4R{3_(yAe?`k`8dbq*A3D&uVpxdipf zC8}5xoZ@qP?ady>mJ_vi#8!QWt?Omacs1=I^sco8p9$8NdxR;1zsWVfhQN_4Y>#( zJw};l=K{;zqw-PqdI&>nU}z2WQnX9d;s5wGaA|%dH|j@ltY718@kLh$DF*Ak!h&mb z`8qI7DC1+|5{UW1r9KuO6D|?Qezu_3P=hc?{RSb{6r0Ry2B$-te0WrBPz1Zo8wt2J z;jcq%`QR~vOcnSg-ini$l~@%#8%Mnq-~80nJSJc#v$dC4h^ z#_xPskFQR!QK!J+U`?rjOEHk12~@y+4&sFxnbzLX@g;H70G^A%qk$S>ru%(>L=buhN#tP*&L89Ua1-3@-BRjA0zDlRSoPc;AtLeqYu;`zi^ zf7pNE+X4f+WDusp=fp8sc1^Gx`#mof5XT+FqYBLPQO2O;7DBE*3PiNA4~2LA;F57b zMs^tGesNk)n1y4iKFTh{d1UqSw}oKVG7GY(g8ae~GJSYJa^gB1V$HJ^WA|$%_D2*qBieqM)#_TZoIq3M8HIZ-u)*qrK7o4zLShVgF~KEv!9Z zr4NiYs7b#Ftq*0uLUx7E*X9;he@{+3dI^KAuCUOi!&Om;mF!gKdH`EqtA9a8_NFAe2Q)j3zsjsN7sc#~ph%BOtXe0VaVk9Xt zEHXZ_fG~s?CC<^!AC2ar<>*25Yg@c6nNm_}N=xY}BW0$n5lKWEQATW$DVr$MCD_znWoJ@GIO z{C`MB4f^-VsF4)pMKWr+a4`|Bx*(;7>%MeAO`g)rL^a@=@bh|ZySg5FDAYtne zuB3Wa7G4(QMq1AWI|OUFMMcG6=E{ON4~he~-24(~i2p>22~<{IZhjG*29n2of&fTG zxo~$2+PH%ud`;Qp6Z9-v2jg{Tkl_{^T;;>nKU`!}1to9?uDhzq<#x2eB|Idhv#26C z4+Jk2Q)>APG3jLY2sxBl15tZW?HAfK0c!2wnu2H=>^tC|r;penFFdl+_)kT%0N?5B zg(g*43}W>{lPW9(LT@w+i;7B0E`nxZNnT!W$oilO*XtKUGrt&5>i0#H*!D2o$mRba z9nD=86hoE*RH&z-7dLtM9w)AB9=K1GJU|bKNIU>X^dv>(o@UR)roJ{ZF7=L)M^mmE zxg}-v$h%Tbjqs*y9#N69W<)|t!-(U_$s=A$J~;gD64SB>B&iNrhT5cF74GsXWB0lv(kcz=WNx9TWqO`H``7n%(1$7(vM&Bn ziz9xeB{RO!axQL+<;A#f%s0pFFwc(LU`~%)W&SL7rg>xRW#(&Qk-0YZJyUG#W2QYZ z*O)fM%rb>z#+oL^h)wF4_l-NOzca44UTbt)=NR*>S;lWH6603OUk$fges5S{x!#ar zxzg~tIot3jv&^vCyh}gB{J1{JyjuUMX`cRZQ;vSQNv@w{`cP*u{ZY5exJLJoae>Zf z%+-|`l{$&>Bkgv>liIrsYqbu;RoYBLzV@tMt$k7dvF4}xr!}+nKhdP=7io^@3N;(y z@kCbliMm#|Q5~cEsd|sLS-nA9qz-9y>WSLD@Yv)3s&;5@QLWcFR4z@4Do>+VeXZWF z+^T*~dAs^n<$N`x%utsqPpXW{KdC-dtX6GOOjq5eNK&;Z4k*Vd9#@(bUCM*gcD*L%~ zmaI*hCM%O3k;Y1&mVPE-r7udRNPi)Tk+w@dmXu3=BZ-%UB*(-PBwNHP$vW}7Vy}3; zxKivACyH~$$3mJ zibUJ2wCF`ED|*JtiGF8A;s>m>_%16ezQxLkud^b_GAk|dT3LzH%1P#0k+j}QOD9=b zX{nWyQdT4zX{BXJR#s-Rax%FU$-lDD@{<-;e$c|ncUzF+9Sg14YGD3sU~Z zLMzu>Smm7-PPx{CRI4nsDr8|*i!GdLkp-z|T4;5xg;moQPF-k0nz0sIlV)KxaTZRa zwIHq7LTk^NS?y6Xr`=~px)02>Zo8S)y=3Ne&zh0`4`y2bkeSurZRYg%(P*- znKk&$oT0^xjPuO2afX>SPBwGKab{%7HPfaHGiypQb0&)!nU!YR{Edk2O?<@2CEja9Nw*v6q%}r1>1rdF6fmM>myu3hU}TdUja+h#5v5Ep(kb~yHf4;F zOBrTFsWC=6Rc&Nbk&#P1Z9v1080cZ27}#O&8MtBF49NC^fwnzkU~RuMaJB~wDD5r- zop!TUN5~D_ zh_Cc$tB%XOL5H%sbaa+q$7Z$YxU6|P zls!X7XIJUi>~T6SJ6DIO3>{6S=vd0E<0z#L<$R;1b53d5oWoi!=OZo3-Jzv(|Dt7c zpVxA^Pis-$1}&X;pO(%0xt7bjNsIEY(bD-#wQRme%jMg(s9?61E~wM81?5_@sOgEnRkITxP;(RSQX~3iHBDcq zX6a5fM|;(%%%P^s=BnAUdNo&8sYd0cYPvjI&6bZ;bLB~DRAE%p6>>FO@uiBZIH^LF z2UT?Chbp%69TivkstQfotfD79sbVKRs^TWCSD~sqRCLu^6yAAm#etyG!?3eRnawC62a8($mH% z*=adSZd!&C)u$-wdb5(PS1P&suN7$eDFr?Ku!5cbk%F7PLxE9*C zP@snU6m-MS6l}vy3a)`wpvI*Ny3wOx8|@0Nakc_AO;ylMXa5JR}H0!*ao^@Q#&e|{MX6=%r*>B0|*)Pl4*_-6t?8oJ3&LeVq&OLH=&TVpT z&KfzIyFyOS4anKKt#WSe0y(;}QBGf3EoZNsAm^^klcRZKipxJR?I_{Z>X_^?;1M>K8KZs+(nK;k7b)VW*5; z=#_B`9Wu0Nu8dwZO~x*&lyQqnWyqc_qwOPQtUXc2*^M&PESJ&EUrO2LlTxnvQz>$M zD5V|mNLk0LQqHkiikyFx(#}Vvtn-&r&UuFvF>9qXvr@`3At}eWrKn}0lx~?RWm~35 zxfWWAS_`Cf>*Z3mHBHL3#!8V(E2Ui`DeF2b;ao>0$h}uWyFZYy?l&Zydy51uepW&+ z{=I}<{E&oOyiS7JZk5n&*Gt&8E(zD>mmm)#p*`~?tY^A}^HfPt`#1^Ro+Dw~GbCJl zvIKd}656Yju->o5ocEL%`3{L`-$!EBw?oYNUK1n#^J3cnl$iBz5Oe-tiP4guiRmRb ziPw<@bm!C%T^1mT=`5weAe-EJ* zuOoWJ3y58@5pgSii_q2gBl_xJAol8;5qI^q2(9cy^vZU`u5=)7m&631Ul%xlgUiMawNi_G-vp4cV(9d-adDS6koOfxfS~`WN*>n8yj? zJzx)aAi*AD+K=sv{}(WjOqdS;Q2wv^UJQqUuoD#CYp!2=@WiJFf%4gh$B(~#^~yVfI}h(W0EAcF8@6?HuG_u#^@Dr&A2_(h z>2Ud+9h;XN*neQ}-hJGntNhhD4S%?i*}He|o=+YhN6mci+8OUstDGNy{PFJHo?+7; zyYYs{SB+lj*u8uAu3aCj=9*TF42LpSH1FEA>;3oNe{x1+*T`TnqstD3ci(;YmFG5Z zdFsU%H*Vpe@OHoLjee;;gpT(^;OMcw2z-VK1cBEG0!M&=`+R=tId=6;htC5b(H1+e zTYb}^6FefjkDqvZ75lUB&cg=|0z|L1J+{58>)ww5f&HHzJp6Jivv`TClOV8v|A7~q z?ZKMdC<1%;J~57(_5BgpxpU{MoBsUr#w}YmzRW?P9{_Ln17JHs{dE8f*hdFG6A<8a zfJjUbcy`qdKRJBAD{I{)(H@vZI**zG6eL#4r z#p(99@;b0@-~JcuivryUe1di02OzLx$BtJvZGP!#K;R_~3g3wUywU30KPMyK{<#pt zp>;I0j{fV`5xBVy^1{($9dNjA_e|KU%E<0*+qNBx zK--SUjW=$HbU;hAZX2%NjT@0(CR`uwwE^lX@puTOM=G&T9bny_K^J~5(lYhT1)qzw zjGVdPgSp^6`gD5;zvT$F{+1M5fon*O@p|lDu{T|0yZ`(M0aO}%LTKf{|2D5?`9?i2Bmh zd$9b$)K$DMeJZuIvby@R)P|@py(!gOUYA<$6@000BKXotqq}|S#0lU_b5h%g{NPJd z$6!x#WqMTp*{L;H{y?hpQsf`3FYQ17*aDm*E8?3k$^3&SJ^%HYGiOg7j_d^avE%&e z9GU;f@1veHavIBjByuzFNl!$+KKIpEUqv=WJ?W{)foJzc{`V%qlb${Wp7c*gx;^Qs mr@@obksU;S@T8IJu>2?9i^_jTq!r8mKau+`MgGBh(*FmzNM1?+ literal 0 HcmV?d00001 diff --git a/img/statzR.png b/img/statzR.png new file mode 100644 index 0000000000000000000000000000000000000000..5d867204ccb0bff49c40bd8d1aaa0fd7dbe370ab GIT binary patch literal 6725 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 z700) { + return true; + } + else { + return false; + } + } + +### Auslesen der höchsten Post-ID + function sem_getMaxPostID() { + global $wpdb; + $maxpostid = $wpdb->get_var("SELECT MAX(ID) FROM ".$wpdb->posts." LIMIT 0,1"); + return $maxpostid; //Ganzzahl + } + +### Auslesen des User- bzw. Kommentarautornamen + function sem_getUsername() { + global $user_ID, $user_login, $isAdmin; + + get_currentuserinfo(); + + if($user_ID > 0) { + $useronline = $user_login; + + if(current_user_can('manage_options')) { + $isAdmin = 1; + } + else { + $isAdmin = 0; + } + } + elseif(isset($_COOKIE["comment_author_".COOKIEHASH])) { + $useronline = trim($_COOKIE["comment_author_".COOKIEHASH]); + $isAdmin = -1; + } + else { + $useronline = "Gast"; + $isAdmin = -1; + } + return $useronline; + } + +### Prüfen, ob Besucher ein Bot ist + function sem_AreYouBot($user_agent) { + global $isBot; + $bots = array( + 'aipbot', + 'amfibibot', + 'appie', + 'ask jeeves/teoma', + 'aspseek', + 'axadine', + 'baiduspider', + 'becomebot', + 'blogcorpuscrawler', + 'blogpulse', + 'blogsnowbot', + 'boitho.com', + 'bruinbot', + 'cerberian', + 'cfnetwork', + 'check_http', + 'cipinetbot', + 'claymont', + 'cometsearch@cometsystems.com', + 'converacrawler', + 'cydralspider', + 'digger', + 'es.net_crawler', + 'eventax', + 'everyfeed-spider', + 'exabot@exava.com', + 'faxobot', + 'findlinks', + 'fireball', + 'francis', + 'gaisbot', + 'gamekitbot', + 'gazz@nttr.co.jp', + 'geonabot', + 'getrax crawler', + 'gigabot', + 'girafa.com', + 'goforitbot', + 'googlebot', + 'grub-client', + 'holmes', + 'houxoucrawler', + 'http://www.almaden.ibm.com/cs/crawler', + 'http://www.istarthere.com', + 'http://www.relevantnoise.com', + 'httrack ?', + 'ia_archiver', + 'ichiro', + 'iltrovatore-setaccio', + 'inelabot', + 'infoseek', + 'inktomi.com', + 'irlbot', + 'jetbot', + 'jobspider_ba', + 'kazoombot', + 'larbin', + 'libwww', + 'linkwalker', + 'lmspider', + 'mackster', + 'mediapartners-google', + 'microsoft url control', + 'mj12bot', + 'moreoverbot', + 'mozdex', + 'msnbot', + 'msrbot', + 'naverbot', + 'netresearchserver', + 'ng/2.0', + 'np(bot)', + 'nutch', + 'objectssearch', + 'ocelli', + 'omniexplorer_bot', + 'openbot', + 'overture', + 'patwebbot', + 'php', + 'phpdig', + 'pilgrim html-crawler', + 'pipeliner', + 'pompos', + 'psbot', + 'python-urllib', + 'quepasacreep', + 'robozilla', + 'rpt-httpclient', + 'savvybot', + 'scooter', + 'search.ch', + 'seekbot', + 'semager', + 'seznambot', + 'sherlock', + 'shelob', + 'sitesearch', + 'snapbot', + 'snappreviewbot', + 'speedy spider', + 'sphere scout', + 'stackrambler', + 'steeler', + 'surveybot', + 'szukacz', + 'technoratibot', + 'telnet', + 'themiragorobot', + 'thesubot', + 'thumbshots-de-bot', + 'topicblogs', + 'turnitinbot', + 'tutorgigbot', + 'tutorial crawler', + 'twiceler', + 'vagabondo', + 'versus', + 'voilabot', + 'w3c_css_validator', + 'w3c_validator', + 'w3c-checklink', + 'web downloader', + 'webcopier', + 'webcrawler', + 'webfilter robot', + 'west wind internet protocols', + 'wget', + 'wwweasel robot', + 'wwwster', + 'xaldon webspider', + 'xenu', + 'yahoo! slurp', + 'yahoofeedseeker', + 'yahoo-mmcrawler', + 'zao', + 'zipppbot', + 'zyborg', + ); + foreach($bots as $bot) { + if(stristr($user_agent, $bot) !== false) { + return true; + } + } + return false; + } + +### Referer nach Suchmaschinen-Queries und interner Suche prüfen und Suchstring extrahieren + function sem_getKeyword($referer) { + $keyword = @parse_url($referer); + + if (preg_match("/google\./i", $keyword["host"])) { + if (preg_match("/imgurl/i", $keyword["query"])) { + parse_str($keyword["query"],$q); + $keyword = substr($q["prev"],10); + } + else if (preg_match("/translate\./i", $keyword["host"])) { + parse_str($keyword["query"],$q); + $keyword = $q["q"]; + } + else { + parse_str($keyword["query"],$q); + $keyword = $q["q"]; + } + if($keyword == "") return; return "Google: ".$keyword; + } + elseif (preg_match("/search\.live\./i", $keyword["host"])) { + parse_str($keyword["query"],$q); + $keyword = $q["q"]; + if($keyword == "") return; return "LiveSearch: ".$keyword; + } + elseif (preg_match("/bing\./i", $keyword["host"])) { + parse_str($keyword["query"],$q); + $keyword = $q["q"]; + if($keyword == "") return; return "Bing: ".$keyword; + } + elseif (preg_match("/yahoo\./i", $keyword["host"])) { + if (preg_match("/images/i", $keyword["query"])) { + parse_str($keyword["query"],$q); + $keyword = $q["p"]; + } + else { + parse_str($keyword["query"],$q); + $keyword = $q["p"]; + } + if($keyword == "") return; return "Yahoo: ".$keyword; + } + elseif (preg_match("/aol\./i", $keyword["host"])) { + parse_str($keyword["query"],$q); + $keyword = $q["q"]; + if($keyword == "") return; return "AOL: ".$keyword; + } + elseif (preg_match("/aolsvc\./i", $keyword["host"])) { + parse_str($keyword["query"],$q); + $keyword = $q["q"]; + if($keyword == "") return; return "AOL: ".$keyword; + } + elseif (preg_match("/search\.msn\./i", $keyword["host"])) { + parse_str($keyword["query"],$q); + $keyword = $q["q"]; + if($keyword == "") return; return "MSN: ".$keyword; + } + elseif (preg_match("/gmx\./i", $keyword["host"])) { + parse_str($keyword["query"],$q); + $keyword = $q["su"]; + if($keyword == "") return; return "GMX: ".$keyword; + } + elseif (preg_match("/\.bild\.t\-/i", $keyword["host"])) { + parse_str($keyword["query"],$q); + $keyword = $q["query"]; + if($keyword == "") return; return "BILD: ".$keyword; + } + elseif (preg_match("/t\-online\./i", $keyword["host"])) { + parse_str($keyword["query"],$q); + $keyword = $q["q"]; + if($keyword == "") return; return "T-Online: ".$keyword; + } + elseif (preg_match("/suche\.web\./i", $keyword["host"])) { + parse_str($keyword["query"],$q); + $keyword = $q["su"]; + if($keyword == "") return; return "WEB.de: ".$keyword; + } + elseif (preg_match("/suche\.lycos\./i", $keyword["host"])) { + parse_str($keyword["query"],$q); + $keyword = $q["query"]; + if($keyword == "") return; return "Lycos: ".$keyword; + } + elseif (preg_match("/altavista\./i", $keyword["host"])) { + parse_str($keyword["query"],$q); + $keyword = $q["q"]; + if($keyword == "") return; return "Altavista: ".$keyword; + } + elseif (preg_match("/alltheweb\./i", $keyword["host"])) { + parse_str($keyword["query"],$q); + $keyword = $q["q"]; + if($keyword == "") return; return "alltheweb: ".$keyword; + } + elseif (preg_match("/technorati\.com\/search\//", $referer)) { + $q = preg_split("/technorati\.com\/search\//", $referer,-1,PREG_SPLIT_NO_EMPTY); + $keyword = $q[1]; + if($keyword == "") return; return "Technorati: ".$keyword; + } + elseif (preg_match("/".$homehost."/i", $keyword["host"])) { + parse_str($keyword["query"],$q); + $keyword = $q["s"]; + if($keyword == "") return; return "Interne Suche: ".$keyword; + } + else { + return; + } + } + +### Anzahl der Datensätze in der statz-Tabelle + function sem_showNumStatzEntries() { + global $wpdb; + $numstatzentries = $wpdb->get_var("SELECT COUNT(id) FROM ".$wpdb->statz); + return $numstatzentries; // Zahl + } + +### Aufgezeichnete Tage in der statz-Tabelle + function sem_countDaysInStatzTable() { + global $wpdb; + $firstdate = $wpdb->get_var("SELECT MIN(time) FROM ".$wpdb->statz." LIMIT 0,1"); + if(!$firstdate) { + return 1; + } + else { + $firstdate = strtotime($firstdate); $now = time(); + $days = (int) (($now - $firstdate) / (60*60*24)+1); + return $days; // KOMPLETTE! Tage + } + } + +### Wenn Tage in statz-Tabelle kleiner als Tage in Daily-Statz, dann nimm Tage in Daily-Statz + function sem_compareLimitDays2DailyStatz () { + global $wpdb; + $sem_options = get_option('semmelstatzR_options'); ### optionsarray auslesen + if (sem_countDaysInStatzTable() << $sem_options["statz_days_limit"]) { + $sem_options["statz_days_limit"] = sem_countDaysInStatzTable(); + update_option("semmelstatzR_options", $sem_options); + } + } + +### Zeigt Copyright-Notiz an + function sem_showCopyright() { + print ""; + } + +### statz-Tabelle leeren (NICHT LÖSCHEN!!!) + function sem_truncateStatzTable() { + global $wpdb, $userip; + $wpdb->query('TRUNCATE TABLE '.$wpdb->statz); + sem_optStatzTable(); + $wpdb->query("INSERT INTO `$wpdb->statz`(ip, time, referer, page, username) VALUES('127.0.0.1', NOW(),NULL,0,'statz-Tabelle geleert')"); + } + +### Obsolet, bleibt aber aus Kompatibilitätsgründen zu SEMMELSTATZ_DELETE + function sem_delOldRecords($days) { + return true; + } + +### simpleEncoding für die GoogleChartAPI + function sem_encodeChartData($values) { + + $maxValue = max($values); + $simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + $chartData = "s:"; + for ($i = 0; $i < count($values); $i++) { + $currentValue = $values[$i]; + + if ($currentValue > -1 && $maxValue <> 0) { + $chartData.=substr($simpleEncoding,61*($currentValue/$maxValue),1); + } + else { + $chartData.='_'; + } + } + return $chartData; + } + +### Datensätze älter als statz_recdays_limit-Tage löschen + function sem_delOutOfLimit() { + global $wpdb; + $sem_options = get_option('semmelstatzR_options'); ### optionsarray auslesen + $today = time(); $days = $sem_options["statz_recdays_limit"]; + $enddatum = $today - ($days * 86400); + $enddatum = date("Y-m-d", $enddatum) . " 23:59:59"; + $wpdb->query("DELETE FROM ".$wpdb->statz." WHERE time <= '".$enddatum."'"); + sem_optStatzTable(); + } + +### Wenn AUTOMATISCHES LIMIT aktiviert, dann LIMITIERE und erhöhe NEXT_CRON + function sem_doCronStatzLimit() { + sem_delOutOfLimit(); + $sem_options = get_option('semmelstatzR_options'); ### optionsarray auslesen + $statz_next_cron = $sem_options["statz_next_cron"] + 86400; + $sem_options["statz_next_cron"] = $statz_next_cron; + update_option("semmelstatzR_options", $sem_options); + } + +### Konvertiert Strings von utf-8 in ISO-8859 + function sem_encodeToIso($string) { + return mb_convert_encoding($string, "ISO-8859-1", mb_detect_encoding($string, "UTF-8, ISO-8859-1, ISO-8859-15", true)); + } + +### statz-Tabelle optimieren + function sem_optStatzTable() { + global $wpdb; + $wpdb->query("OPTIMIZE TABLE ".$wpdb->statz); + } + +### Unter bestimmten Voraussetzungen den Vortag in die statzhist-Tabelle schreiben + function sem_writeYesterdayToHist() { + global $wpdb; + if(!$wpdb->get_var("SELECT date FROM ".$wpdb->statzhist." WHERE substring(date,1,10) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)")) { + + if($wpdb->get_var("SELECT COUNT(ip) FROM ".$wpdb->statz." WHERE substring(time,1,10) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)")) { + + $yesterdays = $wpdb->get_results("SELECT COUNT(ip) AS hits, COUNT(DISTINCT ip) AS visitors, COUNT(DISTINCT referer) + AS referers, substring(time,1,10) AS date FROM ".$wpdb->statz." WHERE substring(time,1,10) = DATE_SUB(CURDATE(), + INTERVAL 1 DAY) GROUP BY date"); + + foreach ($yesterdays as $yesterday) { + $date = $yesterday->date; + $visitors = $yesterday->visitors; + $hits = $yesterday->hits; + $referers = $yesterday->referers; + } + + $sql = $wpdb->query("INSERT INTO ".$wpdb->statzhist." (date, referers, visitors, hits) + VALUES('$date', $referers, $visitors, $hits)"); + } + else { + $date = $wpdb->get_var("SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY)"); + $sql = $wpdb->query("INSERT INTO ".$wpdb->statzhist." (date, referers, visitors, hits) VALUES('$date', 0, 0, 0)"); + } + } + } + +### Summen der vergangenen Tage in die statzhist schreiben */ + function sem_writeOldDaysToHist() { + global $wpdb; + if(!$wpdb->get_var("SELECT date FROM ".$wpdb->statzhist." WHERE substring(date,1,10) <= DATE_SUB(CURDATE(), INTERVAL 1 DAY)")) { + + $theolddays = $wpdb->get_results("SELECT COUNT(ip) AS hits, COUNT(DISTINCT ip) AS visitors, + COUNT(DISTINCT referer) AS referers, substring(time,1,10) AS date FROM ".$wpdb->statz." WHERE + substring(time,1,10) <= DATE_SUB(CURDATE(), INTERVAL 1 DAY) GROUP BY date ORDER BY time ASC"); + + foreach ($theolddays as $theoldday) { + $date = $theoldday->date; + $visitors = $theoldday->visitors; if(!$visitors) $visitors = 0; + $hits = $theoldday->hits; if(!$hits) $hits = 0; + $referers = $theoldday->referers; if(!$referers) $referers = 0; + $sql = $wpdb->query("INSERT INTO ".$wpdb->statzhist." (date, referers, visitors, hits) + VALUES('$date', $referers, $visitors, $hits)"); + } + } + } + + +function semr_e($sValue, $sDomain = "semmelstatzR") { + return __($sValue, $sDomain); +} +############################################## Ende SEMMELSTATZ-interne Funktionen +?> \ No newline at end of file diff --git a/includes/functions.semr_template.php b/includes/functions.semr_template.php new file mode 100644 index 0000000..ff5f77a --- /dev/null +++ b/includes/functions.semr_template.php @@ -0,0 +1,267 @@ +get_results("SELECT ID, post_title FROM ".$wpdb->posts." WHERE post_status = 'publish' + AND post_type = 'post' ORDER BY post_date DESC LIMIT 0, ".$num_posts); + print "
"; + if (empty($lastposts)) { + print "... noch keine Beiträge"; + } + else { + print "Die letzten ".$num_posts." Beiträge
"; + foreach ($lastposts as $lastpost) { + $posttitle = $lastpost->post_title; + $permalink = get_permalink($lastpost->ID); + $postdate = $lastpost->post_date; + print "".$posttitle."
\n"; + } + } + print "
"; + } + +### Zeigt die letzten $num_comments-Kommentare an: Autor und Post mit relativem Datum - CSS-id: #lastcomments + function sem_showLastComments($num_comments = 10) { + global $wpdb; + $comments = $wpdb->get_results("SELECT comment_author, comment_ID, comment_post_ID, comment_date + FROM ".$wpdb->comments." WHERE comment_approved = '1' ORDER BY comment_date DESC LIMIT 0, $num_comments"); + print "
"; + if (empty($comments)) { + print "Keine Kommentare"; + } + else { + print "Die letzten ".$num_comments." Kommentare
"; + foreach ($comments as $comment) { + $commentday = strtotime(substr($comment->comment_date,1,10)); + $today = time(); + $difference = ceil(($today - $commentday) / (60*60*24))-1; + if($difference == 0) { + $commentdate = "Heute um " . mysql2date("G:i", $comment->comment_date); + } + elseif($difference == 1) { + $commentdate = "Gestern um " . mysql2date("G:i", $comment->comment_date); + } + elseif($difference == 2) { + $commentdate = "Vorgestern um " . mysql2date("G:i", $comment->comment_date); + } + else { + $commentdate = mysql2date("j. F G:i", $comment->comment_date); + } + + print "$comment->comment_author@". get_the_title($comment->comment_post_ID) .", $commentdate
\n"; + } + } + print "
"; + } + +### Zeigt die $num_reads meist gelesenen Posts an - CSS-id: #mostreads + function sem_showMostReads($num_reads = 10) { + global $wpdb; + $mostreads = $wpdb->get_results("SELECT post_title AS posttitle, guid AS postid, hits AS hits FROM ".$wpdb->posts." WHERE hits != '0' GROUP BY postid ORDER BY hits DESC LIMIT 0, $num_reads"); + print "
"; + if (empty($mostreads)) { + print "... noch keine Einträge"; + } + else { + print "Die ".$num_reads." meist gelesenen Beiträge
"; + foreach ($mostreads as $mostread) { + $posttitle = $mostread->posttitle; + $postid = $mostread->postid; + //$permalink = get_permalink($mostread->postid); + $hits = $mostread->hits; + print "".$posttitle." (".$hits.")
\n"; + } + } + print "
"; + } + +### Zeigt die $num_reads meist gelesenen Posts an - CSS-id: #mostreads - ACHTUNG: Das Ergebnis der Funktion basiert auf der statz-Tabelle + function sem_showMostReadsOld($num_reads = 10) { + global $wpdb; + $mostreads = $wpdb->get_results("SELECT post_title AS posttitle, ".$wpdb->posts.".guid AS postid, + COUNT(".$wpdb->statz.".page) AS count FROM ".$wpdb->posts.", ".$wpdb->statz." WHERE + ".$wpdb->statz.".page = ".$wpdb->posts.".ID GROUP BY postid ORDER BY count DESC LIMIT 0, $num_reads"); + print "
"; + if (empty($mostreads)) { + print "... noch keine Einträge"; + } + else { + print "Die ".$num_reads." meist gelesenen Beiträge
"; + foreach ($mostreads as $mostread) { + $posttitle = $mostread->posttitle; + $postid = $mostread->postid; + //$permalink = get_permalink($mostread->postid); + $count = $mostread->count; + print "".$posttitle." (".$count.")
\n"; + } + } + print "
"; + } + +### Zeigt die $num_commented meist kommentierten Posts an - CSS-id: #mostcommented + function sem_showMostCommented($num_commented = 10) { + global $wpdb; + $mostcommented = $wpdb->get_results("SELECT guid, id, post_title, COUNT(*) AS count FROM ".$wpdb->comments.",". $wpdb->posts." WHERE + comment_approved = '1' AND comment_post_id = id GROUP BY id, post_title ORDER BY count DESC LIMIT 0, $num_commented"); + + print "
"; + if (empty($mostcommented)) { + print "... noch keine Einträge"; + } + else { + print "Die ".$num_commented." meist kommentierten Beiträge
"; + + foreach ($mostcommented as $key => $mostcommented) { + $posttitle = $mostcommented->post_title; + $count = $mostcommented->count; + $postid = $mostcommented->guid; + print "".$posttitle." (".$count.")
\n"; + } + } + print "
"; + } + +### Zeigt einen Zähler der Hits im jeweiligen Post. ACHTUNG: FUNKTIONIERT NUR IM LOOP (index.php, single.php) + function sem_showPostHitsInLoop($postid) { + global $wpdb; + $hits = $wpdb->get_var("SELECT hits FROM $wpdb->posts WHERE ID = $postid LIMIT 0,1"); + return $hits; + } + +### Anzahl aller Posts/Pages + function sem_showTotalPosts() { + global $wpdb; + $totalposts = $wpdb->get_var("SELECT COUNT(ID) AS num FROM ".$wpdb->posts." WHERE post_status = 'publish' LIMIT 0,1"); + return $totalposts; // Ganzzahl + } + +### Anzahl aller Kommentare + function sem_showTotalComments() { + global $wpdb; + $totalcomments = $wpdb->get_var("SELECT COUNT(comment_ID) AS num FROM ".$wpdb->comments." WHERE comment_approved = '1' LIMIT 0,1"); + return $totalcomments; // Ganzzahl + } + +### Anzahl aller User seit Beginn der Statzaufzeichnung + function sem_showTotalUsers() { + global $wpdb; + $totalusers = $wpdb->get_var("SELECT SUM(visitors) FROM ".$wpdb->statzhist." LIMIT 0,1"); + if(!$totalusers) $totalusers = 0; + return $totalusers; // Ganzzahl + } + +### Anzahl User pro Tag im Durchschnitt + function sem_showAverageUserPerDay() { + $averageuser = ceil(sem_showTotalUsers() / sem_showStatzDays()); + return $averageuser; + } + +### Datum des 1. Posts = Blogstart + function sem_showFirstPostDate() { + global $wpdb; + $firstpostdate = $wpdb->get_var("SELECT MIN(post_date) FROM ".$wpdb->posts." WHERE post_status = 'publish' AND post_date != '0000-00-00 00:00:00' LIMIT 0,1"); + $firstpostdate = mysql2date("j.n.Y", $firstpostdate); + return $firstpostdate; // String T.M.JJJJ + } + +### Datum des 1. Kommentars + function sem_showFirstCommentDate() { + global $wpdb; + $firstcommentdate = $wpdb->get_var("SELECT MIN(comment_date) FROM ".$wpdb->comments." WHERE comment_approved = '1' + AND comment_date != '0000-00-00 00:00:00' LIMIT 0,1"); + $firstcommentdate = mysql2date("j.n.Y", $firstcommentdate); + return $firstcommentdate; // String T.M.JJJJ + } + +### Anzahl der Kommentierer nach Nicknamen + function sem_showNumCommenters() { + global $wpdb; + $totalcommenters = $wpdb->get_var("SELECT COUNT(DISTINCT comment_author) FROM ".$wpdb->comments." WHERE comment_approved = '1' LIMIT 0,1"); + if(!$totalcommenters) $totalcommenters = 0; + return $totalcommenters; // Ganzzahl + } + +### Blog besteht seit x Tagen + function sem_showPostDays() { + global $wpdb; + $firstdate = $wpdb->get_var("SELECT MIN(post_date) AS date FROM ".$wpdb->posts." WHERE post_status = 'publish' AND post_date != '0000-00-00 00:00' LIMIT 0,1"); + $firstdate = strtotime($firstdate); $now = time(); + $blogdays = (int) (($now - $firstdate) / (60*60*24)); + $blogdays = $blogdays + 1; + return $blogdays; // Ganzzahl + } + +### Tage seit 1. Kommentar + function sem_showCommentDays() { + global $wpdb; + $firstdate = $wpdb->get_var("SELECT MIN(comment_date) AS date FROM ".$wpdb->comments." LIMIT 0,1"); + $firstdate = strtotime($firstdate); $now = time(); + $commentdays = (int) (($now - $firstdate) / (60*60*24)); + $commentdays = $commentdays + 1; + return $commentdays; // Ganzzahl + } + +### durchschn. Posts pro Tag + function sem_showPostsPerDay() { + global $wpdb; + $postsperday = (int) sem_showTotalPosts() / (int) sem_showPostDays(); + return $postsperday; // Ganzzahl + } + +### durchschn. Kommentare pro Tag + function sem_showCommentsPerDay() { + global $wpdb; + $commentsperday = (int) sem_showTotalComments() / (int) sem_showCommentDays(); + return $commentsperday; // Ganzzahl + } + +### Startdatum der Gesamtstatistik (Basis: statzhist) + function sem_showStatzStartDate() { + global $wpdb; + $statzhiststartdate = $wpdb->get_var("SELECT MIN(date) FROM ".$wpdb->statzhist." WHERE date != '0000-00-00 00:00' LIMIT 0,1"); + $statzhiststartdate = mysql2date("j.n.Y", $statzhiststartdate); + // if(!$statzhiststartdate) $statzhiststartdate= "xx.xx.xxxx"; + return $statzhiststartdate; // String T.M.JJJJ + } + +### Dauer der Statistikaufzeichnung in Tagen (Basis: statzhist) + function sem_showStatzDays() { + global $wpdb; + $firstdate = $wpdb->get_var("SELECT MIN(date) FROM ".$wpdb->statzhist." LIMIT 0,1"); + if(!$firstdate) { + return 1; + } + else { + $firstdate = strtotime($firstdate); $now = time(); + $statzdays = (int) (($now - $firstdate) / (60*60*24)); + return $statzdays; // Ganzzahl + } + } + +### Anzahl der Online-Besucher - Verweildauer in den Einstellungen + function sem_showNumUsersOnline() { + global $wpdb; + $sem_options = get_option('semmelstatzR_options'); ### optionsarray auslesen + $onlinetime = $sem_options["statz_online_time"]; + $numonline = $wpdb->get_var("SELECT COUNT(DISTINCT ip) FROM ".$wpdb->statz." WHERE time > Now() - INTERVAL ".$onlinetime." SECOND"); + return $numonline; // Ganzzahl + } + +### Anzahl der heutigen Besucher + function sem_showUsersToday() { + global $wpdb; $today = date("Y-m-d"); + $todayusers = $wpdb->get_var("SELECT COUNT(DISTINCT ip) FROM ".$wpdb->statz." WHERE time >= '$today' LIMIT 0, 1"); + return $todayusers; + } + +### Anzahl der gestrigen Besucher + function sem_showUsersYesterday() { + global $wpdb; + $yesterdaysusers = $wpdb->get_var("SELECT visitors FROM ".$wpdb->statzhist." WHERE date = substr(DATE_SUB(NOW(), INTERVAL 1 DAY),1,10) LIMIT 0, 1"); + return $yesterdaysusers; + } + +##################################################### Ende TEMPLATE-Funktionen +?> \ No newline at end of file diff --git a/semmelstatzR-options.php b/semmelstatzR-options.php index 7414f3c..6c6b07f 100644 --- a/semmelstatzR-options.php +++ b/semmelstatzR-options.php @@ -42,14 +42,15 @@ if(!current_user_can('manage_statz')) { $sem_options['statz_show_todayusers'] = $_POST['statz_show_todayusers']; $sem_options['statz_on_dashboard'] = $_POST['statz_on_dashboard']; $sem_options['statz_datarecs_limit'] = $_POST['statz_datarecs_limit']; + $sem_options['statz_use_img'] = $_POST['statz_use_img']; update_option("semmelstatzR_options", $sem_options); - echo '

Einstellungen gespeichert

'; + echo '

'.semr_e('Options saved').'

'; } if(isset($_POST['trunc_save'])) { if ($result == sem_truncateStatzTable()) { - echo "

Die statz-Tabelle wurde erfolgreich geleert.

"; + echo "

".semr_e('statz-table emptied succesfully.')."

"; } } @@ -92,11 +93,19 @@ if(!current_user_can('manage_statz')) {

-

SemmelstatzR › Einstellungen

+

SemmelstatzR ›

-

+

+ + + + + + diff --git a/semmelstatzR.php b/semmelstatzR.php index 04db71c..7ba1382 100644 --- a/semmelstatzR.php +++ b/semmelstatzR.php @@ -1,8 +1,8 @@ query("DELETE FROM $wpdb->options WHERE option_name LIKE 'statz%';"); // Löschen der alten Optionen - } - - if(!get_option('semmelstatzR_options')) { - $sem_options = array( - "statz_comment_limit" => 10, - "statz_datarecs_limit" => 100, - "statz_days_limit" => 7, - "statz_do_cron" => false, - "statz_encode_ip" => false, - "statz_keyword_limit" =>10, - "statz_referer_limit" => 10, - "statz_mask_referer" => false, - "statz_on_dashboard" => false, - "statz_online_time" => 180, - "statz_recdays_limit" => 20, - "statz_show_commenters" => true, - "statz_show_dailystatz" => true, - "statz_show_keywords" => true, - "statz_show_reads" => true, - "statz_show_referers" => true, - "statz_show_todayreads" => true, - "statz_show_todayusers" => true, - "statz_show_topcommposts" => true, - "statz_show_useronline" => true, - "statz_topreads_limit" => 10, - "statz_write_admins" => false, - "statz_write_users" => false - ); - add_option( 'semmelstatzR_options', $sem_options ); - } +include_once SEMMELSTATZR_SRVPATH.'/includes/functions.semr.php'; +include_once SEMMELSTATZR_SRVPATH.'/includes/functions.semr_template.php'; + + +if(is_admin() == true) { + + /** + * add CSS + * + * @return void + */ + function semmelstatzR_css() { + print "\n"; } + add_action('admin_head', 'semmelstatzR_css'); + ### End add CSS + + /** + * add toplevel menu into admin + * + * @todo localization + * + * @return void + */ + function semmelstatzR_menu() { + if (function_exists('add_menu_page')) { + add_menu_page('SemmelstatzR','SemmelstatzR', 'manage_statz', 'semmelstatzR/semmelstatzR-statz.php', '', plugins_url('semmelstatzR/img/statz_small.png')); + } + if (function_exists('add_submenu_page')) { + add_submenu_page('semmelstatzR/semmelstatzR-statz.php', semr_e('Current Statz'), semr_e('Current Statz'), 'manage_statz', 'semmelstatzR/semmelstatzR-statz.php'); + add_submenu_page('semmelstatzR/semmelstatzR-statz.php', semr_e('History'), semr_e('History'), 'manage_statz', 'semmelstatzR/semmelstatzR-history.php'); + add_submenu_page('semmelstatzR/semmelstatzR-statz.php', semr_e('Log'), semr_e('Log'), 'manage_statz', 'semmelstatzR/semmelstatzR-log.php'); + add_submenu_page('semmelstatzR/semmelstatzR-statz.php', semr_e('Database'), semr_e('Database'), 'manage_statz', 'semmelstatzR/semmelstatzR-database.php'); + add_submenu_page('semmelstatzR/semmelstatzR-statz.php', semr_e('Templates'), semr_e('Templates'), 'manage_statz', 'semmelstatzR/semmelstatzR-templates.php'); + add_submenu_page('semmelstatzR/semmelstatzR-statz.php', semr_e('Options'), semr_e('Options'), 'manage_statz', 'semmelstatzR/semmelstatzR-options.php'); + } + } + add_action('admin_menu', 'semmelstatzR_menu'); + ### end add toplevel adminmenu + + + + /** + * write defaults to options-array + * + * @return void + */ + function sem_init_options() { + global $wpdb; + + if(get_option('statz_options')) { + $wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE 'statz%';"); // Löschen der alten Optionen + } + + if(!get_option('semmelstatzR_options')) { + $sem_options = array( + "statz_comment_limit" => 10, + "statz_datarecs_limit" => 100, + "statz_days_limit" => 7, + "statz_do_cron" => false, + "statz_encode_ip" => false, + "statz_keyword_limit" =>10, + "statz_referer_limit" => 10, + "statz_mask_referer" => false, + "statz_on_dashboard" => false, + "statz_online_time" => 180, + "statz_recdays_limit" => 20, + "statz_show_commenters" => true, + "statz_show_dailystatz" => true, + "statz_show_keywords" => true, + "statz_show_reads" => true, + "statz_show_referers" => true, + "statz_show_todayreads" => true, + "statz_show_todayusers" => true, + "statz_show_topcommposts" => true, + "statz_show_useronline" => true, + "statz_topreads_limit" => 10, + "statz_write_admins" => false, + "statz_write_users" => false, + "statz_use_img" => true + ); + add_option( 'semmelstatzR_options', $sem_options ); + } + } + add_action('init', 'sem_init_options'); + ### End write defaults to options-array + +} else { + +} + ### Anlegen der Tabellen, Optionen schreiben - add_action('activate_semmelstatzR/semmelstatzR.php', 'sem_statzsetup'); - function sem_statzsetup() { - global $wpdb; - if(@is_file(ABSPATH.'/wp-admin/upgrade-functions.php')) { - include_once(ABSPATH.'/wp-admin/upgrade-functions.php'); - } elseif(@is_file(ABSPATH.'/wp-admin/includes/upgrade.php')) { - include_once(ABSPATH.'/wp-admin/includes/upgrade.php'); - } else { - die('Kann wp-admin/upgrade-functions.php und wp-admin/includes/upgrade.php nicht finden!'); - } - - $create_table = array(); - $create_table['statz'] = "CREATE TABLE $wpdb->statz ( - id int(11) unsigned NOT NULL auto_increment, - ip varchar(39) default NULL, - time datetime NOT NULL default '0000-00-00 00:00:00', - referer varchar(255) default NULL, - page int(11) unsigned NOT NULL default '0', - username varchar(255) default NULL, - PRIMARY KEY (`id`))"; - $create_table['statzhist'] = "CREATE TABLE $wpdb->statzhist ( - id int(10) unsigned NOT NULL auto_increment, - date datetime NOT NULL default '0000-00-00 00:00:00', - visitors int(10) unsigned NOT NULL default '0', - hits int(10) unsigned NOT NULL default '0', - referers int(10) unsigned NOT NULL default '0', - PRIMARY KEY (`id`))"; - - maybe_create_table($wpdb->statz, $create_table['statz']); - maybe_create_table($wpdb->statzhist, $create_table['statzhist']); - - $sql = $wpdb->query("SELECT host FROM $wpdb->statz"); - if($sql) { $wpdb->query("ALTER TABLE $wpdb->statz DROP host"); } - - $sql = $wpdb->query("SELECT keyword FROM $wpdb->statz"); - if($sql) { $wpdb->query("ALTER TABLE $wpdb->statz DROP keyword"); } - - maybe_add_column($wpdb->posts, 'hits', "ALTER TABLE $wpdb->posts ADD hits bigint(20) NOT NULL DEFAULT '0';"); // ab 3.2 - - $wpdb->query("ALTER TABLE $wpdb->statz CHANGE ip ip VARCHAR(39) NULL DEFAULT NULL;"); - - sem_init_options(); - sem_writeOldDaysToHist(); - - $role = get_role('administrator'); - if(!$role->has_cap('manage_statz')) { - $role->add_cap('manage_statz'); - } +add_action('activate_semmelstatzR/semmelstatzR.php', 'sem_statzsetup'); +function sem_statzsetup() { + global $wpdb; + if(@is_file(ABSPATH.'/wp-admin/upgrade-functions.php')) { + include_once(ABSPATH.'/wp-admin/upgrade-functions.php'); + } elseif(@is_file(ABSPATH.'/wp-admin/includes/upgrade.php')) { + include_once(ABSPATH.'/wp-admin/includes/upgrade.php'); + } else { + die('Kann wp-admin/upgrade-functions.php und wp-admin/includes/upgrade.php nicht finden!'); } + $create_table = array(); + $create_table['statz'] = "CREATE TABLE $wpdb->statz ( + id int(11) unsigned NOT NULL auto_increment, + ip varchar(39) default NULL, + time datetime NOT NULL default '0000-00-00 00:00:00', + referer varchar(255) default NULL, + page int(11) unsigned NOT NULL default '0', + username varchar(255) default NULL, + PRIMARY KEY (`id`))"; + $create_table['statzhist'] = "CREATE TABLE $wpdb->statzhist ( + id int(10) unsigned NOT NULL auto_increment, + date datetime NOT NULL default '0000-00-00 00:00:00', + visitors int(10) unsigned NOT NULL default '0', + hits int(10) unsigned NOT NULL default '0', + referers int(10) unsigned NOT NULL default '0', + PRIMARY KEY (`id`))"; + + maybe_create_table($wpdb->statz, $create_table['statz']); + maybe_create_table($wpdb->statzhist, $create_table['statzhist']); + + $sql = $wpdb->query("SELECT host FROM $wpdb->statz"); + if($sql) { $wpdb->query("ALTER TABLE $wpdb->statz DROP host"); } + + $sql = $wpdb->query("SELECT keyword FROM $wpdb->statz"); + if($sql) { $wpdb->query("ALTER TABLE $wpdb->statz DROP keyword"); } + + maybe_add_column($wpdb->posts, 'hits', "ALTER TABLE $wpdb->posts ADD hits bigint(20) NOT NULL DEFAULT '0';"); // ab 3.2 + + $wpdb->query("ALTER TABLE $wpdb->statz CHANGE ip ip VARCHAR(39) NULL DEFAULT NULL;"); + + sem_init_options(); + sem_writeOldDaysToHist(); + + $role = get_role('administrator'); + if(!$role->has_cap('manage_statz')) { + $role->add_cap('manage_statz'); + } +} + ### Zugriff analysieren und in statz-Tabelle schreiben - add_action('wp_head', 'sem_writeStatz'); - function sem_writeStatz() { - global $wpdb, $wp_query, $isBot, $isAdmin, $page; - $sem_options = get_option('semmelstatzR_options'); ### optionsarray auslesen - - sem_writeYesterdayToHist(); - $useragent = $wpdb->escape($_SERVER['HTTP_USER_AGENT']); - $isBot = sem_AreYouBot($useragent); - $username = sem_getUsername(); - - if(($isBot == true) - || ($isAdmin == 0 && $sem_options['statz_write_users'] == false) - || ($isAdmin == 1 && $sem_options['statz_write_admins'] == false) - || is_404() - ) return; - - $userip = $wpdb->escape($_SERVER['REMOTE_ADDR']); - if($sem_options['statz_encode_ip'] == true) $userip = sem_encodeIP($userip); - - $referer = $wpdb->escape(urldecode($_SERVER['HTTP_REFERER'])); - $blogtime = gmdate('Y-m-d H:i:s', current_time('timestamp')); - - if (!empty($referer)) { - if(get_option('blog_charset') == 'iso-8859-1') $referer = utf8_decode($referer); - $referer = "'".$referer."'"; - } - else { - $referer = 'NULL'; - } +add_action('wp_footer', 'sem_writeStatz'); +function sem_writeStatz() { + global $wpdb, $wp_query, $isBot, $isAdmin, $page; + $plugin_dir = basename(dirname(__FILE__)); + $sem_options = get_option('semmelstatzR_options'); ### optionsarray auslesen - $readingnow = wp_title('', false); - if(empty($readingnow)) { - $page = 0; - } else { - $page = $wp_query->post->ID; - } - - $wpdb->query("INSERT INTO $wpdb->statz (ip, time, referer, page, username) - VALUES('$userip', '$blogtime', $referer, $page, '$username')"); - - if($wpdb->query("SELECT COUNT(hits) FROM $wpdb->posts")) { - $wpdb->query("UPDATE $wpdb->posts SET hits = hits + 1 WHERE ID = $page"); // neu ab 3.2 - } + // true === $sem_options['statz_use_img'] && + if(true == $sem_options['statz_use_img'] && !defined('SEMMELSTATZR_STATZIMG')) { + print ''; + return; ### nothing todo if stat image is used } + + sem_writeYesterdayToHist(); + $useragent = $wpdb->escape($_SERVER['HTTP_USER_AGENT']); + $isBot = sem_AreYouBot($useragent); + $username = sem_getUsername(); + + if(($isBot == true) + || ($isAdmin == 0 && $sem_options['statz_write_users'] == false) + || ($isAdmin == 1 && $sem_options['statz_write_admins'] == false) + || is_404() + ) return; + + $userip = $wpdb->escape($_SERVER['REMOTE_ADDR']); + if($sem_options['statz_encode_ip'] == true) $userip = sem_encodeIP($userip); + +$referer = $wpdb->escape(urldecode($_SERVER['HTTP_REFERER'])); + $blogtime = gmdate('Y-m-d H:i:s', current_time('timestamp')); + + if (!empty($referer)) { + if(get_option('blog_charset') == 'iso-8859-1') $referer = utf8_decode($referer); +$referer = "'".$referer."'"; + } +else { +$referer = 'NULL'; +} + + $readingnow = wp_title('', false); + if(empty($readingnow)) { + $page = 0; + } else { + $page = $wp_query->post->ID; + } + +$wpdb->query("INSERT INTO $wpdb->statz (ip, time, referer, page, username) + VALUES('$userip', '$blogtime', $referer, $page, '$username')"); + + if($wpdb->query("SELECT COUNT(hits) FROM $wpdb->posts")) { + $wpdb->query("UPDATE $wpdb->posts SET hits = hits + 1 WHERE ID = $page"); // neu ab 3.2 + } +} ### Zeitgesteuertes Limitieren der statz-Tabelle // Wenn semmelKron JA UND statz_next_cron älter JETZT, dann... @@ -221,15 +266,11 @@ add_action('init', 'sem_init_options'); if($sem_options['statz_do_cron'] == true && $sem_options['statz_next_cron'] < time()) { add_action('shutdown', 'sem_doCronStatzLimit'); // ...limitiere statz-Tabelle auf vorgegebenen Wert } - -### CSS für den SEMMELSTATZ-Admin-Bereich -add_action('admin_head', 'semmelstatzR_css'); -function semmelstatzR_css() { - print "\n"; -} ### Rendert eine Mini-STATZ. Idee: René Tauchnitz -function sem_dashboardStatz() { +function sem_dashboardStatz_show() { + + $widgets = get_option( 'dashboard_widget_options' ); echo '

'; printf(_n("%d Visitor online", "%d Visitors online", sem_showNumUsersOnline(), "semmelstatzR"), sem_showNumUsersOnline()); echo ' - '; @@ -237,14 +278,36 @@ function sem_dashboardStatz() { echo ' »»'; echo '

'; } + +function sem_dashboardStatz_control() { + if ( !$widget_options = get_option( 'dashboard_widget_options' ) ) + $widget_options = array(); + + if ( !isset($widget_options['dashboard_sem_dashboardStatz']) ) + $widget_options['dashboard_sem_dashboardStatz'] = array(); + + if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['dashboard-sem-dashboardStatz']) ) { + $number = absint( $_POST['dashboard-sem-dashboardStatz']['items'] ); + $widget_options['dashboard_sem_dashboardStatz']['items'] = $number; + update_option( 'dashboard_widget_options', $widget_options ); + } + + $number = isset( $widget_options['dashboard_sem_dashboardStatz']['items'] ) ? (int) $widget_options['dashboard_sem_dashboardStatz']['items'] : ''; + + echo '

'; + echo '

'; + + print_r($widget_options['dashboard_sem_dashboardStatz']); +} ### Widget für die Mini-STATZ add_action('wp_dashboard_setup', 'sem_dashboardStatz_setup'); + function sem_dashboardStatz_setup() { $sem_options = get_option('semmelstatzR_options'); ### optionsarray auslesen if(!current_user_can('manage_statz')) return; if($sem_options['statz_on_dashboard'] != true) return; - wp_add_dashboard_widget( 'sem_dashboardStatz', 'SemmelstatzR', 'sem_dashboardStatz' ); + wp_add_dashboard_widget( 'sem_dashboardStatz', 'SemmelstatzR', 'sem_dashboardStatz_show', 'sem_dashboardStatz_control' ); } ### Mini-Statz für Dashboard-Widget & AKTUELL-Anzeige @@ -252,7 +315,7 @@ function sem_dashboardStatz_setup() { global $wpdb; $thedays = $wpdb->get_results("SELECT COUNT(ip) AS hits, COUNT(DISTINCT ip) AS visitors, COUNT(DISTINCT referer) AS referers, substring(time,1,10) AS date FROM ".$wpdb->statz." WHERE time >= CURDATE() GROUP BY date"); - $thedays = array(array('hits' => 33)); + //$thedays = array(array('hits' => 33)); if (empty($thedays)) { return "".__("... no entries", "semmelstatzR").""; } @@ -266,737 +329,4 @@ function sem_dashboardStatz_setup() { .sprintf(_n("%d Hit","%d Hits",$hits, "semmelstatzR"),$hits)." - " .sprintf(_n("%d Referrer","%d Referrers",$referer, "semmelstatzR"),$referers); } - -### Encodierung der IP-Adresse durch simple arithmetische Operation - function sem_encodeIP($ip) { - $ip_parts = split("[.]", $ip); - $new_ip = ($ip_parts[0]+700) . "." . ($ip_parts[1]*2) . "." . ($ip_parts[2]+600) . "." . ($ip_parts[3]*3); - return $new_ip; - } - -### Decodierung der IP-Adresse durch simple arithmetische Operation - function sem_decodeIP($ip) { - $ip_parts = split("[.]", $ip); - $new_ip = ($ip_parts[0]-700) . "." . ($ip_parts[1] / 2) . "." . ($ip_parts[2]-600) . "." . ($ip_parts[3]/3); - return $new_ip; - } - -### Ist IP-Adresse codiert? - function sem_checkIfIPisEncoded($ip) { - $ip_parts = split("[.]", $ip); - if($ip_parts[0]>700) { - return true; - } - else { - return false; - } - } - -### Auslesen der höchsten Post-ID - function sem_getMaxPostID() { - global $wpdb; - $maxpostid = $wpdb->get_var("SELECT MAX(ID) FROM ".$wpdb->posts." LIMIT 0,1"); - return $maxpostid; //Ganzzahl - } - -### Auslesen des User- bzw. Kommentarautornamen - function sem_getUsername() { - global $user_ID, $user_login, $isAdmin; - - get_currentuserinfo(); - - if($user_ID > 0) { - $useronline = $user_login; - - if(current_user_can('manage_options')) { - $isAdmin = 1; - } - else { - $isAdmin = 0; - } - } - elseif(isset($_COOKIE["comment_author_".COOKIEHASH])) { - $useronline = trim($_COOKIE["comment_author_".COOKIEHASH]); - $isAdmin = -1; - } - else { - $useronline = "Gast"; - $isAdmin = -1; - } - return $useronline; - } - -### Prüfen, ob Besucher ein Bot ist - function sem_AreYouBot($user_agent) { - global $isBot; - $bots = array( - 'aipbot', - 'amfibibot', - 'appie', - 'ask jeeves/teoma', - 'aspseek', - 'axadine', - 'baiduspider', - 'becomebot', - 'blogcorpuscrawler', - 'blogpulse', - 'blogsnowbot', - 'boitho.com', - 'bruinbot', - 'cerberian', - 'cfnetwork', - 'check_http', - 'cipinetbot', - 'claymont', - 'cometsearch@cometsystems.com', - 'converacrawler', - 'cydralspider', - 'digger', - 'es.net_crawler', - 'eventax', - 'everyfeed-spider', - 'exabot@exava.com', - 'faxobot', - 'findlinks', - 'fireball', - 'francis', - 'gaisbot', - 'gamekitbot', - 'gazz@nttr.co.jp', - 'geonabot', - 'getrax crawler', - 'gigabot', - 'girafa.com', - 'goforitbot', - 'googlebot', - 'grub-client', - 'holmes', - 'houxoucrawler', - 'http://www.almaden.ibm.com/cs/crawler', - 'http://www.istarthere.com', - 'http://www.relevantnoise.com', - 'httrack ?', - 'ia_archiver', - 'ichiro', - 'iltrovatore-setaccio', - 'inelabot', - 'infoseek', - 'inktomi.com', - 'irlbot', - 'jetbot', - 'jobspider_ba', - 'kazoombot', - 'larbin', - 'libwww', - 'linkwalker', - 'lmspider', - 'mackster', - 'mediapartners-google', - 'microsoft url control', - 'mj12bot', - 'moreoverbot', - 'mozdex', - 'msnbot', - 'msrbot', - 'naverbot', - 'netresearchserver', - 'ng/2.0', - 'np(bot)', - 'nutch', - 'objectssearch', - 'ocelli', - 'omniexplorer_bot', - 'openbot', - 'overture', - 'patwebbot', - 'php', - 'phpdig', - 'pilgrim html-crawler', - 'pipeliner', - 'pompos', - 'psbot', - 'python-urllib', - 'quepasacreep', - 'robozilla', - 'rpt-httpclient', - 'savvybot', - 'scooter', - 'search.ch', - 'seekbot', - 'semager', - 'seznambot', - 'sherlock', - 'shelob', - 'sitesearch', - 'snapbot', - 'snappreviewbot', - 'speedy spider', - 'sphere scout', - 'stackrambler', - 'steeler', - 'surveybot', - 'szukacz', - 'technoratibot', - 'telnet', - 'themiragorobot', - 'thesubot', - 'thumbshots-de-bot', - 'topicblogs', - 'turnitinbot', - 'tutorgigbot', - 'tutorial crawler', - 'twiceler', - 'vagabondo', - 'versus', - 'voilabot', - 'w3c_css_validator', - 'w3c_validator', - 'w3c-checklink', - 'web downloader', - 'webcopier', - 'webcrawler', - 'webfilter robot', - 'west wind internet protocols', - 'wget', - 'wwweasel robot', - 'wwwster', - 'xaldon webspider', - 'xenu', - 'yahoo! slurp', - 'yahoofeedseeker', - 'yahoo-mmcrawler', - 'zao', - 'zipppbot', - 'zyborg', - ); - foreach($bots as $bot) { - if(stristr($user_agent, $bot) !== false) { - return true; - } - } - return false; - } - -### Referer nach Suchmaschinen-Queries und interner Suche prüfen und Suchstring extrahieren - function sem_getKeyword($referer) { - $keyword = @parse_url($referer); - - if (preg_match("/google\./i", $keyword["host"])) { - if (preg_match("/imgurl/i", $keyword["query"])) { - parse_str($keyword["query"],$q); - $keyword = substr($q["prev"],10); - } - else if (preg_match("/translate\./i", $keyword["host"])) { - parse_str($keyword["query"],$q); - $keyword = $q["q"]; - } - else { - parse_str($keyword["query"],$q); - $keyword = $q["q"]; - } - if($keyword == "") return; return "Google: ".$keyword; - } - elseif (preg_match("/search\.live\./i", $keyword["host"])) { - parse_str($keyword["query"],$q); - $keyword = $q["q"]; - if($keyword == "") return; return "LiveSearch: ".$keyword; - } - elseif (preg_match("/bing\./i", $keyword["host"])) { - parse_str($keyword["query"],$q); - $keyword = $q["q"]; - if($keyword == "") return; return "Bing: ".$keyword; - } - elseif (preg_match("/yahoo\./i", $keyword["host"])) { - if (preg_match("/images/i", $keyword["query"])) { - parse_str($keyword["query"],$q); - $keyword = $q["p"]; - } - else { - parse_str($keyword["query"],$q); - $keyword = $q["p"]; - } - if($keyword == "") return; return "Yahoo: ".$keyword; - } - elseif (preg_match("/aol\./i", $keyword["host"])) { - parse_str($keyword["query"],$q); - $keyword = $q["q"]; - if($keyword == "") return; return "AOL: ".$keyword; - } - elseif (preg_match("/aolsvc\./i", $keyword["host"])) { - parse_str($keyword["query"],$q); - $keyword = $q["q"]; - if($keyword == "") return; return "AOL: ".$keyword; - } - elseif (preg_match("/search\.msn\./i", $keyword["host"])) { - parse_str($keyword["query"],$q); - $keyword = $q["q"]; - if($keyword == "") return; return "MSN: ".$keyword; - } - elseif (preg_match("/gmx\./i", $keyword["host"])) { - parse_str($keyword["query"],$q); - $keyword = $q["su"]; - if($keyword == "") return; return "GMX: ".$keyword; - } - elseif (preg_match("/\.bild\.t\-/i", $keyword["host"])) { - parse_str($keyword["query"],$q); - $keyword = $q["query"]; - if($keyword == "") return; return "BILD: ".$keyword; - } - elseif (preg_match("/t\-online\./i", $keyword["host"])) { - parse_str($keyword["query"],$q); - $keyword = $q["q"]; - if($keyword == "") return; return "T-Online: ".$keyword; - } - elseif (preg_match("/suche\.web\./i", $keyword["host"])) { - parse_str($keyword["query"],$q); - $keyword = $q["su"]; - if($keyword == "") return; return "WEB.de: ".$keyword; - } - elseif (preg_match("/suche\.lycos\./i", $keyword["host"])) { - parse_str($keyword["query"],$q); - $keyword = $q["query"]; - if($keyword == "") return; return "Lycos: ".$keyword; - } - elseif (preg_match("/altavista\./i", $keyword["host"])) { - parse_str($keyword["query"],$q); - $keyword = $q["q"]; - if($keyword == "") return; return "Altavista: ".$keyword; - } - elseif (preg_match("/alltheweb\./i", $keyword["host"])) { - parse_str($keyword["query"],$q); - $keyword = $q["q"]; - if($keyword == "") return; return "alltheweb: ".$keyword; - } - elseif (preg_match("/technorati\.com\/search\//", $referer)) { - $q = preg_split("/technorati\.com\/search\//", $referer,-1,PREG_SPLIT_NO_EMPTY); - $keyword = $q[1]; - if($keyword == "") return; return "Technorati: ".$keyword; - } - elseif (preg_match("/".$homehost."/i", $keyword["host"])) { - parse_str($keyword["query"],$q); - $keyword = $q["s"]; - if($keyword == "") return; return "Interne Suche: ".$keyword; - } - else { - return; - } - } - -### Anzahl der Datensätze in der statz-Tabelle - function sem_showNumStatzEntries() { - global $wpdb; - $numstatzentries = $wpdb->get_var("SELECT COUNT(id) FROM ".$wpdb->statz); - return $numstatzentries; // Zahl - } - -### Aufgezeichnete Tage in der statz-Tabelle - function sem_countDaysInStatzTable() { - global $wpdb; - $firstdate = $wpdb->get_var("SELECT MIN(time) FROM ".$wpdb->statz." LIMIT 0,1"); - if(!$firstdate) { - return 1; - } - else { - $firstdate = strtotime($firstdate); $now = time(); - $days = (int) (($now - $firstdate) / (60*60*24)+1); - return $days; // KOMPLETTE! Tage - } - } - -### Wenn Tage in statz-Tabelle kleiner als Tage in Daily-Statz, dann nimm Tage in Daily-Statz - function sem_compareLimitDays2DailyStatz () { - global $wpdb; - $sem_options = get_option('semmelstatzR_options'); ### optionsarray auslesen - if (sem_countDaysInStatzTable() << $sem_options["statz_days_limit"]) { - $sem_options["statz_days_limit"] = sem_countDaysInStatzTable(); - update_option("semmelstatzR_options", $sem_options); - } - } - -### Zeigt Copyright-Notiz an - function sem_showCopyright() { - print ""; - } - -### statz-Tabelle leeren (NICHT LÖSCHEN!!!) - function sem_truncateStatzTable() { - global $wpdb, $userip; - $wpdb->query('TRUNCATE TABLE '.$wpdb->statz); - sem_optStatzTable(); - $wpdb->query("INSERT INTO `$wpdb->statz`(ip, time, referer, page, username) VALUES('127.0.0.1', NOW(),NULL,0,'statz-Tabelle geleert')"); - } - -### Obsolet, bleibt aber aus Kompatibilitätsgründen zu SEMMELSTATZ_DELETE - function sem_delOldRecords($days) { - return true; - } - -### simpleEncoding für die GoogleChartAPI - function sem_encodeChartData($values) { - - $maxValue = max($values); - $simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - $chartData = "s:"; - for ($i = 0; $i < count($values); $i++) { - $currentValue = $values[$i]; - - if ($currentValue > -1) { - $chartData.=substr($simpleEncoding,61*($currentValue/$maxValue),1); - } - else { - $chartData.='_'; - } - } - return $chartData; - } - -### Datensätze älter als statz_recdays_limit-Tage löschen - function sem_delOutOfLimit() { - global $wpdb; - $sem_options = get_option('semmelstatzR_options'); ### optionsarray auslesen - $today = time(); $days = $sem_options["statz_recdays_limit"]; - $enddatum = $today - ($days * 86400); - $enddatum = date("Y-m-d", $enddatum) . " 23:59:59"; - $wpdb->query("DELETE FROM ".$wpdb->statz." WHERE time <= '".$enddatum."'"); - sem_optStatzTable(); - } - -### Wenn AUTOMATISCHES LIMIT aktiviert, dann LIMITIERE und erhöhe NEXT_CRON - function sem_doCronStatzLimit() { - sem_delOutOfLimit(); - $sem_options = get_option('semmelstatzR_options'); ### optionsarray auslesen - $statz_next_cron = $sem_options["statz_next_cron"] + 86400; - $sem_options["statz_next_cron"] = $statz_next_cron; - update_option("semmelstatzR_options", $sem_options); - } - -### Konvertiert Strings von utf-8 in ISO-8859 - function sem_encodeToIso($string) { - return mb_convert_encoding($string, "ISO-8859-1", mb_detect_encoding($string, "UTF-8, ISO-8859-1, ISO-8859-15", true)); - } - -### statz-Tabelle optimieren - function sem_optStatzTable() { - global $wpdb; - $wpdb->query("OPTIMIZE TABLE ".$wpdb->statz); - } - -### Unter bestimmten Voraussetzungen den Vortag in die statzhist-Tabelle schreiben - function sem_writeYesterdayToHist() { - global $wpdb; - if(!$wpdb->get_var("SELECT date FROM ".$wpdb->statzhist." WHERE substring(date,1,10) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)")) { - - if($wpdb->get_var("SELECT COUNT(ip) FROM ".$wpdb->statz." WHERE substring(time,1,10) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)")) { - - $yesterdays = $wpdb->get_results("SELECT COUNT(ip) AS hits, COUNT(DISTINCT ip) AS visitors, COUNT(DISTINCT referer) - AS referers, substring(time,1,10) AS date FROM ".$wpdb->statz." WHERE substring(time,1,10) = DATE_SUB(CURDATE(), - INTERVAL 1 DAY) GROUP BY date"); - - foreach ($yesterdays as $yesterday) { - $date = $yesterday->date; - $visitors = $yesterday->visitors; - $hits = $yesterday->hits; - $referers = $yesterday->referers; - } - - $sql = $wpdb->query("INSERT INTO ".$wpdb->statzhist." (date, referers, visitors, hits) - VALUES('$date', $referers, $visitors, $hits)"); - } - else { - $date = $wpdb->get_var("SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY)"); - $sql = $wpdb->query("INSERT INTO ".$wpdb->statzhist." (date, referers, visitors, hits) VALUES('$date', 0, 0, 0)"); - } - } - } - -### Summen der vergangenen Tage in die statzhist schreiben */ - function sem_writeOldDaysToHist() { - global $wpdb; - if(!$wpdb->get_var("SELECT date FROM ".$wpdb->statzhist." WHERE substring(date,1,10) <= DATE_SUB(CURDATE(), INTERVAL 1 DAY)")) { - - $theolddays = $wpdb->get_results("SELECT COUNT(ip) AS hits, COUNT(DISTINCT ip) AS visitors, - COUNT(DISTINCT referer) AS referers, substring(time,1,10) AS date FROM ".$wpdb->statz." WHERE - substring(time,1,10) <= DATE_SUB(CURDATE(), INTERVAL 1 DAY) GROUP BY date ORDER BY time ASC"); - - foreach ($theolddays as $theoldday) { - $date = $theoldday->date; - $visitors = $theoldday->visitors; if(!$visitors) $visitors = 0; - $hits = $theoldday->hits; if(!$hits) $hits = 0; - $referers = $theoldday->referers; if(!$referers) $referers = 0; - $sql = $wpdb->query("INSERT INTO ".$wpdb->statzhist." (date, referers, visitors, hits) - VALUES('$date', $referers, $visitors, $hits)"); - } - } - } - -############################################## Ende SEMMELSTATZ-interne Funktionen - -############################################## Beginn TEMPLATE-Funktionen - -### Zeigt die letzten $num_posts-Posts an: Titel und absolutes Datum - CSS-id: #lastposts - function sem_showLastPosts($num_posts = 10) { - global $wpdb; - $lastposts = $wpdb->get_results("SELECT ID, post_title FROM ".$wpdb->posts." WHERE post_status = 'publish' - AND post_type = 'post' ORDER BY post_date DESC LIMIT 0, ".$num_posts); - print "
"; - if (empty($lastposts)) { - print "... noch keine Beiträge"; - } - else { - print "Die letzten ".$num_posts." Beiträge
"; - foreach ($lastposts as $lastpost) { - $posttitle = $lastpost->post_title; - $permalink = get_permalink($lastpost->ID); - $postdate = $lastpost->post_date; - print "".$posttitle."
\n"; - } - } - print "
"; - } - -### Zeigt die letzten $num_comments-Kommentare an: Autor und Post mit relativem Datum - CSS-id: #lastcomments - function sem_showLastComments($num_comments = 10) { - global $wpdb; - $comments = $wpdb->get_results("SELECT comment_author, comment_ID, comment_post_ID, comment_date - FROM ".$wpdb->comments." WHERE comment_approved = '1' ORDER BY comment_date DESC LIMIT 0, $num_comments"); - print "
"; - if (empty($comments)) { - print "Keine Kommentare"; - } - else { - print "Die letzten ".$num_comments." Kommentare
"; - foreach ($comments as $comment) { - $commentday = strtotime(substr($comment->comment_date,1,10)); - $today = time(); - $difference = ceil(($today - $commentday) / (60*60*24))-1; - if($difference == 0) { - $commentdate = "Heute um " . mysql2date("G:i", $comment->comment_date); - } - elseif($difference == 1) { - $commentdate = "Gestern um " . mysql2date("G:i", $comment->comment_date); - } - elseif($difference == 2) { - $commentdate = "Vorgestern um " . mysql2date("G:i", $comment->comment_date); - } - else { - $commentdate = mysql2date("j. F G:i", $comment->comment_date); - } - - print "$comment->comment_author@". get_the_title($comment->comment_post_ID) .", $commentdate
\n"; - } - } - print "
"; - } - -### Zeigt die $num_reads meist gelesenen Posts an - CSS-id: #mostreads - function sem_showMostReads($num_reads = 10) { - global $wpdb; - $mostreads = $wpdb->get_results("SELECT post_title AS posttitle, guid AS postid, hits AS hits FROM ".$wpdb->posts." WHERE hits != '0' GROUP BY postid ORDER BY hits DESC LIMIT 0, $num_reads"); - print "
"; - if (empty($mostreads)) { - print "... noch keine Einträge"; - } - else { - print "Die ".$num_reads." meist gelesenen Beiträge
"; - foreach ($mostreads as $mostread) { - $posttitle = $mostread->posttitle; - $postid = $mostread->postid; - //$permalink = get_permalink($mostread->postid); - $hits = $mostread->hits; - print "".$posttitle." (".$hits.")
\n"; - } - } - print "
"; - } - -### Zeigt die $num_reads meist gelesenen Posts an - CSS-id: #mostreads - ACHTUNG: Das Ergebnis der Funktion basiert auf der statz-Tabelle - function sem_showMostReadsOld($num_reads = 10) { - global $wpdb; - $mostreads = $wpdb->get_results("SELECT post_title AS posttitle, ".$wpdb->posts.".guid AS postid, - COUNT(".$wpdb->statz.".page) AS count FROM ".$wpdb->posts.", ".$wpdb->statz." WHERE - ".$wpdb->statz.".page = ".$wpdb->posts.".ID GROUP BY postid ORDER BY count DESC LIMIT 0, $num_reads"); - print "
"; - if (empty($mostreads)) { - print "... noch keine Einträge"; - } - else { - print "Die ".$num_reads." meist gelesenen Beiträge
"; - foreach ($mostreads as $mostread) { - $posttitle = $mostread->posttitle; - $postid = $mostread->postid; - //$permalink = get_permalink($mostread->postid); - $count = $mostread->count; - print "".$posttitle." (".$count.")
\n"; - } - } - print "
"; - } - -### Zeigt die $num_commented meist kommentierten Posts an - CSS-id: #mostcommented - function sem_showMostCommented($num_commented = 10) { - global $wpdb; - $mostcommented = $wpdb->get_results("SELECT guid, id, post_title, COUNT(*) AS count FROM ".$wpdb->comments.",". $wpdb->posts." WHERE - comment_approved = '1' AND comment_post_id = id GROUP BY id, post_title ORDER BY count DESC LIMIT 0, $num_commented"); - - print "
"; - if (empty($mostcommented)) { - print "... noch keine Einträge"; - } - else { - print "Die ".$num_commented." meist kommentierten Beiträge
"; - - foreach ($mostcommented as $key => $mostcommented) { - $posttitle = $mostcommented->post_title; - $count = $mostcommented->count; - $postid = $mostcommented->guid; - print "".$posttitle." (".$count.")
\n"; - } - } - print "
"; - } - -### Zeigt einen Zähler der Hits im jeweiligen Post. ACHTUNG: FUNKTIONIERT NUR IM LOOP (index.php, single.php) - function sem_showPostHitsInLoop($postid) { - global $wpdb; - $hits = $wpdb->get_var("SELECT hits FROM $wpdb->posts WHERE ID = $postid LIMIT 0,1"); - return $hits; - } - -### Anzahl aller Posts/Pages - function sem_showTotalPosts() { - global $wpdb; - $totalposts = $wpdb->get_var("SELECT COUNT(ID) AS num FROM ".$wpdb->posts." WHERE post_status = 'publish' LIMIT 0,1"); - return $totalposts; // Ganzzahl - } - -### Anzahl aller Kommentare - function sem_showTotalComments() { - global $wpdb; - $totalcomments = $wpdb->get_var("SELECT COUNT(comment_ID) AS num FROM ".$wpdb->comments." WHERE comment_approved = '1' LIMIT 0,1"); - return $totalcomments; // Ganzzahl - } - -### Anzahl aller User seit Beginn der Statzaufzeichnung - function sem_showTotalUsers() { - global $wpdb; - $totalusers = $wpdb->get_var("SELECT SUM(visitors) FROM ".$wpdb->statzhist." LIMIT 0,1"); - if(!$totalusers) $totalusers = 0; - return $totalusers; // Ganzzahl - } - -### Anzahl User pro Tag im Durchschnitt - function sem_showAverageUserPerDay() { - $averageuser = ceil(sem_showTotalUsers() / sem_showStatzDays()); - return $averageuser; - } - -### Datum des 1. Posts = Blogstart - function sem_showFirstPostDate() { - global $wpdb; - $firstpostdate = $wpdb->get_var("SELECT MIN(post_date) FROM ".$wpdb->posts." WHERE post_status = 'publish' AND post_date != '0000-00-00 00:00:00' LIMIT 0,1"); - $firstpostdate = mysql2date("j.n.Y", $firstpostdate); - return $firstpostdate; // String T.M.JJJJ - } - -### Datum des 1. Kommentars - function sem_showFirstCommentDate() { - global $wpdb; - $firstcommentdate = $wpdb->get_var("SELECT MIN(comment_date) FROM ".$wpdb->comments." WHERE comment_approved = '1' - AND comment_date != '0000-00-00 00:00:00' LIMIT 0,1"); - $firstcommentdate = mysql2date("j.n.Y", $firstcommentdate); - return $firstcommentdate; // String T.M.JJJJ - } - -### Anzahl der Kommentierer nach Nicknamen - function sem_showNumCommenters() { - global $wpdb; - $totalcommenters = $wpdb->get_var("SELECT COUNT(DISTINCT comment_author) FROM ".$wpdb->comments." WHERE comment_approved = '1' LIMIT 0,1"); - if(!$totalcommenters) $totalcommenters = 0; - return $totalcommenters; // Ganzzahl - } - -### Blog besteht seit x Tagen - function sem_showPostDays() { - global $wpdb; - $firstdate = $wpdb->get_var("SELECT MIN(post_date) AS date FROM ".$wpdb->posts." WHERE post_status = 'publish' AND post_date != '0000-00-00 00:00' LIMIT 0,1"); - $firstdate = strtotime($firstdate); $now = time(); - $blogdays = (int) (($now - $firstdate) / (60*60*24)); - $blogdays = $blogdays + 1; - return $blogdays; // Ganzzahl - } - -### Tage seit 1. Kommentar - function sem_showCommentDays() { - global $wpdb; - $firstdate = $wpdb->get_var("SELECT MIN(comment_date) AS date FROM ".$wpdb->comments." LIMIT 0,1"); - $firstdate = strtotime($firstdate); $now = time(); - $commentdays = (int) (($now - $firstdate) / (60*60*24)); - $commentdays = $commentdays + 1; - return $commentdays; // Ganzzahl - } - -### durchschn. Posts pro Tag - function sem_showPostsPerDay() { - global $wpdb; - $postsperday = (int) sem_showTotalPosts() / (int) sem_showPostDays(); - return $postsperday; // Ganzzahl - } - -### durchschn. Kommentare pro Tag - function sem_showCommentsPerDay() { - global $wpdb; - $commentsperday = (int) sem_showTotalComments() / (int) sem_showCommentDays(); - return $commentsperday; // Ganzzahl - } - -### Startdatum der Gesamtstatistik (Basis: statzhist) - function sem_showStatzStartDate() { - global $wpdb; - $statzhiststartdate = $wpdb->get_var("SELECT MIN(date) FROM ".$wpdb->statzhist." WHERE date != '0000-00-00 00:00' LIMIT 0,1"); - $statzhiststartdate = mysql2date("j.n.Y", $statzhiststartdate); - // if(!$statzhiststartdate) $statzhiststartdate= "xx.xx.xxxx"; - return $statzhiststartdate; // String T.M.JJJJ - } - -### Dauer der Statistikaufzeichnung in Tagen (Basis: statzhist) - function sem_showStatzDays() { - global $wpdb; - $firstdate = $wpdb->get_var("SELECT MIN(date) FROM ".$wpdb->statzhist." LIMIT 0,1"); - if(!$firstdate) { - return 1; - } - else { - $firstdate = strtotime($firstdate); $now = time(); - $statzdays = (int) (($now - $firstdate) / (60*60*24)); - return $statzdays; // Ganzzahl - } - } - -### Anzahl der Online-Besucher - Verweildauer in den Einstellungen - function sem_showNumUsersOnline() { - global $wpdb; - $sem_options = get_option('semmelstatzR_options'); ### optionsarray auslesen - $onlinetime = $sem_options["statz_online_time"]; - $numonline = $wpdb->get_var("SELECT COUNT(DISTINCT ip) FROM ".$wpdb->statz." WHERE time > Now() - INTERVAL ".$onlinetime." SECOND"); - return $numonline; // Ganzzahl - } - -### Anzahl der heutigen Besucher - function sem_showUsersToday() { - global $wpdb; $today = date("Y-m-d"); - $todayusers = $wpdb->get_var("SELECT COUNT(DISTINCT ip) FROM ".$wpdb->statz." WHERE time >= '$today' LIMIT 0, 1"); - return $todayusers; - } - -### Anzahl der gestrigen Besucher - function sem_showUsersYesterday() { - global $wpdb; - $yesterdaysusers = $wpdb->get_var("SELECT visitors FROM ".$wpdb->statzhist." WHERE date = substr(DATE_SUB(NOW(), INTERVAL 1 DAY),1,10) LIMIT 0, 1"); - return $yesterdaysusers; - } - -##################################################### Ende TEMPLATE-Funktionen - ?> \ No newline at end of file diff --git a/semr_image.php b/semr_image.php new file mode 100644 index 0000000..485558c --- /dev/null +++ b/semr_image.php @@ -0,0 +1,25 @@ +"; +print_r($_SERVER); +echo ""; +*/ +header('Cache-Control: no-cache'); +header("X-Robots-Tag: noindex, nofollow", true); + +require '../../../wp-load.php'; +sem_writeStatz(); + + +// Output transparent gif + +header('Content-type: image/gif'); +header('Content-length: 43'); + +echo base64_decode('R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='); +?> \ No newline at end of file
checked="checked" /> +
Blog-Administratoren aufzeichnen