在本机重构wordpress插件开发系统

上月初笔记本的硬盘噼里啪啦的乱了,貌似是硬件问题,听着里面咯吱咯吱的叫,感觉心惊肉跳的。换了同型号的硬盘重装系统,幸亏有网络和移动硬盘备份重要文件,让工作可以继续,但手机程序、照片以及自己业余开发程序的环境就不复存在了。近段忙的不行,前天终于有时间有心情把这一切恢复起来。把相关步骤做个记录,聊以备忘。以后如果硬盘再坏了,照这个重新来一道就可以了(希望不会再次发生)。 整体的部署如下:

  1. 安装netbeans for php的集成开发环境;
  2. 在本机架构apache服务器和mysql服务器环境;
  3. 从http://heart5.com 的服务器空间把整站down下来,然后把mysql数据库压缩备份下来;
  4. 在本机架构wordpress博客站点并把down下来的网站数据和数据库数据恢复并做相应修改,注入;
  5. 在netbeans中新建project,源码就是本地服务器安装的wordpress程序代码;
  6. 安装svn工具,checkout出来wordpress.org插件目录中的源码,设定到netbeans开发环境中;
  7. okay。

一、netbeans已经是6.9版本了,php专用版只有35M,安装之,和以前版本的差别不是很大,release中说是多了对某些服务的支持,使用过程中再慢慢体验吧。netbeans本来是java开发平台,原来使用体验不错,就沿用了for php的专用版本,也不期待对php的支持能好到哪里去,能用就好。

二、在本地架构主机和数据库服务自然使用xampp套件,到主网站看了下,已经升级到1.7.3版本了。下了个lite版本,zip压缩,有60.9M大,支持apache和mysql够了。解开使用前,需要运行setup_xampp.bat进行系统设定,基本一路y就可以了。平常使用的话就运行xampp-control.exe,手动启动apache和mysql服务就可以了。可以在浏览器中键入http://localhost/xampp 进行测试,安装并设定成功的话浏览器会显示xampp的欢迎信息。

三、考虑到博客上曾经上传了图片存放,再加上一些其他个人文件,因此找胡戈戈回复了ftp密码后对全站进行下载,结果花了我五个小时时间,大呼上当。究其原因,首先是原来设定的每周数据库备份占了100多M,其次是wordpress的目录太深,ftp时非常好时间。其实正确的方案是在本机重新安装wordpress3.0版本就可,至于个性化的图片和文件顶多半个小时就恢复完了。进入cpanel对数据库进行了备份下载。后来发现的诡异事件是自从我用cpanel对数据库进行了操作后,网站居然不可访问了,提示error establishing database connection,后来Google之,根据别人经验对config文件进行了相应修改才恢复正常。难道原来的配置文件是错误的,那为什么原来可以正常访问呢?猜测可能是服务器端缓存的原因。

四、wordpress程序文件和个人个性化文件很好搞,直接拷贝到xampp下的htdocs目录下就行了。有点技术含量的是对本机的mysql进行相应的设定。登录http://localhost/xampp ,进入phpadmin图形化数据库管理界面,构建一个数据库用于存储博客数据,然后再用mysql命令行工具新增一个用户并赋予它访问新构建数据库的权限。方便起见,建议无论是数据库名称还是用户名称和密码都和外购服务器空间上的保持一致,避免更改config文件。同样是在phpadmin图形化数据库管理界面中选择新建的数据库,把从外购服务器备份下来的数据库文件导入,然后修改option子表的home和siteurl的值为http://localhost 。一切okay了,你可以在浏览器中登录http://localhost 访问,应该会正常显示博客页面,和外购服务器上的一模一样。注,为避免混淆,建议在管理后台修改博客中文名称,加上“本地”二字,避免调试中可能产生的混淆。

五、启动netbeans,新建项目,命名为wordpress,设定服务器地址为localhost,并选中源码改动时自动拷贝至服务器,源码目录一般在我的文档下的netbeansproject下。从xampp的htdocs目录下把文件全部拷贝过来。以后启动netbeans进行程序开发就行了,所做调整都会自动反应在本地服务器上,可以通过浏览器访问localhost查看效果。

六、原来用的是官方的svn命令行工具,这次尝新,安装了图形化界面的tortoisesvn使用。进入netbeansproject下的wordpress的statpresscn插件目录下,把内容全部删除,退回上一级目录,用鼠标选中statpresscn目录,右键弹出菜单中选择checkout,在弹出的窗口中输入http://svn.wp-plugins.org/statpresscn/trunk (一定记得最后的那个trunk,否则它会给checkout整个svn repository),checkout下来。你会看到statpresscn目录的图标自动被tortoisesvn接管了,如果里面的源码文件有改动,图标会做相应显示,想把修改后的文件提交至服务器,右键选择相应svn命令就行了。 至此,本机的wordpress插件开发系统已经构建完毕,可以正常运转了。这两个月有不少朋友对statpresscn提了很好的建议,终于可以逐步实现它们了。

通过插件在《head/》中写入css和js文件

想借助jQuery提升StatPressCN的表现性能,阅读文档过程中突然想到一个问题。jQuery以及自己拟写的js文件需要在<head/>中载入,但wordpress封闭了页面的生成过程,这就意味着用户访问时产生的页面都是通过wp自动生成的,那我怎么有机会引入自己写的css或js文件呢?

后来想应该有hook可以挂接的。查询研读codex并通过研究其他插件的做法(比如wp-stats),果不其然,万能的wp果然提供了这些接口。

先看下wp-stats的做法。

### Function: Enqueue Stats Stylesheets
add_action(‘wp_print_styles’, ‘stats_stylesheets’);
function stats_stylesheets() {
if(!function_exists(‘pagenavi_stylesheets’)) {
if(@file_exists(TEMPLATEPATH.’/stats-css.css’)) {
wp_enqueue_style(‘wp-stats’, plugins_url(get_stylesheet_directory_uri().’/stats-css.css’), false, ‘2.50’, ‘all’);
} else {
wp_enqueue_style(‘wp-stats’, plugins_url(‘wp-stats/stats-css.css’), false, ‘2.50’, ‘all’);
}
}
}
给wp_print_styles添加了一个动作,这个动作通过wp_enqueue_style把自定义的css给链入了html的head部分。稍作修改在StatPressCN中测试,查看源码显示如下:《link rel=’stylesheetid=’statpresscn-csshref=’http://localhost/wp-content/plugins/statpresscn/statpresscn.css?ver=1.7.3.0′ type=’text/cssmedia=’all‘ /》。引入成功。

wp_enqueue_style的功能是“把一个css样式文件纳入队列(显示)”,语法wp_enqueue_style( $handle, $src, $deps, $ver, $media ),handle指的是样式表的名称(必填);src是相对根目录的路径,取值可以是字符串也可以是布林值;deps是指该样式表需要依赖的其他样式表列表,取值应该是数组;ver是指样式表的版本号,意在通知客户端浏览器采用新的样式表;media指该样式表的媒体类型。

样式表加载的相关函数有四个:显示,注册,注销和队列。WP_Styles – CSS stylesheet loading (and functions wp_print_styles, wp_register_style, wp_deregister_style, wp_enqueue_style )

js脚本的载入方法和css类似,仅仅是名称随之换成了scripts而已。WP_Scripts – JavaScript loading (and functions wp_print_scripts, wp_register_script, wp_deregister_script wp_enqueue_script)。

但脚本的加载因为兼容性等原因,要比样式表复杂一些。挂接点一般在init而不是wp_head(可能也行,但我测试没有成功),另外就是对jQuery的调用。因为wordpress系统自身是支持jQuery的,需要使用的时候声明一下就行了,如果想用自己想要的其他版本,那就先注销wp系统的那个,再注册自己的那个。测试成功的代码如下:

// Function: Enqueue StatPressCN javascripts

function spcn_javascripts() {

if (function_exists(‘wp_enqueue_script’)) {

wp_enqueue_script(‘jquery’);

wp_enqueue_script(‘statpresscn’, plugins_url(‘statpresscn/statpresscn.js’), array(‘jquery’), SPCVERSION);

}

}

add_action(‘init’,’spcn_javascripts’);

从测试效果看,在页面的head部分确实是先引入了jquery,然后才是statpresscn.js。因为wp给jQuery设置了防冲突模式,在调用对象的时候不能直接向平常那样通过$调用。要用平常习惯的方式的话,需要做些封装传递
jQuery(document).ready(function($) {
$(‘#statpresscn  li:nth-child(odd)’).addClass(‘gray’);
});
wordpress官方文档中一些参考资源很不错,值得一看。

StatPressCN,1.7.1.9版本

功能开发:

  1. 无。

代码改进:

  1. 为详情增加了周期定制选项(在选项中设置),可以拿最近一天、一周、两周和整体统计做比较,更方便看出当前的趋势。
  2. 访问统计时段增加了两周、一周的选项,同时删除了永不删除选项,一直统计下数据库会越来越大(可能超过百兆),给服务器造成很大负担。

规则定义:

  1. 增加了对ucweb以及移动Google搜索规则的支持。

下载升级:

  • 请到wordpress官方插件网址下载最新版本,ftp到服务器上去;
  • 或者,如果您的wordpress是2.7版本以上的,那就耐心等段时间(大约几个小时吧),管理后台会自动提示升级的。

升级需做:

  • 无。

开发笔记

匆忙升级,update_option居然少了个参数,谢谢P45camp朋友的支出。

StatPressCN,1.7.0.3版本

功能开发:

  1. 添加404页面子菜单,显示没有找到结果(可能是blog链接错误,也有可能是浏览者输入了错误的网址,或者是恶意访问,比如hacker)的访问记录,一方面提高统计准确度(去掉了无效访问),另外还可以给高级用户提供网站的全面被访情况,方便作出应对(比如可以把某些恶意访问的ip拉入禁止ip清单中);更新了统计规则,不再处理404页面访问,统计结果更精确;
  2. 对子菜单进行梳理,简洁化,默认不再显示export、banip、spider、update,这些功能模块作为高级功能,如果需要,可以在option中选择启用;
  3. 在统计系统升级中增加了对404访问记录的处理,可以选择全部删除之;
  4. 对搜索功能进行丰富,增加了一个维度,可以查询更多的信息;
  5. 丰富了移动来访的定义规则,新增了对联想(Lenovo)手机的支持。

代码改进:

  1. 调整StatPressCN插件挂入的地方,原来是send_header,现在调整为template_redirect,解决了404页面无法判断的问题;
  2. 给统计数据库增加了一个字段statuscode,记录http的返回码,比如404;对每次访问的记录都会提前检查数据库结构,因为改变了数据库结构;
  3. 修正了对帖子id的判断方法,可以正确识别文章标题中包含中文等字符的链接并正确显示;
  4. 忽略掉对/wp-comments-post.php的记录,这个是留言时自动调用的管理函数页面。

下载升级:

  • 请到wordpress官方插件网址下载最新版本,ftp到服务器上去;
  • 或者,如果您的wordpress是2.7版本以上的,那就耐心等段时间(大约几个小时吧),管理后台会自动提示升级的;
  • 提示升级至本版本会影响数据库中的数据记录

开发笔记

在检测404页面访问的时候花了n长时间都无法获得准确的数据,明明页面不存在,但http的statuscode却显示为200。后来仔细查阅了很多资料都不得其法,最后还是参阅了mystat的代码才找到了合适的入口,那就是template_redirect,也即是模板主题文件调用前。如果有时间还是需要把wordpress的运作机制彻底弄懂。

对非常规(可能合法也可能不合法)的页面访问很重要。原来一直想开发一个功能,能自动禁止那些恶意访问,比如对后缀名mdb文件的访问(明显是想借助某些漏洞拿到me的数据库嘛),但这个功能实现的前提是能判断页面是否被正常访问了。wordpress有自己的机制处置这些问题,那就是is_404()函数。这个大问题解决后就可以构建自动防护系统了。

统计插件的易用性也是个重要考量的地方。这次把高级功能默认不显示,对新手来讲应该是个好事。他们本来不需要、也不想了解那么多后台底层的事情的。

数据库中数据的平滑顺接也是个问题。这次改变了数据库结构,只好在每次登入数据的时候都检查下数据库结构是否是最新的,也算是升级的一种代价吧。

StatPressCN,1.7.0.2版本

功能开发:

  1. 添加卸載功能;
  2. 对选项页面重新排版,按照类型归类显示:前端设定、后台设定、系统设定;
  3. 丰富了移动来访的定义规则,新增了Google的两个mobile搜索;
  4. 修正了初次安装时lastmonth显示错误的bug,感谢Lucky朋友的提醒。

代码改进:

  1. 更新了部分本地化语言。

下载升级:

  • 请到wordpress官方插件网址下载最新版本,ftp到服务器上去;
  • 或者,如果您的wordpress是2.7版本以上的,那就耐心等段时间(大约几个小时吧),管理后台会自动提示升级的;
  • 提示:升级至本版本不会影响数据库中的数据记录。

升级需做:

  • 无。

开发笔记

lastmonth的错误原因在于没有考虑关键点、变化点的处置,一般来讲,变化点会出现在首次安装使用,月份变迁、年份变迁,停止使用等。这些时候,都要认真评估可能产生的影响和变化,否则就会犯错。

卸载功能的提供是为了做一个负责任的、真正方便使用者的插件。可以做到完全不留任何垃圾数据的卸载,可以通过设定清理掉option中的所有相关数据,甚至包括整个统计数据表都可以被drop掉,干干净净,彻彻底底。感觉将来有一点,wordpress会规范卸载功能的,而不像目前这样,随大家的意思来,可以做也可以不做,对用户不好,因为会莫名其妙的留下一下垃圾,并且几乎没有机会清除掉。