这不是一般的统计,准确的说,这是给留过言的朋友用的。在我看来留言交流是一种方式,但我想知道最近有哪些朋友过来过,哪些来了在潜水。。。前几天正好crossyou写了一篇文章关于如何显示在线博友的,思路很好。我在网上找了一段php+xml显示在线人数的方法,将其用到wordpress里面,基本原理还是根据保存的cookie,把来访的博友信息读出来放到一个地方保存,需要时取出来。没用到数据库,ajax也省略了,效果最初是展示目前博客在线的(非bot)访客信息,留言有cookie的显示头像和网址,对没有留言的显示匿名网友和IP地址。
好像有人反映太邪恶了点,没有留言的就显示IP给大家看,这个还是撤掉了。我又换了另一种,就是只显示留言过的朋友访问信息,刷新按时间先后,比较像XX空间,淫淫网之类的“谁看了我”功能。
废话不说了,上代码:
<?php function online(){ $Now=time()+(60*60*get_settings("gmt_offset")); //服务器时间不同 $FileName= TEMPLATEPATH.'/view.xml'; //保存位置,需要755权限,默认位置:主题跟目录 $num=9;//数量 $XML=new DomDocument; $XML->load($FileName); $Items=$XML->getElementsByTagName("item"); $I=0; //循环初始化 $s=0; $output=''; if(isset($_COOKIE['comment_author_'.COOKIEHASH])) { $author = $_COOKIE['comment_author_'.COOKIEHASH]; }else{ $author =''; } if(isset($_COOKIE['comment_author_email_'.COOKIEHASH])) { $Email = $_COOKIE['comment_author_email_'.COOKIEHASH]; }else{ $Email ='xxx@xxx.com'; } if(isset($_COOKIE['comment_author_url_'.COOKIEHASH])) { $url = $_COOKIE['comment_author_url_'.COOKIEHASH]; }else{ $url ='http://'.getenv('REMOTE_ADDR');//无地址的那就放IP地址了 } foreach ($Items as $Item){ $Oldauthor=$Item->childNodes->item(0)->nodeValue; $OldEmail=$Item->childNodes->item(1)->nodeValue; $Oldurl=$Item->childNodes->item(2)->nodeValue; $Time=$Item->childNodes->item(3)->nodeValue; $output.= '<li class="r_item"><div class="row">'.get_avatar($OldEmail, 32).'<span class="r_name">'.$Oldauthor.' 于 '.$Time.'</span><span class="r_excerpt"><a href="'.$Oldurl.'" rel="nofollow">'.$Oldurl.'</a></span></div><div class="clear"></div></li>'; if($I >$num){ $Item=$XML->documentElement->getElementsByTagName("item")->item($s); //删掉久远的 $XML->documentElement->removeChild($Item); $XML->save($FileName); $s++; } if( $Oldauthor==$author || $OldEmail== $Email ){ $Item=$XML->documentElement->getElementsByTagName("item")->item($I); //删掉原来的,因为这淫又来了 $XML->documentElement->removeChild($Item); $XML->save($FileName); } $I++; } if($author !=''){//没cookie的不要进去 $XML->formatOutput = true; $XML_Online=$XML->getElementsByTagName("online")->item(0); $XML_Online_Item=$XML->createElement("item"); $Newauthor =$XML->createElement("author",$author); $XML_Online_Item->appendChild($Newauthor); $NewEmail=$XML->createElement("Email",$Email); $XML_Online_Item->appendChild($NewEmail); $NewUrl=$XML->createElement("url",$url); $XML_Online_Item->appendChild($NewUrl); $XML_Online_Item_Time=$XML->createElement("time",$Now); $XML_Online_Item->appendChild($XML_Online_Item_Time); $XML_Online->appendChild($XML_Online_Item); $XML->save($FileName); } if($Items->length<=1){ $output.= '<li class="r_item"><div class="row"><span class="r_excerpt">最近只有你来过⊙﹏⊙b汗</span></div><div class="clear"></div></li>'."\n"; } echo $output; }
以上加到主题function里面,另外需要一个xml文件
新建一个文本文件,内容如下,并另存为.XML(放置的地址与上面设置的地址一致,注意必须是相对路径,并且可写。)
<?xml version="1.0" encoding="utf-8"?> <online> <item><author>you</author><Email>1@123.com</Email><url>http://127.0.0.1</url><time>1281802053</time></item></online>
里面的格式就是这样的,也许会有一些安全隐患,比如不要让别人下载到xml文件,邮箱地址是没有加密的。所以xml地址自己知道就可以了。(注:加密的我也写过,保存md5()后的邮箱就行了)
最近在学着试试把来访数据保存到数据库里面,但又想每次要多很多查询,肯定前台还是做ajax比较好。不过更复杂的功能已经有插件了,似乎还是简单点好。
最后,已知有一个bug,有时候一个人会显示两行,不定期发作,懂的朋友请教下为啥?
08.30更新,测试了很久,在php代码后面加上
unset($Now,$FileName,$XML,$Items,$I,$s);
OK~
代码收缩
弄半天没弄懂。。
@冰剑
我也想山寨,你博客工具栏那个样子也挺不错
@winy ,山吧寨吧,你山寨出来之后肯定会弄更多的东西进去的,哈哈,到时候要分享哦。。
PS.用COOKIE记录,如果访客是AD怎么办啊?
我的就记录了很多发AD的人。
@冰剑 ,如果你用的是我的方法,那AD没办法- -
我是把wordpress的评论功能咔嚓掉了,AD没办法发评论了哈哈
我在考虑用数据库的方法,这样就好得多
嘿嘿。我也摸进来了
@孤风独影
看看你是从哪里过来的,嘿嘿
代码盲一个~~颇为喜欢底部的半透明导航和弹出框功能。能发一份给我就好了。