最近在开发一个wordpress插件,须要在插件的后台管理页面上,添加本身写的javascript文件,以达到一些功能。javascript
查了好几天的文档和资料,终于实现了。php
这里先介绍下wordpress后台页面添加javascript的过程,再介绍添加ajax的过程。css
首先咱们须要知道wordpress插件开发的框架,而后再介绍javascript添加的步骤。html
开发插件,总须要在管理后台添加本身的插件设置页面、插件设置子页面,在这些页面中,能够设置和保存插件的一些运行参数。前端
能够将插件设置页面添加到管理后台的多个位置中。wordpress默认的管理后台面板,提供了page、post、comment和setting等默认主页面菜单。java
以下图所示,也就是中文的“文章”、“页面”、“评论”和“设置”这些主页面菜单。wordpress提供了对应的API,在这些位置的底下,来添加页面。jquery
例如咱们能够在“设置”下,添加咱们本身的插件设置页面,利用的是API:ajax
add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function);
咱们也能够在“评论”下,添加咱们本身的插件设置页面,利用的是API:json
add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $function);
可是呢,咱们也能够在和“页面”、“文章”、“评论”这些同一级别上添加咱们的插件设置页面。例如,在上图中,个人插件“cartbiner server”的设置页面,就是和“文章”等同级别的。而后再这个插件设置页面下,咱们在本身添加相关的子页面。数组
咱们要用到的API是,具体参数和含义能够查阅wordpress codex:
add_menu_page();
add_submenu_page();
最后个人实现结果是,1个插件的主设置页面,3个插件的子设置页面:
具体请参考:
这里咱们想讲的是,如何在插件设置页面上添加javascript文件。
咱们做为开发者,能够本身直接在输出的html页面里面利用script标签,加入javascript代码。
可是wordpress不推荐这么作,一是很差管理,而是难以免多个代码的重复致使错误。
因此咱们这里要说的,实际上是利用wordpress提供的接口,在对应的页面头部中添加javascript文件。
例如,咱们在上面添加了3个子设置页面,可是咱们想开发一个javascript文件,只添加到“Add Cartbinet”和“Add Door”页面,其余页面都不会包含这个javascript文件,怎么实现?
wordpress提供了2种添加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();
首先,在插件的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的步骤,其实和添加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