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

 

posted @ 2013-03-30 17:37  风吹屁股凉冰冰  阅读(609)  评论(0编辑  收藏  举报