如何从头开始创建WordPress插件

WordPress博客正变得比以往任何时候都更受欢迎,几乎每天都有数以百计的新博客涌现出来。然而,WordPress不是一个新软件,所以我认为现在是时候学习如何为它创建像样的插件了,一旦你学会了如何编写插件,你就会发现这不仅很有趣,而且可以非常有利可图。

插件概念

我想向你展示如何编写非常简单的WordPress(WP)插件。每个插件背后的一般目的都是以这样或那样的方式增强WP功能,所以我开始思考:什么样的插件包含的代码不会超过100行(这样刚接触WordPress API的人就不会迷失在大量的代码中),同时也会有一定的用处。

我决定我们一起写一个插件,它将计算搜索引擎机器人的访问量。

让我简短地解释一下我所说的“搜索引擎机器人”是什么意思,每个搜索引擎都有某种机器人负责为Internet上的页面编制索引,正如你可能已经知道的那样,没有其他方法可以索引页面,然后通过HTTP或HTTPS协议访问它们。基本上,这使得所有的bot都是虚拟的Internet用户,唯一使它们与真实Web用户不同的是,bot使用的浏览器(或者更确切地说,是HTTP_USER_AGENT头中的浏览器签名)不是我们的浏览器。

例如,Googlebot使用的Web浏览器与Firefox兼容,但它的名称实际上是“googlebot”,我们可以使用PHP中的$_SERVER[‘HTTP_USER_AGENT’]变量进行检查。

知道了这些信息后,我们想要以这样的方式设计我们的插件,即每次加载WordPress页面时,我们的插件都会检查这个变量,以找出当前查看我们网站的人是机器人还是真人。如果是BOT,则脚本将增加BOT访问计数变量(我们将其存储在数据库中)。

就这样,一个不错的小插件。我知道你们写这样的代码可能很容易,但是我们的目标其实不是代码本身。我们的目标是了解WordPress插件API是如何工作的,这才是最重要的,而不是代码。

如果我说服你进一步阅读这篇文章,那就太棒了,我相信你会喜欢它的。

WordPress插件开发入门

如果你还没有在本地主机上安装WP,或者还没有安装WP,那么可以从www.wordpress.org获取它。不要犯一个常见的错误,认为只需阅读本文就可以理解所有内容,你实际上需要实践这项工作。

我们需要知道的第一件事是把我们的插件放在哪里,WordPress程序员为所有插件选择了特定的文件夹,如果你开始浏览WordPress目录,你会自己发现所有插件都位于:/wp-content/plugins/文件夹中。

注意,没有必要为你的插件创建一个新的文件夹,你可以把你的文件直接放到插件目录中,但我认为只有当你的插件只是一个PHP文件时,这样做才是好的。

我们将使用两个文件,因此让我们创建目录并将其命名为bot,因此我们插件的路径将是wp-content/plugins/bot/。

你可能会想,如果一个目录中有多个文件,WordPress怎么知道应该使用哪个文件,应该先启动哪个文件?

这是一个很好的问题,答案非常简单:被WP视为主要插件文件的文件是那些带有特定信息的文件,称为:标准插件信息头。没有这些信息,你不会让你的插件工作,主要是因为,WordPress不会知道你的插件存在,它不会列在插件管理页面,你也不能激活它。

我的信息标题如下所示:

/*
Plugin Name: Bot Counter
Plugin URI: http://wpadverts.com/bot-plugin/
Description: Plugin is counting bots visits
Author: Greg Winiarski
Version: 1.0
Author URI: http://wpadverts.com/
*/

当然,你可以自由编辑此信息,但不要删除任何行,它们都需要留在那里。如果你愿意,可以将此信息复制并粘贴到你的文件中,并将其保存为“bots.php”在我们的“bot”目录中,它应该如下所示:

/wp-content/plugins/bot/bots.php

现在你可以转到wp-admin/Plugins页面,浏览可用的插件,你会发现插件列表中已经包含了你的插件,而且,它看起来已经可以激活了。

我们知道它实际上什么也做不了,所以我们需要“教”我们的插件什么时候做什么。这些都非常简单,这要归功于“插件挂钩”。

让我解释一下。你可以把每个插件钩子看作一个动作,在WP中,动作几乎可以做任何事情:发布帖子、编辑评论、加载标题等等。但是所有的动作都是WordPress程序员预定义的,所以你不能想写什么就写什么。有关此操作的更多信息,请查看http://codex.wordpress.org/Plugin_API/Action_Reference以获取完整的操作列表。

当我们最终选择最适合的操作时,我们需要给它分配一个函数,我们通过使用add_action($predefined_plugin_hook, $our_function_name);命令来完成。预定义的插件钩子(predefined_plugin_hook)是操作之一,而“function name (函数名)”是我们编写的函数,或者我们将在本例中编写的函数。

插件安装和激活

说得够多了,现在是编写一些代码的时候了,让我们从函数开始,它将负责在我们的数据库中创建一个附加表,并用两条记录填充它。在这个表中,我们将保存有关不同机器人及其访问次数的信息。

function bot_install()
{
    global $wpdb;
    $table = $wpdb->prefix."bot_counter";
    $structure = "CREATE TABLE $table (
        id INT(9) NOT NULL AUTO_INCREMENT,
        bot_name VARCHAR(80) NOT NULL,
        bot_mark VARCHAR(20) NOT NULL,
        bot_visits INT(9) DEFAULT 0,
	UNIQUE KEY id (id)
    );";
    $wpdb->query($structure);
 
    // Populate table
    $wpdb->query("INSERT INTO $table(bot_name, bot_mark)
        VALUES('Google Bot', 'googlebot')");
    $wpdb->query("INSERT INTO $table(bot_name, bot_mark)
        VALUES('Yahoo Slurp', 'yahoo')");
}

我承认,整个脚本可以在不使用MySQL的情况下编写,这将是比创建额外的表更好的解决方案,就像我们做的那样,但再次强调这不是关于脚本,而是关于学习WordPress API,我想:如果你稍后想要自己编写插件,那么你可能会使用MySQL,所以我决定向你展示WP希望我们如何做到这一点。

关于我们的函数,它的名称可以是你想要的任何东西我选择bot_install,因为这是这个函数真正做的(安装我们的插件),但是你也可以命名func1,这不是你怎么命名它,而是你如何把它分配给某些插件钩子,但是最好避免已经被WordPress程序员使用的函数名称,然后试着保持你的函数名称是唯一的。

前面我谈到了将函数分配给某个操作,那么如何操作以及选择哪个操作呢?

显然,我们希望操作只运行一次,可能是在激活插件之后,我们不想一遍又一遍地创建新表,所以我们最好的方法是“激活(activate)”plugin Hook,但要注意这个有点棘手。

所有的WordPress操作都是预定义的,除了这个。请看代码:

add_action('activate_bot/bots.php', 'bot_install');

就像在第一个参数是plugin Hook之前所说的,让我们称其为半预定义的,我的意思是,第一部分‘activate_’是常量,但是参数的第二部分是指向包含激活函数的脚本的路径。我们将安装函数保存在与其余函数相同的文件中,因此需要指向我们现在正在编辑的文件。

另外,请注意,你需要使用相对路径,WordPress知道安装文件必须位于wp-content/plugins/目录中的某个位置,因此我们只需要告诉他该目录中的哪个文件才是真正的文件。

第二个参数是我们的函数名,不多也不少。

在我们的bot_Insall函数中,我们使用全局变量$wpdb,它是负责与数据库通信的对象,当然,我们仍然可以使用老式的mysql_query()来代替$wpdb->query(),但是让我们使这些脚本看起来像WordPress团队想要的那样。

我相信我不必评论其余的代码,因为只有三个MySQL查询,所以我相信你很容易理解这些脚本的作用。

如果我们现在激活我们的插件,bot_install功能将启动,附加表将被创建,一些数据将被添加,最后,我们的插件除了在管理区可见之外,还可以实际做一些事情。

使用Actions 和 Filters

现在我们将创建一个函数,该函数将负责对机器人的访问进行计数:

function bot()
{
    global $wpdb;
    $browser_name = $_SERVER['HTTP_USER_AGENT'];
    $bots = $wpdb->get_results("SELECT * FROM ".
        $wpdb->prefix."bot_counter");
 
    foreach($bots as $bot)
    {
        if(eregi($bot->bot_mark, $browser_name))
        {
            $wpdb->query("UPDATE ".$wp->prefix."bot_counter 
                SET bot_visits = bot_visits+1 WHERE id = ".$bot->id);
 
            break;
        }
    }
}

这也非常简单,首先,我们通过使$wpdb变量成为全局变量,使其对我们的函数“可见(visible)”。然后,我们从前面创建的表中选择所有数据,并使用foreach循环遍历结果。当发现$browser_name包含$BOT->BOT_Mark值时,脚本执行一个MySQL查询,将bot_visits字段值加一,然后我们停止每一个,因为一个浏览器不可能有两个机器人。

当我第一次编写这些函数时,我将其分配给wp-head Plugin Hook,这意味着WordPress将在header加载时启动此函数,但后来我决定将其重新分配给wp-footer操作,因为此函数只会在我们的数据库中进行简单操作,甚至不会向访问者显示结果,所以我想你会同意我的观点,首先将页面发送给客户端,然后调用此函数是个好主意。这能为我们的访问者节省一些时间。

add_action('wp_footer', 'bot');

几乎一切都准备好了,我们的插件可以创建一个新的表格,机器人访问量现在被计算在内,我们想看看有多少机器人访问了我们的博客,但我们希望这些数据只对博客管理员可见,并显示在管理区。

在wp-admin仪表盘中创建新区域

听起来工作量很大吧?事实上,不是这样的。WordPress程序员创建了一组插件钩子,允许我们将页面添加到wp-admin区域,这些新页面将自动显示在我们选择的适当类别的管理面板中。

首先,我们需要编写一个函数来为管理站点的新页面创建整个布局,然后我们需要使用add_option_page(…) 。函数,但我们必须将其添加到某种我们称之为“容器”的类型中。集装箱是什么?基本上,容器是另一个函数,它有一组在 add_option_page(…)中的命令。

请注意,我们并不局限于只创建一个额外的管理页面,通过使用容器,我们可以在不同类别中创建多个页面,例如,一个在“用户”类别中,另一个在“选项”类别中。但是,我们正在编写一个相当小的插件,所以我们将只创建一个额外的页面。

function bot_menu()
{
    global $wpdb;
    include 'bot-admin.php';
}
 
function bot_admin_actions()
{
    add_options_page("Bot Counter", "Bot Counter", 1,
"Bot-Counter", "bot_menu");
}
 
add_action('admin_menu', 'bot_admin_actions');

看看bot_menu函数,它包含当前不存在的bot-admin.php文件,但目前这并不重要,稍后我们将创建它。

比bot_menu 更有趣的是bot_admin_actions函数-这是我们的容器。

整个代码的工作方式是这样的:第一个add_action函数与插件钩子 admin_menu一起运行,所以WordPress知道会有一些东西添加到管理菜单中。还会增加什么?它必须通过执行bot_admin_action函数来检查它,add_action的第二个参数,bot_admin_function告诉WordPress它必须向选项页面(add_options_page)添加名为“Bot Counter”的新菜单项,当用户单击此菜单项时,WordPress将必须从bot_menu函数获取它的代码,不是吗?

但是为了使其正常工作,我们必须创建bot-admin.php文件,因为bot_menu使用它,所以让我们创建该文件并将一些代码放入其中:

<?php query("UPDATE ".$wpdb->prefix."bot_counter SET bot_visits = 0");?>
<div id="message" class="updated fade">
 
Bot Counter Stats <strong>Reseted</strong>.</div>
<div class="wrap">
<h2>Bot Counter Admin</h2>
<?php
$wpdb->get_results("SELECT * FROM ".$wpdb->prefix."bot_counter");
foreach($results as $result)
{
    echo $result->bot_name." : ";
    echo $result->bot_visits."";
}
?>
 
<a href="?page=<?php echo $_GET['page']; ?>&bot-counter=reset">
    Reset Stats
</a>
</div>

这里没什么好说的,这个脚本告诉我们特定的机器人访问了我们的网站多少次,最后是一个链接,允许我们重新设置统计数据。请注意,我们使用的是<div>…</div>和<div>…</div>这些将使我们的管理页面看起来与其他管理页面相似。

还要看看我们的<a>标记,我们可以在管理页面中提交表单并单击URL,但我们需要记住始终通过GET (page=<?php echo $_GET[‘page’]; ?>)发送‘page’参数,否则WordPress将不会显示我们的管理页面。

有关添加管理菜单的更多信息,请访问http://codex.wordpress.org/Adding_Administration_Menus。

差不多就是这样。我们能做的最后一件事是显示访问我们网站的人的机器人访问量,但如果我们想要在某个位置(例如边栏)显示机器人的统计数据,就需要编辑模板。

将我们的统计数据嵌入到模板中的最好方法是编写(在bots.php文件中)显示这些统计数据的函数,然后你需要在WordPress模板中添加的所有内容都是你命名的函数。

结论

我的目标是向你展示尽可能多的WordPress Plugins API功能,但是,如果你在阅读本文之前没有在这里找到问题的答案,那么我给你的最好建议是访问www.wordpress.org并阅读WP API文档。我相信,以你通过阅读这些课文获得的知识,你在找到所有问题的解决方案和答案方面都不会有任何问题。

发表评论

电子邮件地址不会被公开。 必填项已用*标注