WP-Douban-Post发布后记

距离WP-Douban-Post发布已经有差不多两个月了。总想写点什么总结一下。

缘由

说起来初衷很简单。我的博客可以同步到twitter,新浪,就差同步到豆瓣上了。受不了每次人肉同步的繁琐,又没找到合适的现成wordpress插件,又打算学习一下Oauth+Douban APIWordPress Plugin的各种技术,袖子管一卷咱就干了起来。

过程

前后大概花了一周的业余时间,大概按照如下的步骤走了一遍,总算是客服了重重难关,完成了这个插件。
1)Wordpress Hello World Plugin (了解Wordpress插件结构)
2)Wordpress Option Page(了解添加配置选项,存取数据库,添加事件响应)
3)Douban Oauth (Douban Zend Client太复杂,只好自己用php oauth library。自己拼接header,测试MD5验证,多谢Douban API支持,这部分是最艰辛的)
4)Douban API 调用(真正开始调用API,发送自己的记录到我说)
5)WP-Douban-Post (拼装完成,达达达搭)

推广

说是推广其实是抬举了自己。自己作了好用当然是想广而告之显摆一下。第一个想到的自然就是wordpress.org插件库。如果可以在Plugins里面搜索到自己的名字,想想就威风。
提交开发者申请,编写README,提交代码。所有的步骤都有清楚的指南。Wordpress.org基于SVN的发布系统让我大开眼界,收益非浅。
1)通过README提取插件信息,例如作者信息,安装指南,Q&A,对开发人员和wordpress.org都是方便清楚。
2)建议开发者拉branch进行发布,通过README元信息指定发布的具体branch.通过这样的最佳实践直接帮助开发者分清了发布和开发的代码。清晰明了。

然后就是更新豆瓣应用信息,在豆瓣API小组发贴庆祝。然后就是每天刷屏期待了。。。这就是我做的推广-,-。大概的情形趋势图上都清清楚楚。
1)2011-01-19,推荐给了几个用豆瓣也用Wordpress的朋友,小推销了一把,迎来了下载高峰。
2)2011-01-21 to 2011-02-12,春节期间,下载量逐渐走低。。。。
3)2011-02-13 to 2011-02-20,春节结束,赢了小小的反弹。。。。
4)2011-02-21 to 2011-03-20, 大概可以看出周末基本没有下载,工作日偶尔有人。。
5)2011-03-25, 豆瓣有了应用小站,很荣幸被发布了出来,还被表扬了^@^,也迎来了之后小小的高峰。。。

没有什么特别的期待,有人用,觉得有用大概就是对我最大的夸奖了。呵呵。欢迎提意见给我。

后记

1)听说豆瓣九点可以自动收录wordpress,我那叫一个后悔啊。新手不会玩豆瓣,sigh。
2)想要php调用douban Oauth的同学,可以参考我在wordpress.org上的代码,这可是汗水和泪水啊-,-
3)wordpress.org的缺点也很明显,一定需要wordpress.com的账号才能rate和vote,这导致基本没人回来给意见。

WordPress.org 地址

http://wordpress.org/extend/plugins/wp-douban-post/stats/

Douban应用小站 地址

http://site.douban.com/widget/notes/2324209/note/141570144/

WP-Douban-Post Stats 2011-03-26

WP-Douban-Post Stats 2011-03-26

, , ,

2 Comments

在Linode上安装openVPN

一些朋友需要VPN访问一些墙外资源。本着服务器放着不用是浪费的原则我决定搭一个VPN服务器帮助解决朋友的需求。
不得不说Linode的文档非常齐全,而且很傻瓜,照着作一遍基本解决了所有的问题。

openVPN安装

Ubuntu方便是没话说的。

apt-get update
apt-get upgrade --show-upgraded
apt-get install openvpn udev

这就是所有你需要的软件了。安装包里提供了密钥工具包“easy-rsa”,把它拷贝到配置文件夹下。

cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn

修改工具包中的文件vars,按照你的需要配置相关信息

export KEY_COUNTRY="US"
export KEY_PROVINCE="OH"
export KEY_CITY="Oxford"
export KEY_ORG="Ducklington"
export KEY_EMAIL="squire@ducklington.org"

配置你的密钥体系

首先需要初始化PKI.

cd /etc/openvpn/easy-rsa/2.0/
source . /etc/openvpn/easy-rsa/2.0/vars
. /etc/openvpn/easy-rsa/2.0/clean-all
. /etc/openvpn/easy-rsa/2.0/build-ca

接着生成服务器私钥。会有一些问题和提示,选择默认和Y就可以了。

. /etc/openvpn/easy-rsa/2.0/build-key-server server

然后是生成客户端的证书.其中client1是证书的名字,你可以按照你的需要填写。如果需要生成多个客户端证书,重复该步骤就可以了。

. /etc/openvpn/easy-rsa/2.0/build-key client1

最后生成Diffie Hellman Parameters。

. /etc/openvpn/easy-rsa/2.0/build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time

如果一切正常,会出现如上所示的信息。
密钥的配置基本就是这样,最后把生成的密钥文件和easy-rsa提供的服务器端配置文件样本拷贝到配置文件夹下。

cd /etc/openvpn/easy-rsa/2.0/keys
cp ca.crt ca.key dh1024.pem server.crt server.key /etc/openvpn

cd /usr/share/doc/openvpn/examples/sample-config-files
gunzip -d server.conf.gz
cp server.conf /etc/openvpn/
cp client.conf ~/
cd ~/

配置openVPN链接

密钥的配置保证了客户端和VPN服务器的链接。还要配置openVPN对网络包地转发规则。
修改/etc/openvpn/server.conf,添加如下语句

push "redirect-gateway def1"

修改/etc/sysctl.conf,添加如下语句

net.ipv4.ip_forward=1

为VPN会话添加下列变量。

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

为了保证每次启动这边规则都生效,可以把后面四个语句添加到/etc/rc.local中去。
除了IP包地转发规则,我们还需要处理来自客户端的dns请求,安装dnsmasq来解决这个问题。

apt-get update
apt-get install dnsmasq

修改/etc/openvpn/server.conf,添加如下语句

push "dhcp-option DNS 10.8.0.1"

OK,一切搞定,启动openVPN服务吧。

/etc/init.d/openvpn restart

客户端的使用

Mac下的openVPN客户端
http://code.google.com/p/tunnelblick/
Windows下的openVPN客户端
http://openvpn.se/download.html
将上文生成的client.conf, ca.crt, client1.key, client1.crt拷贝到你的电脑,配合客户端使用即可。

参考连接

http://library.linode.com/networking/openvpn/ubuntu-10.04-lucid

推荐连接

有兴趣的朋友可以使用我的referral链接注册使用Linode,将获得10%的优惠。
http://www.linode.com/?r=513a31440dd0a6c0980cc05a164b4ae2520a19d6

, , ,

No Comments

WordPress搬家记

Hostmonster的两年租约转眼到期了。想当年4刀每月如今已经涨到了6刀每月,感慨之际只好把东西通通往Linode这边搬。希望这次可以坚持的更长。
Hostmonster上需要搬的也就一个wordpress,其中有经历了一些问题,记录下来也算是经验。
之前已经把domain transfer搞定了,所以主要就是程式的挪动。大致的搬家过程主要分三步。

数据库搬家

不得不说mysqldump还是很方便的。对于我这种要求不高,只求没数据遗留的人来说超级方便。

mysqldump wordpress > wordpress.sql

然后在linode上直接导入数据库就好了

mysql -u xxx -p
create database wordpress character set utf8;
exit
mysql -u xxx -p -D wordpress < wordpress.sql

WordPress搬家

我的hostmonster和Linode都开通了SSH服务。所以php文件搬家直接就是一句话的事情。

scp -rf blog/* xxx@tech4k.com:/path/

配置更新

wp-configs.php包含了wordpress的所有全局配置,搬过来以后要做对应的修改。我的域名没有变,所以只需要对数据库配置修改就可以了。

define('DB_NAME', 'xxxxxx');^M
^M
/** MySQL database username */^M
define('DB_USER', 'xxxxxx');^M
^M
/** MySQL database password */^M
define('DB_PASSWORD', 'xxxxxx');^M
^M
/** MySQL hostname */^M
define('DB_HOST', 'xxxxxxxx');^M



除了这三步之外还有一些小地方的注意事项,也许不适合你的案例,但是注意一下总归没错。

用户和用户组,以及权限

scp搬过来的所有文件的用户和用户组信息都会被修改,一开始完全没有办法更新插件。之后才发现这个问题的。这里的用户必须是apache的执行用户,这样才不会有问题。

chown -R aaa:xxx *

设置上传路径

在wordpress的管理界面中,需要设置一个上传路径,这样才可以自动从wordpress.org上自动下载插件。
Settings -> Media -> Store uploads in this folder
需要注意的是该文件夹需要权限配置可写。

sitemap.xml&sitemap.xml.gz配置

我使用了XML-Sitemap这个插件,方便好用。该插件需要根目录下的sitemap.xml和sitemap.xml.gz可写。

遗留问题

timer启动

理论上有些插件需要在插件激活的时候启动一些后台Timer定时完成任务的。不是很清楚我这样的搬家方法会不会对这种插件有问题。

Permalink配置

我现在的Permalink有问题。只能通过/?p=%post_id%来访问,不能通过/archive/%post_id%这种方式访问。添加了.htaccess也确认可写之后仍然有这个问题。还需要进一步研究。

搬家总是很麻烦,皑皑,感叹一下。

2 Comments

WordPress Ajax Widget开发

本篇文章是紧接上一篇WordPress 2.8+ Widget 插件开发.
自己开发得一个小工具 WP Dict需要调用服务器端方法查询单词,但是个人觉得页面跳转的用户体验不好,所以小研究了一把ajax的实现方法而且试验成功,特此记录。

注册服务端方法


function wp_dict_request_handler() {
}
add_action('init', 'wp_dict_request_handler');

比想象的更加简单,Wordpress可以通过add_action注册自己的服务器端方法,所有页面均可调用。唯一需要注意的是方法名需要保证唯一。

注册jquery

在Widget类的构造方法中添加如下语句。

// Load jQuery
wp_enqueue_script('jquery');

获得Widget ID

在widget()方法extract方法后天添加如下语句。

function widget( $args, $instance ) {
extract( $args );
// Get the div id of the widget
$widgetid = $args['widget_id'];
。。。
}

Ajax实现

在Widget的显示内容部分($after_title,$after_widget之间)添加ajax调用代码。

echo $after_title;
?>
<script type="text/javascript">
jQuery(document).ready(function($){
$("#wp_dict_submit").click(function(){
$.ajax({
type : "GET",
url : "index.php",
data : { mywidget_request : "wp_dict_request_handler",
query : $("#wp_dict_query").val() },
success : function(response) {
// The server has finished executing PHP and has returned something,
// so display it!
$("#wp_dict_result").html(response);
}
});
});
});
</script>
<?php

/* After widget (defined by themes). */
echo $after_widget;

基本就是jQuery调用ajax的典型用法。不过这里有几点针对wordpress的说明

  • url参数其实可以是任意有效的php路径。
  • mywidget_request配置的就是之前注册的方法名。
  • mywidget_request之后的都是自定义的参数,这里我需要一个query的单词名。

最后

按照普通Widget的要求,把widget添加之后,就可以在页面看到并使用了。相当方便。

遗留问题

WP Super Cache会把页面内容转化成静态HTML,所以Ajax会破坏这个机制。参考资料中另外一篇文章,不过还没有时间学习。

参考资料

AJAX-ifying WordPress Widgets
Make Any Plugin Work with WP Super Cache

, , ,

No Comments

WordPress 2.8+ Widget 插件开发

WordPress 2.8.0之后的版本对Widget提供了一套详细的API规范。貌似和水煮鱼团队的范例有很大区别。

加载Widget


<?php

/* Add our function to the widgets_init hook. */
add_action( 'widgets_init', 'example_load_widgets' );

/* Function that registers our widget. */
function example_load_widgets() {
register_widget( 'Example_Widget' );
}

Wordpress 2.8以上的版本中,widgets_init事件会在wordpress注册默认widgets之后被触发。Example_Widget是具体实现widget的类名。

配置你的Widget


function Example_Widget() {
/* Widget settings. */
$widget_ops = array( 'classname' => 'example', 'description' => 'An example widget that displays a person\'s name and sex.' );

/* Widget control settings. */
$control_ops = array( 'width' => 300, 'height' => 350, 'id_base' => 'example-widget' );

/* Create the widget. */
$this->WP_Widget( 'example-widget', 'Example Widget', $widget_ops, $control_ops );
}

这里主要配置的Widget的一些基本信息,例如标识符,描述,以及大小等信息。

显示你的Widget


function widget( $args, $instance ) {
extract( $args );

/* User-selected settings. */
$title = apply_filters('widget_title', $instance['title'] );
$name = $instance['name'];
$sex = $instance['sex'];
$show_sex = isset( $instance['show_sex'] ) ? $instance['show_sex'] : false;

/* Before widget (defined by themes). */
echo $before_widget;

/* Title of widget (before and after defined by themes). */
if ( $title )
echo $before_title . $title . $after_title;

/* Display name from widget settings. */
if ( $name )
echo '<p>Hello. My name is' . $name . '.</p>';

/* Show sex. */
if ( $show_sex )
echo '<p>I am a ' . $sex . '.</p>';

/* After widget (defined by themes). */
echo $after_widget;
}

Wordpress 2.8以上的版本中,规定了function widget( $args, $instance )这个接口。这个接口专门用来实现widget的显示内容的。其中extract( $args );是标准用法,只需要添加就可以了。除此之外Wordpress还提供了四个标准变量用来区分显示的阶段:$before_widget, $after_widget, $before_title, and $after_title。最后$instance是用来获取Widget本身实例属性的。Widget实例属性的操作会在后面提到。

Widget配置页面

在Widgets页面中添加了某个Widget之后可以配置该Widget的实例属性。

function form( $instance ) {

/* Set up some default widget settings. */
$defaults = array( 'title' => 'Example', 'name' => 'John Doe', 'sex' => 'male', 'show_sex' => true );
$instance = wp_parse_args( (array) $instance, $defaults ); ?>
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>">Title:</label>
<input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" style="width:100%;" />
</p>
<p>
<label for="<?php echo $this->get_field_id( 'name' ); ?>">Your Name:</label>
<input id="<?php echo $this->get_field_id( 'name' ); ?>" name="<?php echo $this->get_field_name( 'name' ); ?>" value="<?php echo $instance['name']; ?>" style="width:100%;" />
</p>
<p>
<label for="<?php echo $this->get_field_id( 'sex' ); ?>">Sex:</label>
<select id="<?php echo $this->get_field_id( 'sex' ); ?>" name="<?php echo $this->get_field_name( 'sex' ); ?>" class="widefat" style="width:100%;">
<option <?php if ( 'male' == $instance['format'] ) echo 'selected="selected"'; ?>>male</option>
<option <?php if ( 'female' == $instance['format'] ) echo 'selected="selected"'; ?>>female</option>

</p>
<p>
<input class="checkbox" type="checkbox" <?php checked( $instance['show_sex'], true ); ?> id="<?php echo $this->get_field_id( 'show_sex' ); ?>" name="<?php echo $this->get_field_name( 'show_sex' ); ?>" />
<label for="<?php echo $this->get_field_id( 'show_sex' ); ?>">Display sex publicly?</label>
</p>
<?php
}
?>

Wordpress提供了标准接口function form( $instance ) 用来显示该配置页面的内容。方法中主要包含两个部分。

  • 第一部分配置了所有实例属性的默认值。
  • 第二个部分是配置页面的显示内容。

更新Widget实例属性


function update( $new_instance, $old_instance ) {
$instance = $old_instance;

/* Strip tags (if needed) and update the widget settings. */
$instance['title'] = strip_tags( $new_instance['title'] );
$instance['name'] = strip_tags( $new_instance['name'] );
$instance['sex'] = $new_instance['sex'];
$instance['show_sex'] = $new_instance['show_sex'];

return $instance;
}

Wordpress提供了标准接口function update( $new_instance, $old_instance )用来处理实例属性的更新。更新的内容直接设置在$instance中就可以了。不需要直接操作数据库。

总结

这就是所有开发正常widget所需要了解的内容了。快动手吧。

参考资料

http://codex.wordpress.org/Widgets_API
The complete guide to creating widgets in WordPress 2.8

, , , ,

No Comments

WP-Dict version 1.0.0 released

=== Plugin Name ===
Contributors: windlx
Donate link: http://blog.tech4k.com/
Tags: dict, translation, wp-dict
Requires at least: 2.8
Tested up to: 3.0.4
Stable tag: 1.0.0

Widget Plugin. A widget could help to translate between English and Chinese.Take advantage of the API from dict.cn.

== Description ==

Widget Plugin. A widget could help to translate between English and Chinese.Take advantage of the API from dict.cn. Implimented by Ajax.

== Installation ==

  1. Unzip wp-douban-post to the ‘/wp-content/plugins/’ directory
  2. Activate the plugin through the ‘Plugins’ menu in WordPress
  3. Add ‘WP Dict’ in through the ‘Widgets’ menu in WordPress
  4. Any problem, please contact windlx from my blog.
  1. 解压后将文件上传到’/wp-content/plugins/’目录
  2. 在插件中激活wp-dict
  3. 在Widget中添加WP-Dict
  4. 如有问题,请通过我的博客windlx联系我

== Frequently Asked Questions ==

= What do I need before the installation? =

You don’t need anything. Dict.cn API is open to everyone.

= Why I can’t see WP Dict Widget from my ‘Widgets’? =

There is a build issue before 2011/01/23. If you used to install it, please delete the plugin and reinstall it. Everything will be fine.

== Screenshots ==

1. WP-Dict

== Changelog ==

= 1.0.0 =
Get the Translation of the words by Ajax.

== Upgrade Notice ==

= 1.0.0 =
Basic Version.

, ,

No Comments

WP-Douban-Post 1.0.0 Released

=== Plugin Name ===
Contributors: windlx
Donate link: http://blog.tech4k.com/
Tags: douban, post, douban-post
Requires at least: 2.0
Tested up to: 3.0.4
Stable tag: 1.0.0

Send one message to your douban broadcasting mysaying when you publish the post.

== Description ==

Send one message to your douban broadcasting mysaying when you publish the post.

== Installation ==

  1. Unzip wp-douban-post to the ‘/wp-content/plugins/’ directory
  2. Activate the plugin through the ‘Plugins’ menu in WordPress
  3. Visit WP Douban Post Options
  4. Click the button “Get Access Token”, it will open a new window for you to authorize WP Douban Post.
  5. Close the window after the authorization is done.
  6. The option page will refresh automatically. If everything works fine, you can see you Douban ID and access token.
  7. Next time when you publish the post, there will be one message sent to your Douban Broadcasting Mysaying.
  8. Any problem, please contact @windlx at Twitter.
  1. 解压后将文件上传到’/wp-content/plugins/’目录
  2. 在插件中激活wp-douban-post
  3. 访问WP Douban Post选项页
  4. 点击Get Access Token按钮, 会打开豆瓣网页,要求你对WP Douban Post应用进行授权。
  5. 授权结束后,点击Close按钮,关闭返回页面。
  6. 选项页会自动刷新,如果一切正常,页面会显示你的Douban ID, Acces Token和Access Token Secret.
  7. 如有问题,请通过新浪微博@windlx联系我

== Frequently Asked Questions ==

= What do I need before the installation? =

You need to have a Douban ID for authorization.

== Screenshots ==

1. WP-Douban-Post.

== Changelog ==

= 1.0.0 =
* Configuration Page in WordPress Admin
* Generate Douban Access Token
* Send one message to user’s Douban Broadcasting Mysaying when publish the post.

== Upgrade Notice ==

= 1.0.0 =
Basic Version.

参考插件
WP-DoubanShow
Douban Connect
Twitter Tools

, , , ,

No Comments

WordPress插件开发入门心得

WordPress用了一段时间,有了一些自己的需求。于是硬着头皮就自己做起了插件。眼见0.1.0总算要release了。把这一周的新的体会记录下来。当作是总结。

插件入门

强烈推荐水煮鱼团队的系列文章(见下面的参考),第一篇非常清楚的描述了Wordpress 插件入门的步骤。其实就是一个附带规定格式备注的php。还能更容易么?

/*
Plugin Name: XXXXXX
Plugin URI: XXXXXXXX
Description: XXXXXXXXXXXXXXXXX
Version: XXXXXXXX
Author: XXXXXXXX
Author URI: XXXXXXXX
*/

把上面的信息保存到php文件中,把php文件放到wp-content/plugins//下。你的插件就可以在Plugins列表中看到了。说实话,这一步超酷的,这也是吸引我做下去的关键一步。

Action and Filter

WordPress提供了丰富的API供开发者调用。其中核心的概念就是Action和Filter。
Action指的就是事件,发布博客,进入Admin页面,激活插件,这些都是action。Wordpress可以让开发者将这些action与自己实现的方法关联起来,从而在事件激发的时候能够完成自己的功能。
Filter指的就是过滤器。Wordpress可以让开发者通过注册filter的方式修改Wordpress地默认表现。例如自定义短链接,格式化标题等等。
参考资料中包含了Action和Filter的具体列表。

后台选项页

没想到如此的简单,三步就能完成。
一,注册Action,用户进入Admin页面的时候需要调用的方法。

add_action('admin_menu', 'plugin_name_options_admin');

二,用户进入Admin页面的时候需要具体显示的文字,注册打开选项页时调用的方法。

//Set option page for the plugin
function plugin_name_options_admin(){
add_options_page('wp_douban_post', __('XXXXXXXX, 'xxxxxxxxxxxxxx'), 5,
__FILE__, 'plugin_name_options');
}

三,实现打开选项页时调用的方法。

function wp_douban_post_options()
{
//页面提交需要实现的功能

if($_POST['update_doubanshow_option'])
{
$wp_doubanshow_option_saved = get_option("wp_doubanshow_option");
$wp_doubanshow_option = array (
"userid" => $_POST['userid'],
"apikey" => $_POST['apikey'],
"profile" => $_POST['profile'],
"collection" => $_POST['collection'],
"recommendations" => $_POST['recommendations'],
"powerby" => $_POST['powerby']
);
if ($wp_doubanshow_option_saved != $wp_doubanshow_option)
{
if(!update_option("wp_doubanshow_option",$wp_doubanshow_option))
{
$message = __('Update Failed', 'wp-doubanshow');
}
}
update_doubanshow();

echo $message ;
}
//这部分是显示的html
<div class=wrap>
<form method="post" action="">
<h2><?php _e('DoubanShow Options', 'wp-doubanshow'); ?></h2>
<fieldset name="wp_basic_options" class="options">
<table>
<tr>
<td valign="top" align="right"><?php _e('Douban ID:', 'wp-doubanshow'); ?></td>
<td><input type="text" name="userid" value="<?php echo $userID; ?>" /> <?php _e('Enter your Douban ID.', 'wp-doubanshow'); ?></td>
</tr>
</table>
</fieldset>
<p class="submit"><input type="submit" name="update_doubanshow_option" value="Update Options »" /></p>
</form>
</div>
}

比我想想的容易很多。轻松过了这关。

参数数据库保存

WordPress提供了get_option()和 c()两个方法,可以方便的保存选项页中的参数。

get_option


<?php echo get_option( $show, $default ); ?>
$show
(string) (required) Name of the option to retrieve. A list of valid default options can be found at the Option Reference.
$default
(mixed) (optional) The default value to return if no value is returned (ie. the option is not in the database).

update_option


<?php update_option( $option_name, $newvalue ); ?>
option_name
(string) (required) Name of the option to update. A list of valid default options to update can be found at the Option Reference.
newvalue
(mixed) (required) The NEW value for this option name. This value can be a string, an array, an object or a serialized value.

需要注意的是所有插件的option都保存在一张表,所以为了避免冲突,option名字需要格外当心。

后台定时任务

WordPress提供了简单机制使得插件可以完成定时更新之类的功能。示例如下。

//自定义Action,并注册相关function
add_action('my_event', 'my_function');

//定义Action的出发频率
if (!wp_next_scheduled('my_event')) {
wp_schedule_event( time(), 'hourly', 'my_event' );
}

//当插件被停止时候,移除相关Function
function update_deactivation(){
wp_clear_scheduled_hook('my_event');
}

register_deactivation_hook(basename(__FILE__),' update_deactivation');

总结

总之就是动手做,其乐无穷啊~~~~~~~~~

参考资料

WordPress Plugin API
Write a Plugin
Plugin API/Action Reference
Plugin API/Filter Reference
自己动手写 WordPress 插件
用 Eclipse PDT 开发一个 WordPress 插件

, , ,

No Comments

Liferay 6.0.5的定制

安装好了Liferay自然要玩耍一下。不过不管怎么玩都是人家的东西,要最后完成成自己需要的功能和样子,还需要自己去作二次开发定制。关于这方面的内容网上没有比较清晰的思路可以参考,于是自己写了一些方面,给以后留一些参考。

删除sevencogs
默认的安装包中提供了一个叫做sevencogs的示例站点。由于使用了Hooks Plugin,会和原装的liferay表现有所不同,所以如果你自己要做定制的话,最好把他们先删除。
 
rm -rf liferay-portal-6.0.5/tomcat-6.0.26/webapps/sevencogs*

配置Portlets
Liferay除了核心包中提供了很多实用的Portlet之外,还在liferay-portal-6.0.5/tomcat-6.0.26/webapps/下默认部署了很多强大的Portlets。具体的介绍可以参考下面这个页面。
http://www.liferay.com/zh/community/wiki/-/wiki/Main/Liferay+Portlets
个人的建议是不需要的话先删除,反正之后需要了也可以再添加回来。这样服务器启动也可以迅速不少。

配置MYSQL
默认的Liferay使用的嵌入式数据库HSQL,不过你启动的时候Liferay也会提醒你不要太当真,真要用了一定要修改数据库配置。
首先,在mysql中创建数据库。

create database lportal character set utf8;

然后修改下面这个文件(如果没有就创建)。

liferay-portal-6.0.5/tomcat-6.0.26/webapps/ROOT/WEB-INF/classes/portal-ext.properties

在其中添加一下配置(以MYSQL为例)

jdbc.default.driverClassName=com.mysql.jdbc.Driver
jdbc.default.url=jdbc:mysql://localhost/lportal?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
jdbc.default.username=
jdbc.default.password=

之后Liferay启动的时候就会自动读取这个配置文件以对应的数据库配置启动了。如果数据表没有创建过还会贴心的帮你创建并且导入基础数据。
具体各种数据库配置示例可以访问下面的链接。
http://www.liferay.com/zh/community/wiki/-/wiki/Main/Database+Configuration;jsessionid=F70539C702464D413394D1A66428E3EC.node-1

自定义布局和主题
Liferay的外观修改主要分成两个部分Layout和Theme.
Layout指的是布局。页面上每个Portal的大小和相对位置都是通过Layout进行定义的。
Theme指的是主题。页面的图片,HTML风格都是由Theme来决定的。

创建Layout
在最新的Liferay IDE 1.1.0中可以方便的创建Layout Plugin来对这个部分进行定制。
1)创建项目
File ->New Liferay Plug-in Project -> Plug-in Type: Layout.
IDE会创建一个“项目名称-layoutpl”的项目。
2)部署项目
Liferay Server-> Add or Remove -> 选择该项目。启动Liferay -> Server
部署的时候会把项目文件拷贝到liferay-portal-6.0.5/tomcat-6.0.26/webapps/下,然后会被Liferay侦测到,加载到系统中。
3)选择新布局
用管理员帐号登录后,可以通过 Manage -> Page Layout 选择你新开发的布局。

创建Theme
Liferay IDE 1.1.0中同样可以方便的创建Layout Theme来对这个部分进行定制。
1)创建项目
File ->New Liferay Plug-in Project -> Plug-in Type: Layout.
IDE会创建一个“项目名称-theme”的项目。
2)部署项目
Liferay Server-> Add or Remove -> 选择该项目。启动Liferay -> Server
部署的时候会把项目文件拷贝到liferay-portal-6.0.5/tomcat-6.0.26/webapps/下,然后会被Liferay侦测到,加载到系统中。
3)选择新布局
用管理员帐号登录后,可以通过 Manage -> Page -> Look and Feel 选择你新开发的主题。
需要注意的是Liferay支持每个页面配置不同的主题。

创建Portlet
这是大家讨论最多的部分。这边就不细说了。
唯一值得一提的是Liferay开发Portlet支持Plug-in和Ext 两种开发模式。具体的好坏我会以后有机会单独叙述。

为控制面板创建Portlet
除了给每个页面(Page)配置Porlet之外,经常也会有需要为个人控制面板添加Portlet功能。例如我的喜好,我的兴趣,我的足迹之类的功能。
Liferay中控制面板也可以视为一个特殊的页面,左边的菜单栏是一个特殊的Portlet,它会把所有需要显示在控制面板中的Portlet罗列出来。右边则是Portlet点选之后显示的内容。
一个Portlet如果需要显示在控制面板中,需要在/WEB-INF/liferay-portlet.xml中为Portlet添加如下内容

<control-panel-entry-category>my</control-panel-entry-category>
<control-panel-entry-weight>14</control-panel-entry-weight>

control-panel-entry-category指的菜单项的分类,包括’my’, ‘content’, ‘portal’ and ‘server’四种。control-panel-entry-weight指的是菜单项在该分类中的相对位置。
需要注意的是可能会出现常见问题一中的错误。

常见问题
1)Error on line 13 of document : The content of element type “portlet” must match
liferay-portlet.xml对顺序也有一定的要求。最简单的方法就是参考ROOT下的liferay-portlet.xml依样画葫芦,肯定不会错。

参考资料
Liferay THemes.pdf
Liferay Admin Guide

, , ,

No Comments

liferay 6.0.5 开发环境的搭建

最近在玩liferay,非常赞的一个门户搭建工具。不仅提供了开发工具包,和服务器的捆绑包,论坛和文档的质量也都非常高,最重要地是还有非常多的插件支持。绝对是开发Portlet上佳选择。

记性不好,记下来,说不定啥时候就要用到了。

前提

安装Java JDK 1.5+.

1)下载安装文件

liferay-portal-tomcat-6.0.5.zip捆绑了liferay和tomcat,让你不用省心不少的体贴服务。

liferay-plugins-sdk-6.0.5.zip用于开发liferay plugin的SDK。

liferay-ide-eclipse-updatesite-….zipEclipse 插件,功能强大的liferay plugin开发工具包。

2)在本地解压缩
我个人喜欢把所有相关的安装文件都放在一个目录下。

mkdir liferay
unzip liferay-portal-tomcat-6.0.5.zip
unzip liferay-plugins-sdk-6.0.5.zip

3)开发工具包的安装
使用的是Eclipse 3.5,低版本的请相应查找安装方法。
3.1)安装liferay插件
Install New Software -> Add -> Archive ( 选择liferay-ide-eclipse-updatesite-1.1.0.zip)->逐步安装。
3.2)设置liferay SDK
Preference -> Liferay -> Installed SDKs -> Add (选择liferay-plugins-sdk-6.0.5.zip的解压缩文件夹位置)。
3.3)设置liferay服务器
Preference -> Server -> Runtime -> Add -> Server Type ( Liferay v6.0) -> 选择liferay-portal-tomcat-6.0.5.zip皆压缩位置。
3.4)重启一下。
开发工具包就安装好了。感谢Eclipse强大的插件架构和liferay细心的服务。

4)测试使用
1)添加服务器
在Liferay的Perspective下,Servers -> New Server -> Liferay v6.0.
2)运行服务器
Liferay v6.0 -> Start
3)访问http://localhost:8080/
4)用test@liferay.com/test登录。

使用心得
Liferay Plugin Project 创建的时候会执行一些ant脚本。所以如果你需要使用版本管理的时候,个人建议不要check
in项目控制文件(.project, .classpath),这样你的同伴检出的时候可以通过创建新项目完成这些脚本的执行。避免不同步的现象发生。

参考文章
LifeRay安装配置开发环境全过程(一)
Eclipse – Liferay Wiki
【原创】Liferay Portal二次开发指南(总览)
Liferay Portal 6学习笔记3:Liferay IDE的安装使用

, , ,

1 Comment

无觅相关文章插件,快速提升流量