新版本的 WordPress 自动加入了 REST 接口,方便我们通过 API 的方式去获取网站的数据,但是如果有一些自定义的数据那就比较麻烦了,不然还需要我们自己再定义一套 REST 规则,然后自定义一些路由方法。
所幸的是 WordPress 已经考虑到这一点,提供了方法让我们可以自定义 REST 接口:
add_action( 'rest_api_init', 'wtheme_rest_register_route' );
function wtheme_rest_register_route() {
register_rest_route( 'wtheme/v1', 'topBottomMenu', [
'methods' => 'GET',
'callback' => 'wtheme_rest_base_cb'
] );
}
function wtheme_rest_base_cb() {
$out = array(
'top-menu' => get_top_menu(),
'bottom-menu' => get_footer_menu(),
'footer_copyright' => get_option( 'footer_copyright' ),
'zh_cn_l10n_icp_num' => get_option( 'zh_cn_l10n_icp_num' )
);
return $out;
}
先创建一个函数挂载到 rest_api_init 钩子上,这个函数执行 register_rest_route 方法添加接口路由 wtheme/v1/topBottomMenu,然后有一个回调函数 wtheme_rest_base_cb 设置要返回的数据。
我们只需要修改 wtheme_rest_base_cb 函数返回的数据,就能实现响应不同的数据。
往往我们的接口可能需要通过参数去响应不同的内容,比如一个自定义的列表,需要有显示多少条、分页页码、排序方式等参数,通过自定义接口我们一样可以完成。
add_action( 'rest_api_init', 'wtheme_rest_register_route' );
function wtheme_rest_register_route() {
register_rest_route( 'wtheme/v1', 'topBottomMenu/(?P[\d]+)', [
'methods' => 'GET',
'callback' => 'wtheme_rest_base_cb'
] );
}
function wtheme_rest_base_cb($request) {
$params = $request->get_params();
$id = $params['id'];
$out = array(
'top-menu' => get_top_menu(),
'bottom-menu' => get_footer_menu(),
'footer_copyright' => get_option( 'footer_copyright' ),
'zh_cn_l10n_icp_num' => get_option( 'zh_cn_l10n_icp_num' )
);
return $out;
}
再通过 register_rest_route 注册一个新的路由,配置我们的参数,通过正则表达式去匹配,在回调函数里面使用 $request->get_params() 获取参数。
可以通过下面的函数获取到不同部分的参数值:
$request->get_url_params();
$request->get_query_params();
$request->get_body_params();
$request->get_json_params();
$request->get_default_params();
$request->get_file_params(); // 上传的文件
在使用接口的时候,可以检查用户的权限。注册接口的时候添加一个权限检查的回调(permission_callback),在方法里用 WordPress 的 current_user_can 去检查对应的权限。
register_rest_route( 'wtheme/v1', 'topBottomMenu/(?P<id>[\d]+)', [
'methods' => 'GET',
'callback' => 'wtheme_rest_base_cb',
'permission_callback' => 'wtheme_rest_base_validate_callback'
]);
权限检查回调:
function wtheme_rest_base_validate_callback() {
return current_user_can( 'edit_others_posts' );
}