wordpress插件制作
wordpress插件制作
<? 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' ]; ?>
分类: PHP
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did46421