WordPress用REST API避免微信小程序中数据加载超过长度限制

今天在开发小程序的过程中发现一个旧的项目在加载了几十条文章数据后,就再也无法继续加载了,微信开发工具中报错“invokeWebviewMethod 数据传输长度为 1957855 已经超过最大长度 1048576”
微信小程序中数据加载超过长度限制

这是由于微信小程序规定页面的data对象最大只能装载1M的数据,而我的数据源都是很长的文章,在加载了50篇左右就超过1M了。显然用WordPress默认的REST API格式是无法突破这个瓶颈了。于是就要想办法修改API,在要加载大量文章的列表页中,把文章正文内容去掉,就能减少90%的数据量,反正列表页也不需要显示正文;只在文章详细页上加载当前文章的所有数据。

首先是去掉默认API的文章详细内容,并且删除掉一些觉得没用的字段:

1
2
3
4
5
6
7
8
9
function filter_post_json( $data, $post, $context ) {
	$data->data['title']['rendered'] = html_entity_decode( $data->data['title']['rendered'] , ENT_NOQUOTES, 'UTF-8');
	$data->data['content']['rendered'] = "";//在列表数据中去掉内容减少读取容量
 
	//以下是删除某个字段
	//unset( $data->data['featured_media'] );
	return $data;
}
add_filter( 'rest_prepare_post', 'filter_post_json', 10, 3 );

如此以后,在https://[域名]/wp-json/wp/v2/posts/ 这样的列表节点上,数据量就小了很多;但是这样做,在 https://[域名]/wp-json/wp/v2/posts/123 这样的文章详情页节点上,也读取不到正文内容了。这里就要自己造一个新的URL,把文章所有内容都放到新的节点上。

这里我自定义了一个节点路径是foodieguild/v1/single-post/,通过参数id来获取详细的文章内容,输出到自己创建的JSON对象中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//https://[域名]/wp-json/foodieguild/v1/single-post/?id=123
add_action( 'rest_api_init', function () {
	register_rest_route( 'foodieguild/v1', '/single-post/', array(
		'methods' => 'GET',
		'callback' => 'brain1981_get_single_post',
	) );
});
function brain1981_get_single_post($request){
	$id = $request['id'];
	$post = get_post($id);
	$post->post_title = html_entity_decode( $post->post_title , ENT_NOQUOTES, 'UTF-8');
	$post->post_content = apply_filters( 'the_content', $post->post_content );//加入rendered内容,防止小程序里面图片莫名错位
	$post->post_content = html_entity_decode( $post->post_content , ENT_NOQUOTES, 'UTF-8');
 
	class postClass{
		var $post_id;
		var $post_title;
		var $post_content;
		var $signature;
	}
	$postClass = new postClass();
	$postClass->post_id = $id;
	$postClass->post_title = $post->post_title;
	$postClass->post_content = apply_filters( 'the_content', $post->post_content );
	$postClass->signature = get_option('post-signature');//自定义的数据
 
	return $postClass;
 
	//如果希望返回原生的post对象格式,可以直接这样:
	return $post;
}

本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.brain1981.com/1806.html。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

如本文对你有用,请在页面右侧栏扫码领取我的支付宝红包,作为打赏吧 (喂到底是我赏你还是你赏我啊-_-!)

关注我们的微信公众号-JennyStudio 本站记录了近几年的工作中遇到的一些技术问题和解决过程,“作品集”还收录了本人的大部分作品展示。除了本博客外,我们的工作室网站 – JennyStudio,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。

2 关于 “WordPress用REST API避免微信小程序中数据加载超过长度限制” 的评论

  1. 有个需求,像要得到热门文章排列的json有办法吗?

    每个文章都有一个views的自定义字段,记录文章点赞次数,现想得到按数字从大到小的排列输入json。查了官方,好像orderby现在不支持按自定义的字段了?

    请问大师可有解决方案?万谢

    回复
    1. Brain 文章作者

      orderby一直都支持按照自定义字段排序,不可能倒退啊。在查询里面加上一条meta_key=keyname,然后就可以用orderby=meta_value排序了,请查看官方文档
      另外,这篇文章主要是建议把文章content从默认的JSON里面删除,减少JSON的长度,这样就可以把全部文章除了content外的数据全部都一次读入小程序。这样的好处就是你可以在小程序里面用JS给文章排序,不必每次都请求API了

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注