要仅在需要时运行插件,插件作者必须识别代码实际执行操作的页面。
WordPress提供了一种非常简单的方法:全局变量$pagenow
.
它是在调用插件之前设置的wp-includes/vars.php
.
在我最近编写的一个垃圾邮件块插件中,我只需要在四个页面上运行我的插件:
wp-comments-post.php
筛选已发布的评论wp-admin/plugins.php
将插件行中的链接添加到设置wp-admin/options-discussion.php
显示两个选项字段wp-admin/options.php
为了保存选项字段,我在插件控制器中添加了一个helper方法…/**
* Check if we need an instance of our class.
*
* @return boolean
*/
public static function start_me()
{
global $pagenow;
if ( empty ( $pagenow ) )
return FALSE;
self::$page_base = basename( $pagenow, \'.php\' );
$active_pages = array (
\'options\',
\'options-discussion\',
\'plugins\',
\'wp-comments-post\'
);
if ( ! in_array( self::$page_base, $active_pages ) )
return FALSE;
return TRUE;
}
…并在插件中执行任何其他操作之前检查该方法:if ( T5_Spam_Block::start_me() )
add_action(
\'wp_loaded\',
array ( T5_Spam_Block::get_instance(), \'plugin_setup\' )
);
如果我的插件被调用,它只做真正需要的事情,其他什么都不做:/**
* Register actions.
*
* @wp-hook wp_loaded
* @return boolean
*/
public function plugin_setup()
{
// Register callbacks only when needed.
if ( \'wp-comments-post\' === self::$page_base )
return add_action(
\'pre_comment_on_post\',
array ( $this, \'check_comment\' )
);
if ( \'options\' === self::$page_base )
return add_action(
\'admin_init\',
array ( $this, \'register_setting\' )
);
if ( \'options-discussion\' === self::$page_base )
return add_action(
\'admin_init\',
array ( $this, \'add_settings_field\' )
);
// Now \'plugins\' === self::$page_base
// Used by add_settings_link() later.
$this->plugin_base = plugin_basename( __FILE__ );
return add_filter(
\'plugin_row_meta\',
array ( $this, \'add_settings_link\' ),
10,
2
);
}
作为一个框架,WordPress提供了专门化插件代码每个部分的工具。但这些工具的使用取决于作者,许多作者在这里失败了。