zoukankan      html  css  js  c++  java
  • 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&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'];
    ?>
    复制代码
     
     
    分类: PHP
  • 相关阅读:
    Unity3D笔记十六 输入输出-键盘事件、鼠标事件
    Unity3D笔记十五 碰撞、移动
    Unity3D笔记十四 力
    Unity3D笔记十三 摄像机之间切换
    the pointer this
    argc[] and *argv[]
    Square Detector
    pointer1
    OpenCV1
    OpenCV
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2992469.html
Copyright © 2011-2022 走看看