给WordPress主题添加文件校验和替换smilies表情功能

10
550

把WordPress升级到了3.3,同时主题也整合了一些插件,整合完插件之后,又弄了个主题自校验和复制自定义表情图像到默认的wp-includes/images/smilies。因为WordPress自带动表情特难看,所以果断替换,而每次升级主题就要手动上传覆盖,每次升级感觉特麻烦,于是来了个半自动,只要一个按钮,就可以轻松替换原有的自带表情。

主题文件校验

原理是在主题目录建立一个files.sum文件,此文件包含主题所有文件的md5值,自校验就是通过读取该文件与每个文件对比md5值,如果修改或者已经删除,则给出相应的提示。

file-checksum

file-checksum-notify

这个只是一个例子,对于更多的功能可以自己发挥了,譬如我之前所写的增加站点维护提示,就可以给这个一个拓展,我们可以验证主题文件是否被修改(被社工hack),如果修改则增加站点维护提示,而避免其他的显示信息,当然你也可以给全站增加md5文件验证,只要任何一个文件有个变动,你也可以了若指掌,其实建议对于重要的目录验证,如果对于全站验证,相信没几天你的主机商就会警告你,CPU长时间占用过多。至于对全站自校验所占用的cpu和内存还不得而知,如果进行了全站自校验,可以来个反馈。

替换自带表情

替换自带表情的前提是主题文件里包含一个smilies的表情文件夹,为什么不直接引用主题文件夹里面的表情,非要折腾一圈要用wp-includes/images/smilies这个我还没有研究过,记得之前调用愣是没把主题文件下smilies的表情路径弄对,所以至今每次升级就覆盖wp-includes/images/smilies的表情,从而达到替换的效果。

额外说明

此操作要有一点基本的php知识,其中验证的class是来自一个老外的主题,xcopy则借鉴了网上的方法,因为php只支持单个文件拷贝,而对目录则会提示错误。我是将这个功能整合到了主题选项里面,而下面的则是一个UI界面checksum.php和一个所需要调用的类checksum-class.php。

File:checksum.php

verify($path, $log,'files.sum');
	if ($count = count($log)) {
		$html[] = '有些文件已被修改,请检查!如果是本人操作,请重建md5sum!';
		$html[] = '
    '; foreach (array('modified', 'missing') as $type) { if (isset($log[$type])) { foreach ($log[$type] as $file) { $html[] = '
  • '.$file.($type == 'missing' ? ' (missing)' : null).'
  • '; } } } $html[] = '
'; } else { $html[] = '所有文件验证成功!'; } } else { $html[] = 'files.sum 丢失,请检查!'; } if(isset($_POST['rebuild_sum'])||!file_exists($path.'files.sum')){ $filesum->create($path,'files.sum'); $html[] = 'Done! md5sum file files.sum can be found in '.$path; } if(isset($_POST['copy_files'])){ $copy_from = $path.'/smilies/' ;//此位置为主题根目录下smilies目录,即拷贝源表情的目录 $copy_dest = $wp_face_path;//如果文件已存则直接覆盖 if($filesum->xcopy($copy_from,$copy_dest,1)){ $html[] = "copy done!"; }else{ $html[] = "copy failed!"; } } ?>
Tools

这个只是一个例子而已,对于更多的功能可以自己发挥了,譬如我之前所写的增加站点维护提示,就可以给这个一个拓展,我们可以验证主题文件是否被修改(被社工hack),如果修改则增加站点维护提示,而避免其他的显示信息,当然你也可以给全站增加md5文件验证,只要任何一个文件有个变动,你也可以了若指掌,其实建议对于重要的目录验证,如果对于全站验证,相信没几天你的主机商就会警告你,CPU长时间占用过多。

'.implode("\n", $html).''; ?>

File:checksum-class.php

_readDirectory($path);
		if (is_array($files)) {
			$checksums = '';
			foreach ($files as $file) {
				// dont include the checksum file itself
				if ($file == $filename) {
					continue;
				}
				$checksums .= md5_file($path.$file)." {$file}\n";
			}
			return file_put_contents($path.$filename, $checksums);
		}
		return false;
	}
	/*
		Function: verify
			Verify file checksums
		Parameters:
			$path - Path to files
			$log - Log array
			$filename - Checksum filename
		Returns:
			Boolean
	*/
	public function verify($path, &$log, $filename = 'checksums') {
		$path = rtrim(str_replace(DIRECTORY_SEPARATOR, '/', $path), '/').'/';
		if ($rows = file($path.$filename)) {
			foreach ($rows as $row) {
				$parts = explode(' ', trim($row), 2);
				if (count($parts) == 2) {
					list($md5, $file) = $parts;
					if (!file_exists($path.$file)) {
						$log['missing'][] = $file;
					} elseif (md5_file($path.$file) != $md5) {
						$log['modified'][] = $file;
					}
				}
			}
		}
		return empty($log);
	}
	/*
		Function: _readDirectory
			Read files form a directory
		Parameters:
			$path - Path to files
			$prefix - Prefix
			$recursive - Recursive
		Returns:
			Array
	*/
	protected function _readDirectory($path, $prefix = '', $recursive = true) {
		$files  = array();
	    $ignore = array('.', '..', '.DS_Store', '.svn', '.git', '.gitignore', '.gitmodules', 'cgi-bin','.sum','.bak');
		foreach (scandir($path) as $file) {
			// ignore file ?
	        if (in_array($file, $ignore)) {
				continue;
			}
			// get files
            if (is_dir($path.'/'.$file) && $recursive) {
            	$files = array_merge($files, $this->_readDirectory($path.'/'.$file, $prefix.$file.'/', $recursive));
			} else {
				$files[] = $prefix.$file;
            }
		}
		return $files;
	}
	function xCopy($source, $destination, $child){
    //用法:
    // xCopy(“feiy","feiy2″,1):拷贝feiy下的文件到 feiy2,包括子目录
    // xCopy(“feiy","feiy2″,0):拷贝feiy下的文件到 feiy2,不包括子目录
    //参数说明:
    // $source:源目录名
    // $destination:目的目录名
    // $child:复制时,是不是包含的子目录
    if(!is_dir($destination)){
        mkdir($destination, 0777);
    }
    $handle=dir($source);
    while($entry=$handle->read()) {
        if(($entry!=".")&&($entry!="..")){
            if(is_dir($source."/".$entry)){
                if($child)
                xCopy($source."/".$entry,$destination."/".$entry,$child);
            }
            else{
                copy($source."/".$entry,$destination."/".$entry);
            }
        }
    }
    return true;
}
}
?>
上一篇EditPlus 3.40 注册码
下一篇利用Cron备份数据库及站点文件

10 条留言

    • 首先,我的链接怎么从你的上消失了?我也没问啥原因,就把你的也删了,有啥误解? ➡ 你说显示有问题,我特地装了个maxthon测试了下,没问题。我主题实在firefox,chrome,opera及IE9测试出来的,在这几个浏览器显示正常。

      • 没有什么误解,我们的交流也少。我删你链的那时,是你博客不能访问了,私密了。今天也在处理友链,就过来看看了。发现你还是挺多更新的。可能大家对相互的内容都不感兴趣了,也没什么。有空我还是会来逛逛的。
        我用的是CHROME,图片不能都在文章内显示,会越到侧边栏去。

留言

留言不能为空
怎么称呼您?

验证码 *