WordPress Rest API过滤器rest_pre_insert_attachment即使出错也会上传成功,区别于rest_pre_insert_post
2022-04-27
WordPress Rest API提供了三个十分有用的过滤器,在插入目标之前允许开发者加入自定义判断条件。
- –
rest_pre_insert_post
- –
rest_pre_insert_page
- –
rest_pre_insert_attachment
post和attachment多少还是存在一定区别。
rest_pre_insert_post
在通过REST API插入文章或页面之前对其进行过滤。
rest_pre_insert_attachment
在通过REST API插入媒体库附件之前对其进行过滤。
attachment的控制器继承于post,重载了许多方法。
<?php
/**
* 文件位置 /wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php
*/
class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller {
这里着重说下prepare_item_for_database和prepare_item_for_database。
源代码处理post:
$prepared_post = $this->prepare_item_for_database( $request );
if ( is_wp_error( $prepared_post ) ) {
return $prepared_post;
}
$prepared_post->post_type = $this->post_type;
源代码处理attachment:
$attachment = $this->prepare_item_for_database( $request );
$attachment->post_mime_type = $type;
$attachment->guid = $url;
对比看出,对于attachment,不关心错误处理,必定要插入成功。经实际测试,上传后的文件缺少文件类型,无法正确识别。
特地下载了最新版本wordpress-5.9.3,查阅后确定此处未变动,推测是官方要降低附件插入门槛,不算bug。
笔者遇到的开发情形,需要post和attachment有同样的处理,其实很简单,自己加入判断错误条件即可。
$attachment = $this->prepare_item_for_database( $request );
if ( is_wp_error( $attachment ) ) {
return $attachment;
}
$attachment->post_mime_type = $type;
$attachment->guid = $url;
注意:需要修改内核代码,请谨慎选择。目前没发现有其他更好的方法,迫不得已才行此策。
(版权归cpury.com所有,转载请注明出处。)