<?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'];
?>