序曲
使用WordPress
统计插件WP Statistics
之后,经常会出现某个IP的访问突然出现比较多的情况,那么这个时候就需要了解这个IP访问的是哪个页面,是否发生了访问攻击。但是遗憾的是,WP Statistics
并没有根据IP地址查询访问记录的功能,因此,我们就自己写一个查询插件好了。
创建插件的文件和文件夹
WordPress
插件存储在wp-content/plugins/
文件夹中,而我们的新建文件也要存放在这个文件夹中。一般情况下,如果所制作的插件非常简单,可直接把所有代码放在一个PHP
文件中,然后把其放在wp-content/plugins/
文件夹中。但是,我们这里要制作的插件要使用两个文件(一个是主要的插件文件,另一个为执行管理页面的文件),因此,我们需要把新创建的文件另放在一个文件夹中,我们这里把这个文件夹命名为wp-statistics-visitor-query
。
创建插件的功能文件
我们就要创建插件主要文件了,我们把其命名为wp-statistics-visitor-query.php
。当然,你也可把其命名为其它名称,这并不重要。
然后再文件的头部增加插件的描述信息,如果不增加描述信息,WordPress
是找不到这个插件的。增加的内容如下:
1 2 3 4 5 6 7 8 9 10 |
<?php /* Plugin Name: WP Statistics Visitors Query Plugin URI: http://www.mobibrw.com Description: Plugin for query WP Statistics Visitors Author: LongSky Version: 1.0 Author URI: http://www.mobibrw.com */ ?> |
这样操作完成后,就可以在插件管理界面中找到名字为"WP Statistics Visitors Query
"的插件了。
使用行为钩子(Action Hook)
虽然插件现在已在管理面板显示,但是由于它只含有header
信息,因此它并没有其它功用。现在,我们就来增加它的功能吧。
WordPress
允许用户把插件代码放在模板的任意位置,包括页面的空间位置及页面创建过程中的逻辑位置。在此,我们将进一步了解后者,逻辑位置——即行为钩子。
行为钩子
我们可把行为钩子视为回调函数。WordPress
执行某项操作时,如,显示页脚,它就会让插件来执行自己的代码并且要在确切的时间运行。
为了方便大家理解,我们以my_plugin
这个普通插件为例,当系统显示页脚时,这个插件就会执行mp_footer()
函数。因此,显示页脚时,使用名为add_action()
这个特殊的函数,我们就会告知WordPress
调用mp_footer()
函数:
add_action()
函数把行为钩子名称作为其第一个参数,同时把必须执行的函数名称作为其第二个参数。我们将把此函数调用添加到插件的主要文件(即包括header
信息的文件),通常把它放在需要执行的函数代码正下方(本例中即放在mp_footer()
下)。可在WordPress Codex
查看所有可用的行为钩子 。
创建插件管理页面
我们要先创建新菜单条目并把其放置在设置菜单中。
WordPress
提供了新建菜单可调用的钩子(即admin_menu
),因此,这也是我们创建菜单条目的最佳地点。
既然已确认需使用的行为钩子,我们接着就要定义行为钩子运行时要调用的函数了,我们把其称为visitors_query_admin_actions()
。代码显示如下:
1 2 3 4 5 |
<?php function visitors_query_admin_actions() { } add_action('admin_menu', 'visitors_query_admin_actions'); ?> |
正如您所看到的,我们已创建了visitors_query_admin_actions()
函数,并用add_action()
函数让其与admin_menu
行为钩子结合。接下来,我们就要给visitors_query_admin_actions()
函数添加一些代码以创建真正的菜单条目了。
和WordPress
其它许多操作类似,添加新菜单条目也非常简单,只需调用一个函数就可完成!把新菜单条目添加到设置菜单需要使用add_options_page()
函数,然后把以下代码添加到visitors_query_admin_actions()
函数中。
1 2 3 4 5 6 7 8 9 |
<?php function ip_admin() { } function visitors_query_admin_actions() { add_options_page("Query Visitor From IP", "Query Visitor From IP", 1, "Query Visitor From IP", "ip_admin"); } add_action('admin_menu', 'visitors_query_admin_actions'); ?> |
此时刷新管理页面,设置页面下就已包括新建菜单条目了。
WordPress
中的每个菜单都使用不同的函数来添加其子菜单条目。例如,如果要给工具添加子菜单条目,我们就应该使用add_management_page()
函数,而非设置页面使用的add_options_page()
。更多信息,请查看WordPress Codex
中的添加管理菜单。
重新回到新添加的代码,或许您已注意到了最后一个参数。它即是请求新增菜单条目时,系统将调用的函数,我们也将使用它来创建插件的管理页面。
我们最好把此页面功能放在单独的文件中,并给其命名为query_visitor_import_admin.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php function ip_admin() { include('query_visitor_import_admin.php'); } // 只有管理员才能使用这个功能,基本安全防护 function is_administrator() { if( current_user_can( 'manage_options' ) ) { return True; } return False; // 非管理员 } function visitors_query_admin_actions() { if(is_administrator()) { add_options_page("Query Visitor From IP", "Query Visitor From IP", 1, "Query Visitor From IP", "ip_admin"); } } add_action('admin_menu', 'visitors_query_admin_actions'); ?> |
此时点击设置菜单下的链接,系统将显示空白页面,这是因为query_visitor_import_admin.php
文件现在没有任何内容。
接下来我们配置页面中的内容,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<?php function ip_query($ipaddress) { $q = "select referred from wp_statistics_visitor where ip='$ipaddress';"; global $wpdb; $rows = $wpdb->get_results($q,ARRAY_N); $i=0; while ($i< count($rows)){ $row = $rows[$i]; /*echo var_dump($row[0]);*/ echo "<br/>"; echo $row[0]; $i++; } } ?> <div class="wrap"> <form name="visitors_query_form" method="post" action="<?php echo str_replace( '%7E', '~', $_SERVER['REQUEST_URI']); ?>"> <p><?php _e("IP Address: " ); ?><input type="text" name="visitors_ip" value="" size="20"><?php _e(" ex: 192.168.1.1" ); ?></p> <hr /> <p class="submit"> <input type="submit" name="Submit" value="Query" /> </p> </form> <hr /> <p> <?php $ipaddress = $_POST['visitors_ip']; _e("Query $ipaddress :"); ?> </p> <hr /> <div> <?php $ipaddress = $_POST['visitors_ip']; if(is_administrator()) { ip_query($ipaddress); } else { echo "only administrator can use this function"; } ?> </div> </div> |
如此调整之后,需要禁用一下插件,然后再启用,否则可能不会生效。
代码详解
熟悉HTML和PHP的人都会理解以上代码,但我们这里仍将简单解释一下。
- 我们首先用
wrap
类创建一个div
,它是一个标准的WordPress
类,使新建页面能够和WordPress
管理版块的其它页面风格一致。 - 表单将使用
POST
方法回发数据。这意味着表单数据将由同一页面接收,这样以来,我们就可添加数据库更新代码到同一文件。 - 查询数据库的时候使用
WordPress
自带的全局数据库对象$wpdb
来访问数据库。 - 为了安全,我们只允许管理员权限的人员调用我们的插件功能。