December 20, 2007

Wordpress插件DIY:巧用php技巧提高插件易用性

      上一篇教程: Wordpress插件DIY:利用wp的编程规律提高插件易用性

      欢迎再次回到Wordpress插件DIY, 最近几天我们都在讨论如何提高插件的易用性, 到目前为止, 我们已经聊了四个技巧可以用来提高插件的易用性, 今天我们来聊聊我到目前能想到的最后一个技巧, 那就是利用我们伟大而万能的PHP。

      写 Wordpress 插件当然离不开用PHP编程, 但我今天说的不是用php编程的教程和帮助, 而是利用php中某些具有强大功能的函数来解决我们写插件过程中本来比较难以解决的问题; 我也没有写多少插件, 所以对php掌握不深, 如果中间说的有什么不对的地方, 请各位帮忙指正, 也是我受教育的一个机会, 多谢各位了!

      我在写插件过程中运用过php的两个技巧, 最终实现了我需要实现的一些功能。

******************************

一、 ob_start()

      我这里说 ob_start() 很狭隘, 其实确切的说是 php 的“Output Control 输出控制函数”这个函数的族群, 关于这个族群函数的功能, 我摘录一段php中文手册的简介。

输出控制函数可以用来控制脚本的输出。这些函数在某些特殊情况下很有用,特别是脚本中已经输出了信息之后再想向浏览器发送标头的情况。输出控制函数不会作用于 header() 或 setcookie() 函数发送的标头,而只会影响类似于 echo() 函数输出的信息和嵌入在 PHP 代码之间的信息。

      根据上面这段话的理解, 就是“Output Control 输出控制函数”可以帮助我们控制内容的输出, 这也正是某些插件非常需要的, 比如我的 wp thread comment 插件, 不知道还有没有人记得我这个插件刚推出的时候, 跟 wp ajax edit comments 这个插件是有冲突的, 虽然不是非常严重(没有到一山不容二虎的程度), 只是 wp ajax edit comments 无法用在回复的评论上, 也就是说在回复的评论上是不显示 wp ajax edit comments 的编辑按钮。

      这个冲突的原因是 wp ajax edit comments 挂载在 comment_text 这个 wordpress API 上, 而我的子评论(也就是评论回复)不能使用这个函数, 为啥? 因为这个 comment_text 是一个直接输出的 API, 所以我就不能在评论回复上使用, 否则评论回复就直接输出了, 我再也无法控制显示位置, 因此我只能将子评论的挂载到 get_comment_text API 上, 因此就造成了无法显示 wp ajax edit comments 的编辑链接了。

      最后, 还是很幸运的, 我找到了PHP的这个“Output Control 输出控制函数”, 我就想到了利用这个控制输出内容的ob_start()来解决我的问题, 有了这个“Output Control 输出控制函数”我就可以把评论回复挂载到 wordpress 的 comment_text API 上了, 就可以成功解决冲突的问题, 请看代码:

ob_start();
ob_clean();
comment_text();
$content_text = ob_get_contents();
ob_end_clean();

      因为启用了ob_start(), comment_text()的输出就不会直接给客户端, 而是会把输出内容输出到了output buffer中, 然后我再把output buffer中的内容取出来就ok了, 因为子评论的内容通过comment_text()取得, wp ajax edit comments 就会被wordpress hook, 子评论也就可以成功利用 wp ajax edit comments 来编辑了。

      (注: 可能我上面的这个内容讲的不是很明白, 说实在的, 我也不知道怎么来表述的更加清楚, 如果有什么更好的表述, 请补充; 有什么不懂的, 请留言给我, 我会尽量说的更明白些的, 呵呵)

      如果你发现你的插件不想要某个内容输出, 可wordpress就给了一个直接输出的函数(比如 echo print 之类), 这个时候你就可以试试“Output Control 输出控制函数”,  肯定可以让你如愿以偿的。

*****************************

二、 eval()

      如果你用过javascript, 可能知道eval是一个万能的函数。 php也有这么一个函数 — eval, 它的作用就是把字符串作为php代码来执行(Evaluate a string as PHP code), 有了这么一个函数, 我们可以随时随地的动态构建我们的php函数, 可以摆脱wordpress的不少束缚, 到目前为止, 我只试验过这个函数, 具体还未利用到。 不过 paged comments 就利用了这个函数解决了本要修改主题模板的麻烦, 这段代码值得学习和借鉴。

            // if it doesn’t exist, replace comments_template() with paged_comments_template().
            if (strpos($file_contents, ‘paged_comments_template()’) === false) {
                extract($GLOBALS, EXTR_SKIP | EXTR_REFS);
                $inc_path = get_include_path();
                set_include_path($inc_path . PATH_SEPARATOR . TEMPLATEPATH);
                $file_contents = str_replace(’comments_template()’, ‘paged_comments_template()’, $file_contents);
                $file_contents = str_replace(’<’.'?php’,'<’.'?’,$file_contents);
                $f = fopen(__FILE__.’.txt’,'w’);
                eval(’?’.’>’.trim($file_contents));
                // I don’t think I should be using restore_include_path(), what if other
                // plugins also use set_include_path()? according to php.net
                // restore_include_path restores “back to its original master value as set in php.ini”
                set_include_path($inc_path);
                exit;
            }

      从上面我们可以看出, paged comments 先读取了模板文件的内容, 然后将其中的comments_template()改成了paged_comments_template(), 从而输出就成了paged comments自定的样式, 省却了你修改主题模板的麻烦, 而且在禁用插件后自动恢复原来的评论样式, 让你省心又放心。

      不过用eval要注意一点, 你看上面的代码, 在最后作者加了一句exit, 如果没有这个语句, 你会发现播客上面comments输出了两次, 因此必须要加入这个exit, 或者用die()函数也是可以的, 就是在达到你的目的后直接退出了, 不要再让php执行下去了, 这样所有的样子就是你想要的样子了。

******************************

      好了, 我目前用到的php的技巧就是这些了, 如果你有什么技巧, 也欢迎和我、 大家一起讨论, 让我们共同进步!

      最近一段时间博客上更新都是这些技术性的文章, 博客的人气越来越衰, 评论也越来越少, 看来技术真的不是大众化的项目; 教程更新到这里, 易用性已经全部完毕了; 我所说的几个原则中的其他的几个, 后面我还会陆陆续续更新, 因为那些东西就不太具备技巧性, 而是一种考虑而已。

      后面一段时间, 我可能还是会更新一些别的方面的内容了, 经常性的让我关注技术, 也是一件很累的事情, 我的生活不应该让技术占领了全部, 也应该有其他的生活。

  您喜欢本文吗?即刻订阅"偶爱偶家",精彩文章不再错过!现在就给我们留个话吗?

 

« Wordpress插件DIY:利用wp的编程规律提高插件易用性 我能写些啥 »
12 responses to "Wordpress插件DIY:巧用php技巧提高插件易用性"
水自流 said:
2007年12月20日

看得头晕眼花,打声招呼先

[Reply]

枫叶 reply:
2007年12月21日

@水自流, 不好意思哈, 我的文笔实在是差了点, 露丑露丑了.

[Reply]

icyleaf said:
2007年12月21日

最近没法研究PHP了,初入公司用的是JSP…而且我在外地,没有笔记本电脑…努力攒钱买之

[Reply]

水自流 said:
2007年12月22日

@枫叶 哈,太谦虚了。我不懂php语言也不懂代码所以头晕,呵呵,有空时好好看看。我喜欢什么都自己做,很不好的习惯。

[Reply]

moon said:
2007年12月22日

先收藏下,寒假回去学写代码呢··

[Reply]

maomy said:
2007年12月25日

呵呵,技术牛人,谢谢给我留言。simple tag确实好用,不过我提到的那个关于影响网页速度的问题,不知你遇到过没有?如何解决的?另一个问题就是留言和发文出现出错页面的问题……期待指点!在这里:
http://maomy.ohmymedia.com/2007/12/25/732/

另外,其实写技术类的原创帖也是蛮有潜力的,google搜索会给你带来长远的访问量的…就像你那篇wp升级贴。加油!

[Reply]

枫叶 said:
2007年12月26日

谢谢有这么多的兄弟为我捧场, 我会努力的, 哈哈!

[Reply]

2007年12月29日

[...] Wordpress插件DIY:巧用php技巧提高插件易用性 [...]

gux said:
2008年01月28日

写实现技术的东西,当然现在很少有人会认真按下心头看你满满的一大篇的东西,有这耐性,有这个需求的,人本来就少,还有一部分,肯定直接去看e文的文档去了,毕竟想自己动手的都是大能。

问题是,你的这些的东西,对我这种想学又不知道怎么下手的人来说,太有用了!!!

希望博主以后开发插件的时候 边开发,边写些进度,说明的什么,一是可以通知我们插件开发到什么地步了,还可以给想学习的读者一次机会

谢谢 提前祝新年快乐

[Reply]

枫叶 reply:
2008年01月29日

@gux, 谢谢您的赐教, 我以后会注意的, 也祝您新年快乐

[Reply]

[...] Wordpress插件DIY:巧用php技巧提高插件易用性 [...]

2008年06月27日

感谢先进的补习,非常宝贵的

[Reply]

Leave a comment