• wordpress——在插件后台管理页面中添加javascript和ajax


    最近在开发一个wordpress插件,需要在插件的后台管理页面上,添加自己写的javascript文件,以达到一些功能。

    查了好几天的文档和资料,终于实现了。

    这里先介绍下wordpress后台页面添加javascript的过程,再介绍添加ajax的过程。


    添加javascript

    首先我们需要知道wordpress插件开发的框架,然后再介绍javascript添加的步骤。

    添加插件设置页面

    开发插件,总需要在管理后台添加自己的插件设置页面、插件设置子页面,在这些页面中,可以设置和保存插件的一些运行参数。

    可以将插件设置页面添加到管理后台的多个位置中。wordpress默认的管理后台面板,提供了page、post、comment和setting等默认主页面菜单。

    如下图所示,也就是中文的“文章”、“页面”、“评论”和“设置”这些主页面菜单。wordpress提供了对应的API,在这些位置的底下,来添加页面。

    例如我们可以在“设置”下,添加我们自己的插件设置页面,利用的是API:

    add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function);
    

    我们也可以在“评论”下,添加我们自己的插件设置页面,利用的是API:

    add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $function); 

    但是呢,我们也可以在和“页面”、“文章”、“评论”这些同一级别上添加我们的插件设置页面。例如,在上图中,我的插件“cartbiner server”的设置页面,就是和“文章”等同级别的。然后再这个插件设置页面下,我们在自己添加相关的子页面。

    我们要用到的API是,具体参数和含义可以查阅wordpress codex:

    add_menu_page();
    add_submenu_page();

    最后我的实现结果是,1个插件的主设置页面,3个插件的子设置页面:

     

    具体请参考:

    wordpress后台管理页面开发 

    添加javascript文件

    这里我们想讲的是,如何在插件设置页面上添加javascript文件。

    我们作为开发者,可以自己直接在输出的html页面里面利用script标签,加入javascript代码。

    但是wordpress不推荐这么做,一是不好管理,而是难以避免多个代码的重复导致错误。

    所以我们这里要说的,其实是利用wordpress提供的接口,在对应的页面头部中添加javascript文件。

    例如,我们在上面添加了3个子设置页面,但是我们想开发一个javascript文件,只添加到“Add Cartbinet”和“Add Door”页面,其他页面都不会包含这个javascript文件,怎么实现?

    wordpress提供了2种添加javascript的方法,但是我只试成功了一种,接下来我会详细介绍我的实现方法。

    有哪些页面类型可以添加javascript文件?

    在wordpress里面,共有以下几个页面位置,可以添加用户自定义的javascript文件。

    分别是:

    • 后台管理页面;
    • 管理者的登录页面;
    • 前台页面(也就是一般访问者看到的页面)。

    以下是从wordpress插件官方开发教程里面摘录的话:

    For administration pages, use admin_enqueue_scripts.

    For front-end pages use wp_enqueue_scripts, except for the login page, in which case use login_enqueue_scripts.

    可以看到共有3种API,可以在以上三种页面类型中添加javascript文件。

    显然,我们这里要用到的是API:

    admin_enqueue_scripts();

    添加javascript文件的过程

     首先,在插件的init_hooks函数里面,在wordpress载入后台管理菜单和页面的时候,添加我们自己的插件设置页面:

    add_action('admin_menu', array( 'CartbinetServer', 'cartbinet_add_pages') );
    add_action('admin_enqueue_scripts', array( 'CartbinetServer', 'cartbinet_load_add_cartbinet_scripts') );

    第一个add_action,是用来添加我们自己的插件设置页面的。

    “admin_menu”,表示wordpress载入后台管理菜单和页面的钩子;

    “cartbinet_add_pages”,添加插件设置页面的函数;

    第二个add_action,是用来载入我们的javascript文件的。

    “admin_enqueue_scripts”,表示wordpress插入管理页面的javascript文件的钩子;

    “cartbinet_load_add_cartbinet_scripts”,载入javascript文件的函数。

    我们按步骤介绍这两个函数:“cartbinet_add_pages”和“cartbinet_load_add_cartbinet_scripts”。

    其次,在添加插件设置页面的函数里面,也就是cartbinet_add_pages,获取我们需要添加javascript文件的页面的hook。也就是说,我们想在哪个页面,添加javascript文件,我们就需要获得这个页面的一个标识——hook。

    这个hook,是下面API的返回值。我们把页面hook,保存在一个全局的数组变量里面,这样其他函数也可以访问到:

    $addCartBinetsPageHook = add_submenu_page;
    $addDoorPageHook = add_submenu_page

    上面的代码只是是表示一下,并没有写完整。读者可以查阅API: add_submenu_page。

    接下来,我们在后台管理页面载入javascript文件的函数里面,也就是函数“cartbinet_load_add_cartbinet_scripts”里面,写入如下代码。

    在这个函数的最开始,我们先判断当前管理页面,是不是我们需要添加javascript文件的那两个插件子设置页面。

    public static function cartbinet_load_add_cartbinet_scripts($hook) {
      if ( ! in_array( $hook, self::$addPages ) )
        return;

      /* put jquery scriptr in the queue*/
      wp_enqueue_script( 'setting-ajax-script', plugins_url( 'accerts/js/setting.js', __FILE__ ) );

      $title_nonce = wp_create_nonce( 'title_example' );
      wp_localize_script( 'setting-ajax-script',
        'my_ajax_obj',
        array(
          'ajax_url' => admin_url( 'admin-ajax.php' ),
          'nonce' => $title_nonce,
        ) );
    }

    wp_enqueue_script就是注册javascript文件的函数。

    至于wp_localize_script则是注册ajax的函数。

    wp_create_nonce是产生ajax交互密钥的函数,也就是说服务器产生一个密钥,前端javascript通过ajax向服务器请求服务数据时,需要发送这个密钥供核对。


    添加ajax

    添加ajax的步骤,其实和添加javascript文件的步骤是一样的。

    首先,在init_hooks函数里面,注册服务器ajax响应函数:

    add_action('wp_ajax_cartbinet_name_list', array( 'CartbinetServer', 'cartbinet_name_list_ajax_handler') );

    我们的ajax响应函数为:

    public static function cartbinet_name_list_ajax_handler () {
        //check nonce
        check_ajax_referer('title_example');
    
        error_log('cartbinet_name_list_ajax_handler');
    
        //get cartbinet name list from xml file, json format
        $names = self::cartbinet_get_name_list();
    
        error_log(implode(" ", $names));
    
        //return data to front end jquery script
        wp_send_json($names);
    
        wp_die(); // all ajax handlers should die when finished
    }

    其次,在载入javascript文件的函数里面,注册ajax交互中要使用的全局变量,以及ajax请求所发送的url位置。

    为什么要这么做,

    因为ajax请求放在javascript文件里面的啊,所以先载入javascript文件,其次呢,在服务器端生成ajax密钥。最后在服务器端注册一个ajax请求和这个交互请求会使用的变量以及url位置。

    public static function cartbinet_load_add_cartbinet_scripts($hook) {
      if ( ! in_array( $hook, self::$addPages ) )
        return;

      /* put jquery scriptr in the queue*/
      wp_enqueue_script( 'setting-ajax-script', plugins_url( 'accerts/js/setting.js', __FILE__ ) );

      $title_nonce = wp_create_nonce( 'title_example' );
      wp_localize_script( 'setting-ajax-script', 
        'my_ajax_obj', 
        array(
          'ajax_url' => admin_url( 'admin-ajax.php' ),
          'nonce' => $title_nonce,
        ) );
    }

    最后,我们再实现前端页面中的javascript文件,

    jQuery(document).ready(function($) {           //wrapper
        
        var this2 = $("#filter-by-name");
        $.post(my_ajax_obj.ajax_url, {         //POST request
            _ajax_nonce: my_ajax_obj.nonce,     //nonce
             action: "cartbinet_name_list",            //action
             title: 'cartbinets_names'                  //data
         }, function(data) {                    //callback
             $(this2).empty();
             $.each(data, function(key, value){
                 var $op = new String("<option>"  + value + "</option>");
                 $(this2).append($op);
             });
         });  
    }); 

    “my_ajax_obj”就是服务器端php所生成的ajax变量:

    my_ajax_obj.ajax_url”,保存了向服务器发送ajax请求的url地址;

    my_ajax_obj.nonce”,保存了ajax交互的密钥。

    “cartbinet_name_list”,对应到服务器PHP端所注册的ajax请求标识,也就是对应在init_hook函数里面注册ajax响应函数时,设置的ajax请求标识。

                也就是说前端发送的这个ajax请求,会被wordpress parse一遍,然后服务器端php根据ajax请求标识,知道要调用函数"cartbinet_name_list_ajax_handler",来响应这个ajax请求。

    add_action('wp_ajax_cartbinet_name_list', array( 'CartbinetServer', 'cartbinet_name_list_ajax_handler') );

    “data”,里面保存的是服务器端通过函数wp_send_json($names)返回的数据。


    参考资料:

    https://developer.wordpress.org/plugins/javascript/enqueuing/

    http://www.solagirl.net/wordpress-ways-to-load-js-css.html

    https://www.zfanw.com/blog/wordpress-add-jquery.html

  • 相关阅读:
    linux中bin和sbin目录的主要区别
    C# 值类型 引用类型 作为参数传递区别
    绿色免安装电视直播软件viviplayer
    [转]中科大校长建议停止以行政主导的高校评估
    MDS 7.0 使用中的问题 2(数据交换中图元的丢失)
    怪异的慢递公司一统快递
    [转]全国最好的医院列表
    多普达D600 问题集锦
    推荐PDG阅读器UnicornViewer
    [转]《乒乓世界》封面故事:中国男乒直板三人行
  • 原文地址:https://www.cnblogs.com/ironx/p/5699646.html
Copyright © 2020-2023  润新知