WordPress REST API的默认端点设计为默认返回数据,为大多数站点和用例提供数据,但是往往需要扩展各种对象类型的响应。 为了适应这些需求,REST API被设计为高度可扩展的,就像其余的WordPress一样。本文档详细介绍了如何使用register_rest_field和register_meta函数向默认端点的响应添加附加数据。您可以使用这些函数将字段添加到REST API支持的任何对象类型中。这些自定义字段可以支持get和update操作。 ##关于改变回应的重要注意事项 API提供了许多关于API响应的领域,包括您可能不需要的内容,或者可能不适合您的网站的工作原理。虽然从响应中修改或删除字段很诱人,但这将导致API客户端出现预期标准响应的问题。这包括移动客户端或第三方工具,以帮助您管理您的网站,最终是wp-admin本身。 您可能只需要少量数据,但请务必记住,API是将界面暴露给所有客户端,而不仅仅是您正在开发的功能。变化的反应是危险的。 添加字段不是危险的,所以如果你需要修改数据,最好是用修改的数据来复制字段。不鼓励删除字段;如果您需要回收较小的数据子集,请使用上下文,并考虑使用自己的上下文。 >[warning] 请注意,API不能阻止您更改响应,但代码的结构强烈阻止此。在内部,现场注册由过滤器供电,如果绝对没有其他选择,则可以使用这些注册。 ## 什么register_rest_field 在响应的基础架构中,全局变量$ wp_rest_additional_fields用于保存要添加到每个对象类型的响应的字段。 REST API提供了register_rest_field作为添加到这个全局变量的效用函数。应避免直接添加到全局变量,以确保最大化前向兼容性。 对于每个对象类型 - 帖子或用户,术语,注释等,$ wp_rest_additional_fields包含一个字段数组,每个字段可以具有用于检索该值的回调值,并使用添加该字段的任何端点更新该值可用于更新。 ## 如何使用register_rest_field 函数register_rest_field字段接受三个参数: $ object_type:对象的名称,作为字符串,或该字段正在注册的对象名称的数组。当添加到帖子类型端点时,应使用“post”。或者可以使用“条款”,“元”,“用户”或“注释”。 $ attribute:字段的名称。该名称将用于定义响应对象中的键。 $ args:具有键的数组,用于定义用于检索字段值的回调函数,以更新字段的值并定义其模式。每个这些键都是可选的,但如果不使用,则不会添加该功能。 这意味着如果您指定一个回调函数来读取该值,而不是一个用于更新的回调函数,那么它将是可读的,但不可更新。这在许多情况下可能是需要的。 应在rest_api_init操作中注册字段。使用此操作而不是init将阻止在不使用REST API的WordPress请求期间发生字段注册。 ## 在评论回应中读写一个额外的字段 这个例子的TODO: 将匿名函数更改为命名函数(讨论) 权限检查如何工作? 错误处理? (在什么条件下更新代码被调用,还有什么其他检查需要在现实世界插件中完成?) 开发手册中的代码块的更短的线条和/或样式修复 ``` <?php add_action( 'rest_api_init', function() { register_rest_field( 'comment', 'karma', array( 'get_callback' => function( $comment_arr ) { $comment_obj = get_comment( $comment_arr['id'] ); return (int) $comment_obj->comment_karma; }, 'update_callback' => function( $karma, $comment_obj ) { $ret = wp_update_comment( array( 'comment_ID' => $comment_obj->comment_ID, 'comment_karma' => $karma ) ); if ( false === $ret ) { return new WP_Error( 'rest_comment_karma_failed', __( 'Failed to update comment karma.' ), array( 'status' => 500 ) ); } return true; }, 'schema' => array( 'description' => __( 'Comment karma.' ), 'type' => 'integer' ), ) ); } ); ``` 此示例说明如何将一个称为业务的字段添加到帖子的响应中。 它的作用是因为comment_karma字段存在,但未被核心使用。 请注意,实际执行评论业务需要使用单独的端点。 使用Meta&register_meta 在帖子回复中读写一个后期元字段 ``` <?php // The object type. For custom post types, this is 'post'; // for custom comment types, this is 'comment'. For user meta, // this is 'user'. $object_type = 'post'; $args1 = 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' => 'A meta key associated with a string meta value.', // 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, 'my_meta_key', $args1 ); ``` 此示例显示如何允许读取和写入后期元字段。 这将允许通过POST请求将宇宙飞船字段更新为wp-json / wp / v2 / posts / <post-id>,或者通过POST请求发送到wp-json / wp / v2 / posts / 。 >[warning] 请注意,对于在自定义帖子类型上注册的元字段,帖子类型必须支持自定义字段。 否则,元字段不会出现在REST API中。