函数文档

wp_maybe_generate_attachment_metadata()

💡 云策文档标注

概述

wp_maybe_generate_attachment_metadata() 函数用于在附件元数据缺失时尝试生成它,通过检查文件存在性和避免重复生成来确保数据完整性。

关键要点

  • 函数接受一个 WP_Post 对象作为必需参数,代表附件。
  • 检查附件 ID 和文件是否存在,如果元数据为空且文件存在,则尝试生成元数据。
  • 使用 transient 锁机制防止并发生成,避免重复操作。
  • 核心逻辑包括调用 wp_generate_attachment_metadata() 和 wp_update_attachment_metadata() 来创建和更新元数据。

代码示例

function wp_maybe_generate_attachment_metadata( $attachment ) {
    if ( empty( $attachment ) || empty( $attachment->ID ) ) {
        return;
    }

    $attachment_id = (int) $attachment->ID;
    $file          = get_attached_file( $attachment_id );
    $meta          = wp_get_attachment_metadata( $attachment_id );

    if ( empty( $meta ) && file_exists( $file ) ) {
        $_meta = get_post_meta( $attachment_id );
        $_lock = 'wp_generating_att_' . $attachment_id;

        if ( ! array_key_exists( '_wp_attachment_metadata', $_meta ) && ! get_transient( $_lock ) ) {
            set_transient( $_lock, $file );
            wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) );
            delete_transient( $_lock );
        }
    }
}

注意事项

  • 函数自 WordPress 3.9.0 版本引入,确保在兼容版本中使用。
  • 相关函数包括 wp_generate_attachment_metadata()、get_transient()、set_transient()、delete_transient()、wp_get_attachment_metadata()、wp_update_attachment_metadata()、get_attached_file() 和 get_post_meta(),用于元数据生成和临时数据管理。
  • 在编辑表单中由 edit_form_image_editor() 调用,适用于附件处理场景。

📄 原文内容

Maybe attempts to generate attachment metadata, if missing.

Parameters

$attachmentWP_Postrequired
Attachment object.

Source

function wp_maybe_generate_attachment_metadata( $attachment ) {
	if ( empty( $attachment ) || empty( $attachment->ID ) ) {
		return;
	}

	$attachment_id = (int) $attachment->ID;
	$file          = get_attached_file( $attachment_id );
	$meta          = wp_get_attachment_metadata( $attachment_id );

	if ( empty( $meta ) && file_exists( $file ) ) {
		$_meta = get_post_meta( $attachment_id );
		$_lock = 'wp_generating_att_' . $attachment_id;

		if ( ! array_key_exists( '_wp_attachment_metadata', $_meta ) && ! get_transient( $_lock ) ) {
			set_transient( $_lock, $file );
			wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) );
			delete_transient( $_lock );
		}
	}
}

Changelog

Version Description
3.9.0 Introduced.