WordPress REST API 定制化输出

WordPress REST API 定制化输出

WordPress 自4.7 版本后与时俱进推出了REST API,如此一来想象空间又扩展了许多,如今WordPress 可以完全作为后端数据驱动了。本文通过几个例子展示如何定制化输出WordPress REST API 的相关数据。

文章数据(posts)禁止某些字段显示

默认的,当请求类似 your-site.com/wp-json/wp/v2/posts?per_page=5&page=1 的接口来获取文章列表,展示的不少字段对一般人来说是没有必要。

秉承“如无必要,勿增实体”的原则,减少请求时候的数据量,可以通过下面的代码移除:

// https://devework.com/wordpress-rest-api-dynamic-output.html
function dw_rest_prepare_post( $data, $post, $request ) {
 
	$_data = $data->data;
 
	$params = $request->get_params();
 
	// if ( ! isset( $params['id'] ) ) {
 
		unset( $_data['excerpt'] );
 
		unset( $_data['author'] );
 
		unset( $_data['featured_media'] );
 
		unset( $_data['format'] );
 
		unset( $_data['ping_status'] );
 
		unset( $_data['comment_status'] );
 
		unset( $_data['sticky'] );
 
		unset( $_data['template'] );
 
	// }
 
	$data->data = $_data;
 
	return $data;
 
}
 
add_filter( 'rest_prepare_post', 'dw_rest_prepare_post', 10, 3 );

文章数据(posts)中输出 post meta 所有字段

可能考虑到数据隐私,文章数据(posts)默认并不显示post meta的相关字段,如果你需要输出对应文章下所有 post meta 字段,可以用下面的代码启用:

// https://devework.com/wordpress-rest-api-dynamic-output.html
register_rest_field( 'post', 'metadata', array(
 
 	'get_callback' => function ( $data ) {
 
 		return get_post_meta( $data['id'], '', '' );
 
 }, ));

输出 post meta 特定字段

接上,如果你在REST API 中仅仅想输出 post meta 特定字段而非全部,则通过类似下面代码:

// https://devework.com/wordpress-rest-api-dynamic-output.html
function dw_rest_prepare_post( $data, $post, $request ) {
 
	$_data = $data->data;
 
	$params = $request->get_params();
 
	$thumb =  get_post_meta( $post->ID, 'thumb' );
 
		if($thumb){
 
			$_data['thumb_image'] = $thumb;
 
		}	
 
	$data->data = $_data;
 
	return $data;
 
}
 
add_filter( 'rest_prepare_post', 'dw_rest_prepare_post', 10, 3 );

上面的代码展示的是如何输出thumb 这个 post meta 字段,请按需使用。

借助 Nginx 控制 /wp-json 的访问

这个倒与WordPress 本身无关了,your-site.com/wp-json 的路由默认是所有人皆可访问。如果你基于服务器负载,或安全等方面考虑选择性输出,可以借助 Nginx 控制访问。先看下面的例子:

# https://devework.com/wordpress-rest-api-dynamic-output.html
location /wp-json {
      if ($http_user_agent !~ '(iPhone|Android)'){
        return 403;
       }
try_files $uri $uri/ /index.php?$args;
}

如果你熟悉Nginx 语法,就知道上面的代码实现了:除了iOS 跟Android 设备(通过判断请求头的UA 信息),其它访问 /wp-json 的路径均返回403 状态码。这在一定程度上起到了保护作用。

遵循类似的思路,也可以通过自定义http 请求头的方式,如:

if ($http_x_access_token != 'your-token'){
   return 403;
}
评分:
当前平均分 5.00 (96%) - 2 个投票
14 条 评论
  1. cai lei

    我觉得这篇文章会误导很多新手,rest api默认输出的字段并不建议去删除,如果要修改也应该复制一个在取不同的名字,因为许多插件或许用到了默认的字段

    6 年前 回复
  2. 如何实现获取分类目录ID为1的文章呢

    6 年前 回复
    • 请自行去查看文档哈

      6 年前 回复
  3. 博主怎么解决跨域问题呢,还有JSON登录授权的问题,自己开发吗

    7 年前 回复
    • 跨域问题具体指哪个功能的跨域问题?WordPress 的JSON登录授权我没有用到。

      7 年前 回复
  4. 请问WordPress rest api有没有中文文档,英文文档实在看不懂,机翻又太差劲

    7 年前 回复
  5. 是不是可以写个授权访问方法

    7 年前 回复
  6. 请问文章数据(posts)中输出 post meta 所有字段的代码添加到什么文件啊?添加到模板的functions.php无效啊?小白,勿怪….

    8 年前 回复
    • 是啊,functions.php

      8 年前 回复
      • 确实无效啊,输出的wp-json/wp/v2/posts依然没postmeta字段

        7 年前 回复
  7. _links: {
    self: [
    {
    href: “http://localhost/wordpress7/wp-json/wp/v2/posts/1”
    }
    ],
    collection: [
    {
    href: “http://localhost/wordpress7/wp-json/wp/v2/posts”
    }
    ],
    about: [
    {
    href: “http://localhost/wordpress7/wp-json/wp/v2/types/post”
    }
    ],

    这个有办法删除吗?

    8 年前 回复
    • 下划线开头的是私有字段,好像无法删除

      8 年前 回复
发表评论