December 19, 2007

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

      上一篇日志:《 Wordpress插件DIY:使用Javascript提高插件易用性

      在上一次我们讨论了在插件的编写中使用javascript来提高插件的易用性, javascript的确是一个好东西, 可滥用了javascript会给客户造成很慢的网页载入速度和较高的资源占用; 而且有时候这个javascript也不是万能的, 我们在javascript也无能为力的时候(这个时候API肯定是无能为力了), 就只能继续采取别的方法来增加插件的易用性, 这里我们就讨论一下如何找寻wordpress自身的编程运行流程, 找出其中的特点最后提高插件的易用性, 这种方法我不是很提倡, 因为兼容性相当的低, wordpress开发组随便一个怪异的想法都可以让插件崩溃失效, 所以这里我就列为了第三个技巧, 可用度比使用 API 和 JAVASCRIPT 要低, 只在迫不得已的时候才进行使用。

      在我写的插件中, 只有 wordpress thread comment 这个插件中使用了这个技巧。 下面我就结合我的插件来说说这个技巧的运用。

      大家知道, wp thread comment 要正常使用, 必须要得到 comment form 的 ID, 也就是评论输入框的ID, 否则无法移动评论输入框; 在 Wordpress thread comment 第一版推出的时候, 对于这个 comment form ID 我没有做成自动获取, 而是要用户自己手工输入的, 这个时候很多朋友来问我怎么输入正确的 form ID, 虽然我在文章中已经讲述了如何查找 form ID 的方法, 可还是有很多朋友无法找到, 这也不怪兄弟们, 不是每个人都懂代码的呀, 所以第一版推出的时候, 很多人想用最后无法正常使用上。

      为此我就对这个问题重新进行了思考, 想有没有简单的方法可以找到这个 comment form ID, 而不再需要用户自身去寻找, 可这个问题并不简单, 因为所有的主题模板都不一样, 每个写主题的朋友都可以自己规定一个 comment form ID, 所以几乎没有办法。

      “绝处逢生”可能就是这么来的, 我在最后实在没有办法了, 就开始分析wordpress的源代码, 希望能找出些规律来; 哈哈, 我还真的找到规律了, 且看wordpress是如何来显示comments 和 comments input 的。

      首先我们可以看到在主题目录下的single.php中有这么一行代码 –  comments_template(), 是的, 就是这一行代码用来显示评论的, 那我们就来查找这个函数是在哪里定义的, 最后你可以找到这个函数的定义点,就在 wp-includes/comments-template.php 文件里面(这个函数的具体内容我就不贴了, 请自己查看), 然后你在这个函数就可以看到较为关键的一行代码了。

if ( file_exists( $include ) )
        require( $include );
else
        require( ABSPATH . ‘wp-content/themes/default/comments.php’);

      这里就是关键点了, wordpress必须使用comments.php这个文件来实现评论的显示, 而这个文件它会查找两处地方, 一个就是当前的主题模板目录, 还有一处是default主题的目录, 如果这两处都没有这个文件, 那按照这个代码的理解评论肯定是无法显示的了, 我没有试过, 你可以试试看, 是不是这样?

      找到了这个就好办了, 也就是说我们的 comment form ID 只会存在在这两个文件中, 那如何在这两个文件中把这个 comment form ID 给找出来呢? 这个时候还需要分析一个地方。

      wordpress 的评论递交是通过 wp-comments-post.php 这个文件来实现的, 所以你应该也可以找到所有的主题模板中的 comments.php 文件中肯定存在这个字符串, 说到这里, 顺便提及一点, 我猜想很多的垃圾评论可能就是直接向这个 wp-comments-post.php 文件发送的。

      好了, 现在我们找到了所有的关键点, 如果你懂一点 html 的网页编程, 就可以知道, form 的递交是有一个action值来确定地址的, wp 的 action 值正好就是 wp-comments-post.php, 因此我就用下面这段代码来实现了, 具体代码我就不分析了。

function getformidfromcommentfile(){

    $commentfile = ABSPATH.’wp-content/themes/’.get_option(’stylesheet’).’/comments.php’;

    if(!is_file($commentfile))
        $commentfile = ABSPATH.’wp-content/themes/default/comments.php’;
    if(is_file($commentfile)){
        $context = file_get_contents($commentfile);

        if(!empty($context)){
            if(preg_match(’/<(form.*?wp-comments-post\.php.*?)>/ius’, $context, $match)){
                $context = $match[1];

                if(preg_match(’/id *?= *?”(.*?)”/ius’, $context, $match)){
                    unset($commentfile, $context);
                    return $match[1];
                }
            }
        }
    }
    unset($commentfile, $context, $match);
    return ”;
}

      就这样, wp thread comment 自动查找到了准确的 comment form ID, 提高了插件的易用性, 使用 wp thread comment 的朋友再也不需要自己去看源码找了。

      不过这样的方法还是有一个不足, 比如有人把 wp-comments-post.php 这个文件改名了, 那这个插件的自动查找功能就失效了, 或者说有些主题比较另类, 程序也可能会无法找到 comment form ID, 所以还是要给用户自己选择的权利, 因此我在后台添加了一个手动输入 comment form ID 的框, 可以弥补自动分析带来的不足。

      写到这里要说明一点, 要使用 wp thread comment 必须要在form中增加id属性, 有些主题的作者可能会忽略这个id, 这个时候插件肯定是无法正常使用了。

      好了, 关于找寻wp的运行规律来提高插件的易用性就说到这里了, 我知道我的编程水平很差, 文笔也很垃圾; 不管你有什么想说的, 都烦请给我留个言, 好敦促我来改进, 谢谢了。

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

 

« Wordpress插件DIY:使用Javascript提高插件易用性 Wordpress插件DIY:巧用php技巧提高插件易用性 »
5 responses to "Wordpress插件DIY:利用wp的编程规律提高插件易用性"
C.J. said:
2007年12月19日

学习了,写得很好

漫步 said:
2007年12月19日

你真的太厉害了,邀请你加入中文团队真的是非常对的。

另外你工作那么忙,还天天更新博客,佩服。继续努力。。。

枫叶 said:
2007年12月21日

谢谢 CJ 的支持, 写的其实很一般.

漫步就知道夸奖我, 不过还是很感谢的; 对于这个更新博客, 的确感到有点吃力, 我的工作跟博客间的确有一定的冲突, 不过我会尽量更新的, 也算是记录自己的一天吧, 虽然我几乎没有写到过, 哈哈

icyleaf said:
2007年12月21日

还是枫叶的研究比较深,研究的这么透彻。而且还能经常更新,佩服佩服~

[...] Wordpress插件DIY:利用wp的编程规律提高插件易用性 [...]

Leave a comment