WordPress JSON 处理相关函数大全
JSON 处理是 WordPress 开发中的经常需要处理的一项工作,为此,WordPress 定义了一堆 JSON 处理的函数,今天做一下统一的介绍。
wp_json_encode
编码成 JSON,并且进行一些完整性检查。
wp_json_encode( $data, $options = 0, $depth = 512 )
简单说下 WordPress 引进这个函数的原因:
首先不同 PHP 版本 json_encode
函数支持不同的参数。PHP 5.3 之前只支持 一个参数 $data
,PHP 5.3 引进了 $options
参数,PHP 5.5 又引进了 $depth
参数。所以 WordPress 适配不同版本的 PHP,wp_json_encode
都支持三个参数,兼容不同版本的 PHP。
在 json_encode
之前,wp_json_encode
使用函数 _wp_json_prepare_data
对数据进行清理,如果 boolean
,integer
,double
,string
,NULL
这些类型,直接返回,如果数组,继续使用 _wp_json_prepare_data
函数对数组中的每个元素进行清理,如果是对象,如果该对象的 class 实现了 JsonSerializable
接口,则返回 $data = $data->jsonSerialize()
,否则,继续使用 _wp_json_prepare_data
对对象中的每个属性进行清理。
然后使用 json_encode
进行编码,如果不成功,则使用 _wp_json_sanity_check
对数据进行完整性处理,最后再使用 json_encode
进行编码。_wp_json_sanity_check
主要使用函数 _wp_json_convert_string
对数据进行深度 UTF-8 检测和转换。
所以建议使用 wp_json_encode
对变量进行 JSON 编码,它的可靠性更高。
wpjam_json_encode
wp_json_encode( $data, $options = JSON_UNESCAPED_UNICODE, $depth = 512 )
PHP5.4 JSON 新增了一个选项:JSON_UNESCAPED_UNICODE
,故名思议:不要编码成 Unicode,让中文更可读。
所以我们写了一个 wpjam_json_encode
函数,相比 wp_json_encode
,就是将 $options
参数默认值设置为 JSON_UNESCAPED_UNICODE
,这样直接使用 wpjam_json_encode($data)
,中文就不会被编码成 unicode,更可读。
只要你安装 WPJAM Basic 插件,你的 WordPress 就会有这个函数。
wp_send_json
直接发送 JSON 数据。
wp_send_json( $response, $status_code = null )
他首先输出 application/json
的 Content-Type 头,如果 $status_code
不为空,则输出 $status_code
的状态码。
然后调用 wp_json_encode
对数据进行编码。
wpjam_send_json
wpjam_send_json( $response, $status_code = null )
同样为了能够 JSON 编码之后,中文更可读,我们也写了 wpjam_send_json
函数,它和 wp_send_json
几乎一致,只是调用对数据进行编码的函数是 wpjam_json_encode
。
另外如果传入的数据是 WP_Error
的实例,那么 wpjam_send_json
直接输出 errcode 和 errmsg JSON。如果没有设置 errcode
,则 wpjam_send_json
自动加上 errcode=>0
安装 WPJAM Basic 插件,你的 WordPress 就会有这个函数。
wp_send_json_success 和 wp_send_json_error
WordPress 还提供 wp_send_json_success
和 wp_send_json_error
两个函数:
wp_send_json_success( $data = null, $status_code = null )
wp_send_json_error( $data = null, $status_code = null )
wp_send_json_success
先输出 success 为 true,然后把数据 $data 放到 data 里面输出。wp_send_json_error
则会判断 $data 是否为 WP_Error 实例,如果是,则输出 code 和 message 的数组。我们实现的 wpjam_send_json
已经能够自动化处理这些错误了。
wp_is_json_request
判断当前请求是不是 JSON 请求,或者返回 JSON 结果,这个函数没有参数,直接使用:
wp_is_json_request()
它通过判断 $_SERVER['HTTP_ACCEPT']
中含有 application/json
,或者 $_SERVER['CONTENT_TYPE']
等于 application/json
。
wp_is_jsonp_request
判断当前请求是不是 JSONP 请求,或者返回 JSONP 结果,这个函数没有参数,直接使用:
wp_is_jsonp_request()
它首先判断 $_GET['_jsonp']
,是否存在,然后通过函数 wp_check_jsonp_callback
判断它的值是否合法。
wp_check_jsonp_callback
判断 JSONP callback 是不是一个一个合法的 JavaScript callback 函数:
wp_check_jsonp_callback( $callback )
合法的 JavaScript callback 函数只能数字加字符,以及英文点号。