本文转自:https://devework.com/wordpress-rest-api-dynamic-output.html


WordPress 自4.7 版本后与时俱进推出了REST API,如此一来想象空间又扩展了许多,如今WordPress 可以完全作为后端数据驱动了。

不过,也方便了搞采集的那些人……

本文通过几个例子展示如何定制化输出WordPress REST API 的相关数据。

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 字段,可以用下面的代码启用:

1
2
3
4
5
register_rest_field('post', 'metadata', array(
    'get_callback' => function ($data) {
        return get_post_meta($data['id'], '', '');
    },
));

输出 post meta 特定字段

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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 控制访问。先看下面的例子:

1
2
3
4
5
6
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 请求头的方式,如:

1
2
3
if ($http_x_access_token != 'your-token'){
    return 403;
}

版权声明:部分文章、图片等内容为用户发布或互联网整理而来,仅供学习参考。如有侵犯您的版权,请联系我们,将立刻删除。