<?php /* 本文章是在网上搜寻其他关于wordpress创建插件文章并亲自实践总结而来的代码。 参考文章网址有 http://www.ashuwp.com/courses/level/optionpage 很好的教程,简单易懂 http://www.akasuna.com/2010/10/20/how-to-develop-a-plug-in/ 也是一篇不错的文章 在根目录下 wp-content/plugins 新建存放新建插件文件夹 my_wp_plugin my_wp_plugin 中新建 my_wp_plugin.php 文件 内容: */ /* Plugin Name: 插件名称 Plugin URI: 插件介绍的网址,没有就填博客网址吧 Description: 这里填插件的简短介绍 Version: 版本号 Author: 作者名 Author URI: 作者的网址 */ /* 以上插件信息在my_wp_plugin.php中要用注释括起来 再在my_wp_plugin.php中新建方法 */ function my_wp_plugins_first_fun($content) { //if (is_single ())//只在 single 页才执行 $content .= "<p style='color:red'>这是我测试的第一个wp插件!</p>"; return $content; } /* 到使用的主题文件中的任意页,在想要显示的位置输入(这里在content-page.php页 <?php the_content(); ?> 代码下面添加) */ if(function_exists('my_wp_plugins_first_fun')) {//判断函数是否存在 echo my_wp_plugins_first_fun("测试用-");//可以直接使用插件里的方法 } /* 访问网站刚才修改的页即可看到想要显示的结果 至此,这段代码,应该可以勉强算是一个插件了 但是插件存在一个问题,需要手工去修改主题代码,如果用户换了主题的话,需要在新主题里面再次修改代码,这个不好。 这时要开始用 Filter 钩子了! 总的来说,插件的核心是两个 function,用来添加 Hooks(中文译为钩子) add_action ($hookname, $callbackfunction) add_filter ($hookname,$callbackfunction) 这两个方法相当重要,几乎所有的插件都要用到他们。 Actions,目前理解就是 wordpress 核心代码预留的一些特殊的切入点,或者说是在执行一些特定事件时候发生,例如文章发布时,或者访客留言时触发。 Filters,应该就是 wordpress 执行时,对数据传输过程的一种过滤机制,例如当文章保存到数据库的过程,或者文章从事数据库中取出,展现到浏览器中的这个过程。 今天要制作的插件,应该是用 Filters,因为要在文章显示在浏览器之前,在最后面加上一段字符窜,用来显示版权信息,后面添加菜单项的时候,也要用到 Actions。 改良插件 再在my_wp_plugin.php中添加如下代码 */ add_filter ( 'the_content', 'my_wp_plugins_first_fun' ); /* the_content 是钩子的名字,my_wp_plugins_first_fun 是回调函数名称。 这样一来,只要启用插件就可以实现功能,无需去修改主题了 可以把刚才主题文件中添加的代码删掉,然后启用插件,再查看该页,显示效果应该是一样的,无论怎么换主题,还是会自动显示my_wp_plugins_first_fun方法里的信息。 至此一个真正的插件算是完成了,但是此插件将版权信息直接写在代码里,可以在 WordPress 后台中为插件单独添加一个菜单和页面,信息可以保存在数据库里面。 继续在my_wp_plugin.php中添加如下代码 */ register_activation_hook(__FILE__,'my_wp_plugins_install');/* 注册激活插件时要调用的函数 */ register_deactivation_hook( __FILE__, 'my_wp_plugins_remove' );/* 注册停用插件时要调用的函数 */ function my_wp_plugins_install() { /* 在数据库的 wp_options 表中添加一条记录,第二个参数为存储的值 */ add_option("my_wp_plugins_text" , "<p style='color:red'>这是我测试的第一个wp插件!</p>" , '', 'yes'); } function my_wp_plugins_remove() { delete_option('my_wp_plugins_text');/* 删除 wp_options 表中的对应记录 */ } /* add_option( $option, $value = '', $deprecated = '', $autoload = 'yes' ) string $option 必填,要存到wp_options表option_name字段的值,相当于键名 mixed $value 选填,要存到wp_options表option_value字段的值,相当于键值 mixed $deprecated 选填,不再使用 bool $autoload 选填,预设为启用。要存到wp_options表autoload字段的值,WordPress的启动时是否加载选项。 接着在my_wp_plugin.php中添加如下代码 */ if( is_admin() ) {//判断是否在 WordPress 后台 add_action('admin_menu', 'my_wp_plugins_menu');//添加菜单 } function my_wp_plugins_menu() { add_options_page('信息设置页面', '设置菜单标题', 'administrator','my_wp_plugins', 'plugins_option_menu');//在设置栏下添加菜单,与add_submenu_page添加效果相同,只是wordpress提供的方便形式 add_theme_page( 'title标题' , '外观菜单标题' , 'administrator' , 'my_wp_plugins_theme' , 'plugins_theme_menu');//在外观栏下添加菜单 add_menu_page( 'title标题' , '顶级菜单标题' , 'administrator' , 'my_wp_plugins_top' , 'plugins_top_menu' , '' , 6 );//添加顶级菜单 add_submenu_page( 'my_wp_plugins_top' , 'title标题' , '子菜单标题' , 'administrator' , 'my_wp_plugins_child' , 'plugins_child_menu' );//添加子菜单 } /* add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function); $page_title 页面的title信息 $menu_title 菜单名称 $capability 访问这个页面需要的权限 $menu_slug 菜单别名 需要独一无二 $function 点击该菜单时的回调函数(用以显示设置页面) add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $function); $page_title 页面的title信息 $menu_title 菜单名称 $capability 访问这个页面需要的权限 $menu_slug 菜单别名 需要独一无二 $function 点击该菜单时的回调函数(用以显示设置页面) add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position ); $page_title 页面的title信息 $menu_title 菜单名称 $capability 访问这个页面需要的权限 $menu_slug 菜单别名 需要独一无二 $function 点击该菜单时的回调函数(用以显示设置页面) $icon_url 菜单图标url地址 $position 此菜单项在菜单中的位置,警告:如果两个菜单项的位置属性相同,其中一个可能要被覆盖 上面函数的position参数,默认的菜单项位置属性如下: 2 Dashboard 4 Separator 5 Posts 10 Media 15 Links 20 Pages 25 Comments 59 Separator 60 Appearance 65 Plugins 70 Users 75 Tools 80 Settings 99 Separator add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function ); $parent_slug 父级菜单项的别名 $page_title 页面的title信息 $menu_title 菜单名称 $capability 访问这个页面需要的权限 $menu_slug 菜单别名 需要独一无二 $function 点击该菜单时的回调函数(用以显示设置页面) wordpress对于function参数,这个参数一般是函数名,要调用类的方法,使用 array(类名,函数名) 这样的形式调用。 如果这个参数为空的话,menu_slug参数可以是一个文件路径。basename(__FILE__) 返回当前文件完整名称 至此,已经可以在后台看到菜单项了,但是点击的话,还会出错,因为还没有添加回调函数指向页面 继续在my_wp_plugin.php中添加如下代码 */ function plugins_option_menu() { //如果要存储wp_options表值,以下写法固定 ?> <div> <h2>信息设置</h2> <form method="post" action="options.php"> <?php wp_nonce_field('update-options'); //用来输出提交向options.php页时的验证数据?> <p> <textarea name="my_wp_plugins_text"><?php echo get_option('my_wp_plugins_text'); ?></textarea> </p> <p> <textarea name="my_wp_plugins_text2"><?php echo get_option('my_wp_plugins_text2'); ?></textarea> </p> <p> <input type="hidden" name="action" value="update" /> <!-- 要存的form控件名 = 此处的value值 = wp_options表option_name字段值。多个form控件名在value值中用 , 分开--> <input type="hidden" name="page_options" value="my_wp_plugins_text,my_wp_plugins_text2" /> <input type="submit" name="submit" value="保存设置" class="button-primary" /> </p> </form> </div> <?php } //要启用wordpress自带上传需要引用wordpress自带的JS和CSS //加载上传图片的js(wp自带) wp_enqueue_script('thickbox'); //加载css(wp自带) wp_enqueue_style('thickbox'); //加载jquery,get_bloginfo( 'stylesheet_directory' ) 返回当前网站使用主题所在文件夹完整路径 wp_enqueue_script('my-upload', get_bloginfo( 'stylesheet_directory' ) . '/js/jquery-1.8.2.js'); function plugins_theme_menu(){ ?> <form method="post" enctype="multipart/form-data" action=""> <div> <h2>wordpress自带上传</h2> <p> <label> <input type="text" name="img_url_txt" id="img_url_txt" value="<?php echo get_option('img_url'); ?>" size="80"/> <input type="button" name="upload_but" id="upload_but" value="上传"/> </label> </p> <p> <input type="submit" name="submit" value="保存设置" /> </p> </div> </form> <script type="text/javascript"> $("#upload_but").click(function(){ //点击按钮,打开wordpress自带上传工具 tb_show('', 'media-upload.php?type=image&TB_iframe=true'); }) window.send_to_editor = function(html) { img_url = $('img',html).attr('src'); //将上传后的图片完整路径赋给text框以保存到数据库中 $("#img_url_txt").val(img_url); tb_remove(); } </script> <?php } function plugins_top_menu(){ echo '<h1>这是顶级菜单页面</h1>'; } function plugins_child_menu() { echo '<h3>这是子菜单页面</h3>'; } /* 也可以使用update_option函数来自己手动更新wp_options表数据。 此时提交表单中不需要把提交地址指向wp-admin/options.php(这里假使地址指向当前页),就不需要写wp_nonce_field来验证 也不需要写action,page_options两个隐藏控件 */ if($_POST['submit']){ if($_POST['my_wp_plugins_text']) update_option( "my_wp_plugins_text", $_POST['my_wp_plugins_text'] ); //update_option( "my_wp_plugins_text", array('ok'=>'yes!') );也可存数组,同样取出时取出的也是数组 if($_POST['my_wp_plugins_text2']) update_option( "my_wp_plugins_text2", $_POST['my_wp_plugins_text2'] ); if($_POST['img_url_txt']) update_option( "img_url", $_POST['img_url_txt'] ); } /* update_option( $option, $newvalue ) $option 要更新wp_options表option_name字段的值,相当于键名 $newvalue 要更新wp_options表option_value字段的值,相当于键值 原my_wp_plugins_first_fun函数中 $content 变量值即可改成 $content .= get_option('my_wp_plugins_text'); 从数据库中获取值 插件中也可直接使用PHP的数据库操作函数 */ $que_str = mysql_query("select * from wp_options limit 1"); $row_op = mysql_fetch_array($que_str); echo $row_op['option_name']; ?>