WordPress Rest API过滤器rest_pre_insert_attachment即使出错也会上传成功,区别于rest_pre_insert_post

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_databaseprepare_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所有,转载请注明出处。)