自己动手写 WordPress 插件:开始
November 9th, 2007 at 12:51am 雪山飞猪
WordPress 之所以被广泛应用,一个很重要的原因,他很有多插件,多到什么程度呢,就像天上的星星一样多,哈哈,形容得真恶心,自己寒一个。今天开始给大家写一些原创性的文章:自己动手写插件,今天是第一篇,算是一个开始,从一个最简单插件开始,刚刚写好的,厉害吧!也是对阿里妈妈插件大赛的一个支持吧!
一个最简单的插件包括以下两部分:插件头信息和一个可在模板中使用的函数。那我们从第一步头信息开始:
自己动手写插件的第一步就是定义插件头信息:
/*
Plugin Name: WP 的沙发
Plugin URI: http://fairyfish.net/
Description: 本人代表广大 blogger 仅此插件献给沙发党以表彰他们对博客做出的杰出奉献
Version: 沙发一代
Author: 某低调沙发党
Author URI: http://fairyfish.net/
*/
这里我们定义了插件名称,版本,作者,下载地址,和简单的介绍。
插件的第二步是定义一个可在模板中使用的模板函数:
我开始的这个沙发插件非常简单,不会含有任何的任何的 filter 和 hook。所以我们这个插件实际上只需要对 WordPress 的 Comment 表进行查询,获取抢得沙发最多的三个留言者即可。
原本这个插件只需一条还算复杂的 SQL 语句即可搞定,但是著名的空间上盘古的 MySQL 的版本还是 4.0,泪奔,不支持 SQL 嵌套。算了还是贴出我写得很菜的 SQL 语句:
SELECT * , count( first_comments.comment_author ) AS comment_comments FROM ( SELECT * FROM ( SELECT comment_author, comment_post_id, comment_author_url FROM wp_comments WHERE comment_type = '' AND user_id =0 AND comment_approved = '1' ORDER BY comment_date )ordered_comments GROUP BY ordered_comments.comment_post_id )first_comments GROUP BY first_comments.comment_author ORDER BY comment_comments DESC LIMIT 3
既然不支持,按只有自己写了代码了,创建一个叫做 sofa 的函数。程序的代码非常简单,基本的逻辑如下:
- 查出含有留言的 Post 的 ID。
- 然后找出它们的第一条留言的留言者和其博客,帮把这些信息写到一个数组中。
- 对数组进行处理找出抢到沙发的三个留言者。
- 输出他们。
具体代码:
function sofa(){ global $wpdb; $first_commentors = array(); //初始化沙发党数组 $q = "SELECT DISTINCT comment_post_id FROM $wpdb->comments WHERE comment_type ='' AND user_id = 0 AND comment_approved = '1'"; $have_comment_post_ids = $wpdb->get_results($q); //获取有留言的日志ID foreach ($have_comment_post_ids as $have_comment_post_id){ $q = "SELECT comment_author FROM $wpdb->comments WHERE comment_type ='' AND user_id = 0 AND comment_approved = '1' AND comment_post_id = $have_comment_post_id->comment_post_id order by comment_date limit 1"; $first_comment = $wpdb->get_results($q); //获取沙发党 array_push($first_commentors,$first_comment[0] -> comment_author); //添加进沙发党数组 } $first_commentors = (array_count_values ($first_commentors)); //统计 arsort($first_commentors); //排序 $first_commentors_author = array_keys($first_commentors);//获取沙发党名字 $output = ""; //初始化输出字符串 $output .= '<ul class="wp_sofa">'; for($i=0; $i<3; $i++){ $title=""; if($i==0)$title = "状元:"; if($i==1)$title = "榜眼:"; if($i==2)$title = "探花:"; $q = "SELECT comment_author_url FROM $wpdb->comments WHERE comment_type ='' AND user_id = 0 AND comment_approved = '1' AND comment_author_url !='' AND comment_author = '$first_commentors_author[$i]' limit 1"; $first_comment_url = $wpdb->get_results($q); //获取沙发党的博客 if($first_comment_url){ $output .= '<li><a href="' . $first_comment_url[0] -> comment_author_url . '" title="' . $first_commentors_author[$i].'">' . $title.$first_commentors_author[$i] . '</a>(' . $first_commentors["$first_commentors_author[$i]"].')</li>'; } else { $output .= '<li>' . $title.$first_commentors_author[$i] . '('.$first_commentors["$first_commentors_author[$i]"] . ')</li>'; } } $output .= '</ul>'; echo $output;//输出沙发党前三甲 } ?>
然后在模板上(一般是在侧边拦侧)调用这个 sofa 函数即可。调用的方法为:
<?php if(function_exists('sofa')) { sofa(); } ?>
我们自己动手写插件的第一篇就到此为止,有任何问题请留言,但是抢沙发没有奖。
下一节我们讲讲如何窗体化(Widgetize)该插件,请大家保持关注,本人首次尝试写教程,如有不好的地方,欢迎大家提出批评和意见。
该插件演示请看本博客侧边栏订阅的下面!
这篇教程所实现的插件下载地址:WP-Sofa。并以此插件献给某著名沙发党大猫和胡戈戈同学。
作者:雪山飞猪
原文链接:自己动手写 WordPress 插件:开始
37 条评论 添加你的评论
Trackbacks/Pingbacks
- 默默の丸 » Blog Archive » 想学习如何制作WordPress的插件?
- 沙发那点事 | 大猫爪 BigCat's Paw
- 很棒的 WP 插件编写教程 by BloggingPro China
- WordPress 主题简明教程 -- 烙 印
- 推荐三款和评论相关插件 at zEUS.’Blog 網生@誌 | Wordpress主题 | 动漫影音 | 变形金刚 | 魔兽争霸 | 实况足球 | 以及与生活有关的唧唧歪歪...
- 推荐三款和评论相关插件 at zEUS.’Blog 網生@誌


分享到 Twitter

1. 胡戈戈 | November 9, 2007 at 12:52 am | #
沙发
[回复该留言]2. gloridea | November 9, 2007 at 9:07 am | #
我也“沙发”?
[回复该留言]3. Dreamcolor | November 9, 2007 at 9:45 am | #
沙发木有了…………
[回复该留言]4. gloridea | November 9, 2007 at 9:52 am | #
请教一下,“share this”插件不被主题支持怎么办啊?
我正在做WP,测试地址:http://blog.igoo2.com
请你看一眼,上面的share this插件没有图标,而且点击不是弹出对话框,是打开新页面!
我试了好多主题啦,都不行。新手,烦请指点一下啊!
多谢!
[回复该留言]5. underone | November 9, 2007 at 11:08 am | #
。。。。。。。。。。。。。。。。。
[回复该留言]6. newstart | November 9, 2007 at 11:09 am | #
你们沙发板凳啥的都占了,我就飞到天花板了
[回复该留言]7. 大猫 | November 9, 2007 at 11:23 am | #
木有沙发,无脸留言..回头我发个trackback过来….
[回复该留言]嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿
8. Edward | November 9, 2007 at 11:30 am | #
沙发是啥?
[回复该留言]9. 七言 | November 9, 2007 at 11:39 am | #
基本没看懂
[回复该留言]10. 细腻地纯爷们 | November 9, 2007 at 11:55 am | #
沙发~~
[回复该留言]11. 胡戈戈 | November 9, 2007 at 12:04 pm | #
1.我最喜欢的男明星是沙宝亮和周润发。
[回复该留言]2.没看 沙发先‘‘
3.学着做点绿豆沙发糕吧
4.哈哈,传说中滴…
5.不错 楼下的,我这个位置叫什么来着??
6.A long upholstered seat usually with a back and arms.
7.沙发阿~ 我***终于从XHW出来了~
8.难道是沙发,哈哈,我可是第一次啊!!!!
9.哈哈沙发
12. 雪山飞猪 | November 9, 2007 at 1:06 pm | #
@gloridea 可能是 share it 要用到一个 hock,你的主题没有吧!我不用这个插件,你自己看看吧!
[回复该留言]13. MO | November 9, 2007 at 4:13 pm | #
看不懂,难道我来自火星的? -_-!
[回复该留言]哈哈,这个表单蛮有趣的,怎么做的呀?
14. Hong.vox | November 9, 2007 at 5:33 pm | #
Remex Offline呢?
[回复该留言]15. kevin | November 9, 2007 at 11:21 pm | #
最后那句“沙发党大猫和胡戈戈同学”说的太好了
[回复该留言]16. lirui0073 | November 10, 2007 at 5:06 am | #
查询附件的应该怎么写呢?
[回复该留言]17. Zaigore | November 11, 2007 at 2:18 pm | #
额…看来大猫的效果,是不是不应该算上博主?
[回复该留言]18. onvip | November 12, 2007 at 7:37 pm | #
头有点儿晕了
[回复该留言]19. 24楼 | November 13, 2007 at 8:38 pm | #
稍微明白了点
[回复该留言]不过那个把标题自动换成英文的插件还是没搞好
没有起作用
20. We | December 22, 2007 at 2:45 am | #
博猪右边列表栏里的活跃网友就是这个插件做出来的效果?
[回复该留言]21. yangtx | January 7, 2008 at 6:52 am | #
用用看。
[回复该留言]22. GooMoo | January 18, 2008 at 11:31 pm | #
gd
[回复该留言]23. moon | January 19, 2008 at 1:45 pm | #
原来这插件也是你写的,so 强
[回复该留言]24. heixing.net 黑星空间 | January 26, 2008 at 1:35 am | #
‘读者同时也读了’
‘和此文相关的还有
这两个插件为什么我打入中文替换后,是乱码呢?
[回复该留言]指定一下字体么?’
25. 痴情的猪 | February 18, 2008 at 4:14 am | #
终于找到调用函数了!
[回复该留言]26. 痴情的猪 | February 18, 2008 at 4:26 am | #
这插件和Show Top Commentators有异曲同工之处呀~
[回复该留言]27. zEUS. | March 31, 2008 at 2:56 pm | #
用上了,谢谢! 插件写的很简单,浅显易懂!
[回复该留言]28. dizangstar | June 27, 2008 at 9:53 pm | #
真是sofa~
[回复该留言]29. 阿囧 | August 8, 2008 at 12:58 am | #
真是不错,做个记号~
[回复该留言]30. harde | November 9, 2008 at 3:39 pm | #
~~~~(>_<)~~~~
document.body.oncopy=function(){
event.returnValue=false;
var s=”";
clipboardData.setData(’Text’,s);
}
~~~~~~~~~~~~~~
[回复该留言]31. 雪山飞猪 | November 9, 2008 at 6:25 pm | #
Firefox 下可以复制。
[回复该留言]