Hpyer 的未知空间

国家/州/市及省/市/区三级联动JS代码

Posted by Hpyer on 星期一, 三月 26th, 2012

最近做项目要用到城市三级联动的JS程序,但是本人手头只有之前从扣扣上取得的脚本,然而这个脚本的数据是全世界城市的,而项目则需要国内的城市,且需要详细到县市区的,显然原来的数据不适合。 在询问了许久的谷歌和度娘后,终于找到了一份比较全的国内省市区的数据,按照原来数据的格式将其修改成了进行修正,以让现有的脚本可以完美的支持。 这样以来,只要让不同的项目读取所需的数据即可,足以满足日常的应用。 然而有时我们可能需要将城市信息直接输出,而不是以下拉列表的形式呈现给用,所以本人又对脚本做了优化,使之只需简单设置即可这一功能,也可以定义各个下拉列表的名称,也可以支持多语言(数据须后期再翻译)。 演示地址 http://demo.hpyer.cn/js/LocalList/ 下载地址 使用方式 <script type="text/javascript" src="LocalList.js"></script><script type="text/javascript">// 全世界数据var options = {    country: ‘country’,        // “国家”下拉列表的名称    state: ‘state’,            // “州”下拉列表的名称    city: ‘city’,            // “城市”下拉列表的名称    current: ‘CHN|33|1′,        // 当前默认值,用管道符“|”分割    language: ‘zh_cn’,        // 数据文件的语言   [...]

continue reading

POTCreator – Gettext POT文件生成器

Posted by Hpyer on 星期三, 一月 18th, 2012

概要 / Summary 这是一个用于生成 GETTEXT 的 POT 文件的类,然后你就可以使用 Poedit 进行翻译啦。 – This class can help you to create a POT file for GETTEXT, Then you can translate it by Poedit. 网上找了很久,都没有找到这样的工具,于是乎自己写了一个,大家使用过程中有问题,可以在此回复。 – Please report bug here, thank you! 主页 / Home:http://hpyer.cn/codes/potcreator 用法 / Usage <?php// 包含类库 – Include the classinclude(‘POTCreator.php’); // 创建对象 – Create object$obj = [...]

continue reading

ECShop插件 – 会员签到送积分

Posted by Hpyer on 星期四, 十一月 10th, 2011

如何留住用户,提高用户的回头率,一直是各类网站的重要关注的问题,尤其是商城类网站。ECShop提供基本的会员功能,可以方便的注册、购买、收藏,但是却没有足够留住老用户的功能。或许您会说其本身有用户推广分成的功能,但是又有多少商家会开通呢?本文介绍的就是这么一款具有该方面功效的ECShop插件——会员签到送积分。 效果图: 注:该图只是效果图,需买家提供与您网站切合的样式、图片等。 该插件具有如下功能: 支持每天赠送相同积分 支持递增积分赠送(即第二天赠送的积分比第一天多) 支持后台设置 支持任意位置添加签到按钮 现在购买本插件,您还可以得到: 帮助完成插件安装(需提供临时的FTP及后台的账号、密码),并调试完成 永久享受本插件的后续升级、修复服务(如:淘宝数据包升级而引起的功能失效等) 插件价格 100.00 RMB 注:此价格只包含前文所述的功能及服务,若需额外增加的朋友请联系站长协商。 购买方式 本站支持支付宝、财付通的担保交易,需要的朋友请即刻联系站长,以便提供购买链接给您。

continue reading

解析 WordPress 插件机制

Posted by Hpyer on 2008-10-24 - 8,994 Views - 12 Comments

  一直对软件的组件、插件架构非常感兴趣,我认为现在开发任何应用程序,一定要有一个架构良好的插件机制,这样可以吸引其他人来开发插件,极大的扩充系统的功能。Eclipse就是一个非常棒的例子,几乎你想什么功能,都可以从社区中找到相应的第三方插件。Firefox也同样如此,它的插件机制非常灵活(尤其是相对IE而言),因此Firefox社区中可以找到各种各样的插件。

1)WordPress读取所有可用的插件

  在文件“/wp-admin/includes/plugin.php”中,函数 get_plugins() 用来从文件系统得到所有的插件。原理很简单,就是读取“wp-content/plugins”目录下的所有PHP文件。这个函数允许一级的子文件夹,也就是说在’wp-content/plugins’下面的PHP文件,以及所以在此目录下的一级子文件夹内部的PHP文件被列作插件的候选,用下面的函数去进一步提取插件信息。这样的好处是方便用户利用文件夹来对插件进行管理和组织。
  而函数 get_plugin_data() 则用来得到插件的描述(Plugin Descriptor),主要包括插件的版本、名称、作者,等信息,而这些其实是以注释的方式存在的。用WordPress中自带的Hello插件来举例:

<?php
/*
Plugin Name: Hello Dolly
Plugin URI:
http://wordpress.org/#
Description: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from <cite>Hello, Dolly</cite> in the upper right of your admin screen on every page.
Author: Matt Mullenweg
Version: 1.5
Author URI:
http://ma.tt/
*/

?>

这样,在get_plugin_data函数中,就可以来得到插件的详细信息。

<?php
function get_plugin_data( $plugin_file ) {
    
$plugin_data = implode( '', file( $plugin_file ));
    
preg_match( '|Plugin Name:(.*)$|mi', $plugin_data, $plugin_name );
    
preg_match( '|Plugin URI:(.*)$|mi', $plugin_data, $plugin_uri );
    
preg_match( '|Description:(.*)$|mi', $plugin_data, $description );
    
preg_match( '|Author:(.*)$|mi', $plugin_data, $author_name );
    
preg_match( '|Author URI:(.*)$|mi', $plugin_data, $author_uri );
 
    
if ( preg_match( "|Version:(.*)|i", $plugin_data, $version ))
        
$version = trim( $version[1] );
    
else
        
$version = '';
 
    
$description = wptexturize( trim( $description[1] ));
 
    
$name = $plugin_name[1];
    
$name = trim( $name );
    
$plugin = $name;
    
if ('' != trim($plugin_uri[1]) && '' != $name ) {
        
$plugin = '<a href="' . trim( $plugin_uri[1] ) . '" title="'.__( 'Visit plugin homepage' ).'">'.$plugin.'</a>';
    
}
 
    
if ('' == $author_uri[1] ) {
        
$author = trim( $author_name[1] );
    
} else {
        
$author = '<a href="' . trim( $author_uri[1] ) . '" title="'.__( 'Visit author homepage' ).'">' . trim( $author_name[1] ) . '</a>';
    
}
 
    
return array('Name' => $name, 'Title' => $plugin, 'Description' => $description, 'Author' => $author, 'Version' => $version);
}
?>

2)启用 & 禁用插件

  启用(禁用)插件的操作都在Plugins.php中,比如我要Deactive “Hello”这个插件,最后的URL其实是这个样子:

http://localhost/blog/wp-admin/plugins.php?action=deactivate&plugin=hello.php

  其中,“Action”表示动作,值为“active”或者“deactivate”,而“Plugin”表示动作的对象插件,此处为“hello.php”。得到动作指令后,首先从数据库中取出当前已经激活的插件。

<?php $current = get_settings('active_plugins'); ?>

  然后根据动作,重新生成已激活插件数组,存入数据库,并重新加载此页。加载的时候就需要考虑这些已经激活的插件是怎么工作的了。
BTW:附上数据库的Options表中0插件和只有1个插件的值:
没有插件:

a:1:{i:0;s:0:"";}

只有Hello插件:

a:2:{i:0;s:0:"";i:1;s:9:"hello.php";}

3)如何加载启用的插件到系统中

  WordPress中的每页都会包含“wp-config.php”文件,而“wp-config.php”中也会自动加载“wp-settings.php”文件。在“wp-settings.php”文件中,可以找到以下与插件相关的代码片断:

<?php
if ( get_option('active_plugins') ) {
    
$current_plugins = get_option('active_plugins');
    
if ( is_array($current_plugins) ) {
        
foreach ($current_plugins as $plugin) {
            
if ( '' != $plugin && 0 == validate_file($plugin) && file_exists(WP_PLUGIN_DIR . '/' . $plugin) )
                
include_once(WP_PLUGIN_DIR . '/' . $plugin);
        
}
    
}
}
?>

  可见,这段代码会取出系统中所有启用的插件,并包含进来。所以在每页加载的时候,都会首先包含这些插件代码。那么,这些插件自己在加载的时候都做了什么呢?

4)插件的加载

  插件的加载其实最重要的一个部分就是插件的事件注册机制,WordPress插件中的事件注册其实和Eclipse中的扩展点(Extension-Point)机制非常相像,而这种类似“插销”、“插销座”的软件插拔方式也成为了最近软件组件架构方面应用最多的实践。
  事件注册过程中比较重要的几个函数分别是:do_action、add_action、add_filter。WordPress中默认定义了很多扩展点(也可以叫做“钩子”),或者说注册了很多系统事件(WP中的正规叫法应该是“Action Tag”),比如“admin_head”表示Admin页面的Head输出事件,“publish_post”表示发布一篇帖子的事件等等。而插件要做的就是扩展这些扩展点,或者说挂接这些钩子,从而实现系统的扩展功能。add_action就是通常插件扩展某个扩展点用到的函数,而do_action 是扩展点本身开始执行的函数。
  刚才说过WordPress中的每一页执行前都会Include所有Active的插件代码,而这些代码通常都会用“add_action”来将自己的函数注册到系统的扩展点中。这样,在扩展点执行的时候,就会找到系统中所有已经挂接到这个扩展点上的插件的函数来执行之,从而扩充系统的功能。
  WordPress中的很多功能也都是通过这种插件结构来实现的,默认注册了很多系统事件,都在’default-filter.php’中。比如:

<?php add_action('publish_post', 'generic_ping'); ?>

这个是用来在发布每篇帖子的时候发送XML-RPC Ping的。再比如:

<?php add_filter('the_content', 'convert_smilies'); ?>

用来将正文(content)中的笑脸符号转换为图像。
  还是举“Hello”插件来说。Hello插件会随机的在Admin Page的右上角显示一段话,它的工作原理是这样的:
  在每一个Admin page的前面都有

<?php require_once('admin-header.php'); ?>

  而在“admin-head.php”中将会执行扩展点“admin-head”的所有扩展:

<?php do_action('admin_head', ''); ?>

  这样,就会执行所有挂接到admin_head的函数,Admin Page 的 Footer 部分也是类似。

5)如果插件中涉及UI

  其实是一样的。以WordPress FeedBurner Plugin中添加菜单为例。
  如果想添加一个菜单,就需要注册“admin_menu”这个Action Tag(系统事件)即可:

<?php add_action('admin_menu', 'ol_add_feedburner_options_page'); ?>

  插件中的这个函数为:

<?php
function ol_add_feedburner_options_page() {
    
if (function_exists('add_options_page')) {
        
add_options_page('FeedBurner', 'FeedBurner', 8, basename(__FILE__), 'ol_feedburner_options_subpanel');
    
}
}
?>

  “add_options_page”这个函数就会在系统的“Options”菜单中添加“FeedBurner”这样一个子菜单。

6)其它

  还有一些简单的插件就是只提供一些API函数。比如Most_Commented Plugin,它提供一个API “mdv_most_commented”:通过数据库查询得到评论最多的文章,并加以显示。因为这个插件已经被Include过,所以可以用这个API来进行显示。

Posted in: WordPress 应用.

12 Responses to “解析 WordPress 插件机制”

  1. 这么好的文章。。。转载了

  2. @SusanSays, 这个。。。我也是转来的~~ R|

  3. [...] 转载自:http://hpyer.cn/dissect-wordpress-plugin.html [...]

  4. [...] 解析Wordpress插件机制 [...]

  5. 支持,学习,学习

  6. [...]  原文链接  一直对软件的组件、插件架构非常感兴趣,我认为现在开发任何应用程序,一定要有一个架构良好的插件机制,这样可以吸引其他人来开发插件,极大的扩充系统的功能。Eclipse就是一个非常棒的例子,几乎你想什么功能,都可以从社区中找到相应的第三方插件。Firefox也同样如此,它的插件机制非常灵活(尤其是相对IE而言),因此Firefox社区中可以找到各种各样的插件。 1)WordPress读取所有可用的插件 [...]

  7. [...] 原文出自:http://hpyer.cn/dissect-wordpress-plugin.html 一直对软件的组件、插件架构非常感兴趣,我认为现在开发任何应用程序,一定要有一个架构良好的插件机制,这样可以吸引其他人来开发插件,极大的扩充系统的功能。Eclipse就是一个非常棒的例子,几乎你想什么功能,都可以从社区中找到相应的第三方插件。Firefox也同样如此,它的插件机制非常灵活(尤其是相对IE而言),因此Firefox社区中可以找到各种各样的插件。 [...]

  8. [...] 今天看到一篇对wordpress做二次开发非常有用的文章,在这个论坛好象还没有看到,故转过来与大家分享一下: 原文出自:http://hpyer.cn/dissect-wordpress-plugin.html [...]

  9. [...] 8 Comments Write a comment Did you enjoy this article? Share it or give it a [...]

  10. [...] 解析 WordPress 插件机制 [...]

  11. 不错转发了

  12. [...] 解析 WordPress 插件机制 发表于 09月 26, 2011 ,作者: 张 迪 转发自 http://hpyer.cn/dissect-wordpress-plugin.html?wpc=dlc#comment-7144 [...]

Leave a Reply

About | Contact | Guestbook | Archives | Sitemap

如果您觉得本站的文章有帮助,并且条件允许的话,希望您能慷慨捐赠,以支持本站更好的发展。非常感谢!