这不是一般的统计,准确的说,这是给留过言的朋友用的。在我看来留言交流是一种方式,但我想知道最近有哪些朋友过来过,哪些来了在潜水。。。前几天正好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~

  1. Sky Woo (2011.02.23 at 09:40) 33楼

    代码收缩

  2. 冰剑 (2011.03.31 at 01:29) 34楼

    弄半天没弄懂。。

    • winy() (2011.04.02 at 14:09)

      @冰剑
      我也想山寨,你博客工具栏那个样子也挺不错

    • 冰剑 (2011.04.02 at 19:13)

      @winy ,山吧寨吧,你山寨出来之后肯定会弄更多的东西进去的,哈哈,到时候要分享哦。。

      PS.用COOKIE记录,如果访客是AD怎么办啊?
      我的就记录了很多发AD的人。

    • winy() (2011.04.02 at 22:24)

      @冰剑 ,如果你用的是我的方法,那AD没办法- -
      我是把wordpress的评论功能咔嚓掉了,AD没办法发评论了哈哈

      我在考虑用数据库的方法,这样就好得多

  3. 孤风独影 (2011.04.07 at 20:33) 35楼

    嘿嘿。我也摸进来了

  4. sunshine (2011.04.11 at 15:38) 36楼

    代码盲一个~~颇为喜欢底部的半透明导航和弹出框功能。能发一份给我就好了。

评论分页: 1 ... 3 4 5

发布评论

邮箱(必填)

换个背景