WordPress REST API根据meta_key获取全状态文章(已发布、草稿等)

WordPress REST API获取文章内容,通常是用id去请求数据,但id相对比较敏感,不太适合直接暴露给用户。

如此,推荐自定义字段meta_value来获取文章,只需要在rest_post_query中添加新的过滤器即可,具体实现方法:

WordPress Rest API通过元数据meta获取文章列表posts

遗憾的是这种方式只能获取publish类型的文章,意思就是说目标文章必须是【已发布】状态时,才能正确返回。

(也许有高级配置能实现获取全状态的文章,时间原因,没有进一步研究。)

另一种方式是自定义REAT API,添加新的路由,逻辑完全可控,想获取什么信息畅通无阻,前提是保证安全性。

#-----------------------------------------------------------------#
# REST-API自定义路由
#-----------------------------------------------------------------#
add_action( 'rest_api_init', 'cpury_rest_register_route' );

function cpury_rest_register_route() {
	register_rest_route( 'cpury/v1', 'metas/(?P<id>[a-zA-Z0-9-]+)', [
	    'methods'  => 'GET',
	    'callback' => 'cpury_rest_base_cb'
	  ] );
}

#-----------------------------------------------------------------#
# REST-API 根据meta 获取文章内容
#-----------------------------------------------------------------#
function cpury_rest_base_cb($request) {
  // 接收meta_value
	$params = $request->get_params();
	$meta_value = $params['id'];

  // 查询postmeta表,获取文章id
	global $wpdb;
	$real_post_id = $wpdb->get_var( "SELECT post_id FROM $wpdb->postmeta WHERE meta_value = '$meta_value'" );
	
  // 根据文章id,获取实体
  $target_post = get_post($real_post_id);

	$out = array(
	    'code' => 0,
	    'data' => array(
	    		'content' => $target_post->post_content,
	    		'id' => (int)$post_id
	    	)
  	);

	return $out;
}

调用api:

/wp-json/cpury/v1/metas/xxxxxxxx

逻辑其实很简单:

  1. 添加新api
  2. 根据meta_value获取post_id
  3. 再根据post_id获取post_content

自定义路由方式自由度非常高,自然不限于文章状态,获取草稿肯定不在话下。


WordPress文章自定义字段postmeta一般有两种方式。

第一,代码方式:register_meta,传入字段名和meta类型。

$object_type = 'post';

$meta_args_uuid = array( // Validate and sanitize the meta value.
    // Note: currently (4.7) one of 'string', 'boolean', 'integer',
    // 'number' must be used as 'type'. The default is 'string'.
    'type'         => 'string',
    // Shown in the schema for the meta key.
    'description'  => 'uuid description',
    // Return a single value of the type.
    'single'       => true,
    // Show in the WP REST API response. Default: false.
    'show_in_rest' => true,
);
register_meta( $object_type, 'uuid', $meta_args_uuid );

第二,可视化方式,在文章编辑器设置中打开自定义字段,以新版古腾堡编辑器为例,如图:

刷新页面后,底部栏便会出现控制meta的区块。

(版权归cpury.com所有,转载请注明出处。)