如何在WordPress数据库中保存EXIF元数据?

时间:2021-11-29 作者:J.D.

我有一个函数,可以获取、检索图像EXIF元数据并将其显示在附件编辑页面上。

function wp_read_image_metadata_exif( $file ) {
if ( ! file_exists( $file ) ) {
    return false;
}

list( , , $image_type ) = wp_getimagesize( $file );

if ( is_callable( \'iptcparse\' ) ) {
    wp_getimagesize( $file, $info );

    if ( ! empty( $info[\'APP13\'] ) ) {

        if ( defined( \'WP_DEBUG\' ) && WP_DEBUG
            && ! defined( \'WP_RUN_CORE_TESTS\' )
        ) {
            $iptc = iptcparse( $info[\'APP13\'] );
        } else {
            $iptc = @iptcparse( $info[\'APP13\'] );
        }
        
        if ( ! empty( $iptc[\'2#090\'][0] ) ) { // City.
            $meta[\'city\'] = trim( $iptc[\'2#090\'][0] );
        }
        if ( ! empty( $iptc[\'2#027\'][0] ) ) { // Location Name.
            $meta[\'locationname\'] = trim( $iptc[\'2#027\'][0] );
        }
    }
}

return apply_filters( \'wp_read_image_metadata_exif\', $meta, $file, $iptc );

}


function display_exif_fields ( $form_fields, $post ){

$type = get_post_mime_type( $post->ID );

$attachment_path = get_attached_file( $post->ID );

$metadata = wp_read_image_metadata_exif( $attachment_path );
$form_fields[\'city\'] = array(
    \'label\' => \'City\',
    \'input\' => \'text\',
    \'value\' => $metadata[\'city\'],
    \'helps\' => \'\',
);

$form_fields[\'locationname\'] = array(
    \'label\' => \'Location name\',
    \'input\' => \'text\',
    \'value\' => $metadata[\'locationname\'],
    \'helps\' => \'\',
);

return $form_fields;
}

add_filter( \'attachment_fields_to_edit\', \'display_exif_fields\', 10, 2 );
元数据显示出来了,但我无法将其保存在WPDB中。以下函数不会产生任何结果:

function save_exif_fields( $post, $attachment ) {
    if( isset( $attachment[\'city\'] ) )
        update_post_meta( $post[\'ID\'], \'city\', $attachment[\'city\'] );

if( isset( $attachment[\'locationname\'] ) )
    update_post_meta( $post[\'ID\'], \'locationname\', $attachment[\'locationname\'] );

return $post;
}

add_filter( \'attachment_fields_to_save\', \'save_exif_fields\', 10, 2 );
我应该如何更改代码来解决此问题?

1 个回复
SO网友:J.D.

我得到了其他论坛上一位大师的帮助。以下代码将字段“City”和“Location name”添加到附件编辑页面。它们的值来自IPTC元数据(Tag: 90, Key: Iptc.Application2.City / Tag: 27, Key: Iptc.Application2.LocationName) 并在上传图像时自动将其保存在数据库中(自定义字段:\'city\' 和\'locationname\'). 可以在同一附件编辑页面上手动修改这些值。

 function wp_read_image_metadata_exif( $file ) {
    if ( ! file_exists( $file ) ) {
        return false;
    }

    list( , , $image_type ) = wp_getimagesize( $file );

    if ( is_callable( \'iptcparse\' ) ) {
        wp_getimagesize( $file, $info );

        if ( ! empty( $info[\'APP13\'] ) ) {

            if ( defined( \'WP_DEBUG\' ) && WP_DEBUG
                && ! defined( \'WP_RUN_CORE_TESTS\' )
            ) {
                $iptc = iptcparse( $info[\'APP13\'] );
            } else {
                $iptc = @iptcparse( $info[\'APP13\'] );
            }
            
            if ( ! empty( $iptc[\'2#090\'][0] ) ) { // City.
                $meta[\'city\'] = trim( $iptc[\'2#090\'][0] );
            }
            if ( ! empty( $iptc[\'2#027\'][0] ) ) { // Location Name.
                $meta[\'locationname\'] = trim( $iptc[\'2#027\'][0] );
            }
        }
    }

    return apply_filters( \'wp_read_image_metadata_exif\', $meta, $file, $iptc );

 }

 function display_exif_fields ( $form_fields, $post ){
                
    $city = get_post_meta( $post->ID, \'city\', true );   
    
    $locationname = get_post_meta( $post->ID, \'locationname\', true );
       
    $form_fields[\'city\'] = array(
      \'label\' => \'City\',
      \'input\' => \'text\',
      \'value\' => $city,
      \'helps\' => \'\',
    );
  
    $form_fields[\'locationname\'] = array(
      \'label\' => \'Location name\',
      \'input\' => \'text\',
      \'value\' => $locationname,
      \'helps\' => \'\',
    );

    return $form_fields;
  }

add_filter( \'attachment_fields_to_edit\', \'display_exif_fields\', 10, 2 );


function save_exif_fields( $post, $attachment ) {

    $array = [ \'city\', \'locationname\' ];
    foreach ( $array as $one ) {
      if ( ! empty( $attachment[ $one ] ) ) {
        update_post_meta( $post[ \'ID\' ], $one, $attachment[ $one ] );
      } else {
        delete_post_meta( $post[ \'ID\' ], $one );
      }
    }

    return $post;   
 }

 add_filter( \'attachment_fields_to_save\', \'save_exif_fields\', 10, 2 );


 add_action(\'added_post_meta\', \'save_exif_fields_on_upload\', 10, 4);

 function save_exif_fields_on_upload($meta_id, $post_id, $meta_key, $meta_value) {
        
    $type = get_post_mime_type( $post_id );

    $attachment_path = get_attached_file( $post_id );

    $metadata = wp_read_image_metadata_exif( $attachment_path );
        
    if($meta_key === \'_wp_attachment_metadata\') {   

        update_post_meta($post_id, \'city\', $metadata[\'city\']);
        update_post_meta($post_id, \'locationname\', $metadata[\'locationname\']);
           
        $attachment_meta = get_post_meta($post_id);
    }
 }

相关推荐

Reducing Database Query Time

在这里寻找一些建议。有一位客户已经在WooCommerce上工作了大约一年半。我们为他们建了一个新网站。他们开始增加一条新的家具生产线。每个项目有700-800个产品变体组合。由于从生产线中添加了大约8个新产品,当您在管理中查看产品列表时,加载需要花费很长时间。如果您快速编辑一个产品,并说将其添加到第二个类别,然后单击“更新”,则完成查询平均需要10.2-10.8秒(根据查询监视器)。意识到有700-800个变体需要迭代,如果可以理解的话,可能需要更长的时间。我已经恢复到2017主题,禁用了除woocom