WordPress管理面板添加自定义菜单

在我们制作插件的时候(请参看如何制作WordPress插件),一般都需要在管理面板给用户提供一些选项设置的页面。

在添加这样一个设置页面之前,我们需要先确定有哪些内容提供给用户自己设置,以及我们需要把用户的设置保存在什么地方。

保存和删除设置

本文就将修改前一篇文章中的插件,在后台添加一个设置页面。我们要做的这个设置页面的功能很简单,让用户选择是否在文章中添加文字,如果添加,添加什么文字。也就是说有两个选项需要保存:是否添加文字(autoadd)、文字内容(addtext)。

通过wordpress提供的两个函数update_option和get_option来保存和获取选项。为了避免和其它插件冲突,尽量选择一个独立的选项名,我们这里使用dm_add_text_options作为选项名。

首先,当插件被启用的时候,我们需要把默认的选项保存到数据库中

function dm_add_text_init(){

       $default = array(‘autoadd’ => ‘yes’,’addtext’ => ‘The End !’);

       update_option(‘dm_add_text_options’,$default);

 }

 add_action(‘activate_dm_add_text.php’,’dm_add_text_init’);

 function dm_add_text_deactive(){

       delete_option(‘dm_add_text_options’);

 }

 add_action(‘deactivate_dm_add_text.php’,’dm_add_text_deactive’);

我们来分析一下这段代码:

Adm_add_text_init函数通过调用update_option向数据库表options中添加一个选项名’dm_add_text_options’,值为$default数组。然后通过add_action到activate_dm_add_text.php,当插件被启用的时候就会自动执行am_add_text_init函数,把默认的选项保存到数据库中。

这里我们用到了插件启用时的一个hook,hook名的格式为activate_加插件的文件名,如果插件保存到了plugins文件夹下的一个单独的文件夹下,比如dm-plugin下,hook名需要把文件夹名也要包含进去,就是activate_dm-plugin/dm_add_text.php。

另外我们还应该养成这样一个习惯:如果我们在启用插件的时候向数据库中插入了数据,那么就应该在停用插件的时候把这些数据从数据库中删除(除非用户愿意保存这些数据)。我在试用一些插件的时候就发现一个这样的问题,大部分的插件并没有在停用插件的时候去删除之前保存在数据库中的数据,这就导致了数据库中保存了大量的无用数据,这无疑会降低网站的性能。

另外一个良好的习惯是把我们所有的选项变量以数组的形式保存到一个选项名中,这样只需要在数据库插入一条记录,我看到也有很多插件动辄就在数据库中插入几十条记录。这就是为什么我要研究插件开发的原因,我们要优化插件的性能。

上面的代码片段中的最后一行的作用就是在用户停用插件的时候,调用dm_add_text_deactive函数来删除之前插入到数据库中的选项dm_add_text_options。

保存这段代码之后,再重新启用插件,你会发现数据库的options表中多了一条这样的记录

 

当我们停用该插件的时候,该条记录就会从数据库中删除。

添加页面

下面我们开始添加页面,页面中包含一张表单

function dm_print_admin_options(){

         $opts = get_option(‘dm_add_text_options’);

         if(isset($_POST[‘save_options’])){

                   $opts[‘autoadd’] = $_POST[‘autoadd’];

                   $opts[‘addtext’] = trim($_POST[‘addtext’]);

                   update_option(‘dm_add_text_options’,$opts);

                   echo ‘<div><p><strong>设置保存成功</strong></p></div>’;

         }

         $output = ‘<div><h2>测试插件 Add Text 选项页面</h2>’;

         $output .= ‘<form method=”post” action=”‘.$_SERVER[‘REQUEST_URI’].’”><table>’;

         $output .= ‘<tr><th>是否自动插入到文章尾部</th><td><input value=”yes”‘;

         if(‘yes’ == $opts[‘autoadd’]) {$output .= ‘checked=”checked”‘;}

         $output .= ‘ />’;

         $output .= ‘<label for=”autoadd_yes”>是</label>&nbsp;&nbsp;&nbsp;&nbsp;’;

         $output .= ‘<input value=”no”‘;

         if(‘no’ == $opts[‘autoadd’]) {$output .= ‘checked=”checked”‘;}

         $output .= ‘ />’;

         $output .= ‘<label for=”autoadd_no”>否</label></td></tr>’;

         $output .= ‘<tr><th>插入内容</th><td><textarea style=”width:50%;height:100px”>’;

         $output .= htmlspecialchars(stripslashes($opts[‘addtext’])) .’</textarea></td></tr></table>’;

         $output .= ‘<p><input value=”保存设置” /></p></form></div>’;

         echo $output;

 }

 function dm_add_option_page(){

         add_options_page(‘Add Text’,’Add Text’,9,’dm_add_text.php’,’dm_print_admin_options’);

 }

 add_action(‘admin_menu’,’dm_add_option_page’);

首先我们定义了一个函数dm_print_admin_options用来输出表单内容,通过$_POST的内容来判断如果是提交表单,我们就保存表单的各选项值。接下来是输出表单的内容,其中要注意,为了和管理面板的样式统一,我们要使用固定的CSS class名,比如上面用到的updated、wrap、form-table、submit。

最后通过add_options_page和add_action来把表单页面添加到管理面板的设置菜单:

Add_options_page的函数原型为

add_options_page( $page_title, $menu_title, $access_level, $file, $function = ” )

page_title和menu_title分别设定页面标题和菜单标题,access_level设定页面的访问权限(0~10),file指定生成页面的文件名,如果页面只是通过文件中的一个函数生成的,那么就需要指定function名,就像上面的代码那样。我将在示例文件中给出另外一种方式,通过另外一个单独的文件来生成页面。

重新启用插件,我们会看到在设置里多出来一个菜单项

下面是生成的页面

最后修改一下add_text 函数,根据设置来显示文章内容,如下

function add_text($content = ”){

         $opts = get_option(‘dm_add_text_options’);

         if(‘yes’ == $opts[‘autoadd’]){

                   $content .= ‘</ br>’.stripslashes($opts[‘addtext’]);

         }

         return $content;

 }

然后保存,启用插件,看一下最终效果吧。

至此,制作插件的全部过程已经讲解完了。当然,如果想制作出一个优秀的插件,还需要加强一些其它的知识,比如对数据库的操作,对php语言的了解。我愿和大家一起进步,制作出我们自己的插件。加油吧!

关于本文的示例文件,压缩包中包含一个dm_add_text.php文件和一个dm-add-text文件夹,你可以把这两者之中的一个复制到plugins文件夹下,测试效果是一样的。我的目的是让你看一下两种方法在文件组织以及代码之间的区别。在我们制作插件的时候,推荐把插件文件放在一个文件夹中。

下载本文示例文件:

       Xun6下载        Ziddu下载        趣盘下载

Leave a comment

You must be logged in to post a comment.