WordPress上传JPG时如何用EXIF版权信息填充图片说明?
解决WordPress用EXIF版权自动填充图片说明的问题
我来帮你搞定这个问题!你的代码出现「非法字符串偏移'image_meta'」的错误,主要是两个核心问题没处理好:一是wp_read_image_metadata()的参数用错了,二是没有提前检查元数据数组的键是否存在,直接访问会触发报错。下面是修正后的可用代码,我会一步步给你解释细节:
修正后的完整代码
<?php add_action( 'add_attachment', 'my_set_image_copyright_as_caption' ); function my_set_image_copyright_as_caption( $post_ID ) { // 只处理图片类型的附件 if ( ! wp_attachment_is_image( $post_ID ) ) { return; } // 获取图片文件的绝对服务器路径(wp_read_image_metadata需要这个,不能直接传post ID) $attachment_file = get_attached_file( $post_ID ); if ( ! file_exists( $attachment_file ) ) { return; } $copyright = ''; // 优先读取原始图片的EXIF版权信息 $image_metadata = wp_read_image_metadata( $attachment_file ); if ( is_array( $image_metadata ) && isset( $image_metadata['copyright'] ) ) { $copyright = trim( $image_metadata['copyright'] ); } // 如果原始EXIF没读到,尝试从WordPress已保存的附件元数据里找 else { $attachment_meta = wp_get_attachment_metadata( $post_ID ); if ( is_array( $attachment_meta ) && isset( $attachment_meta['image_meta']['copyright'] ) ) { $copyright = trim( $attachment_meta['image_meta']['copyright'] ); } } // 只有拿到有效版权信息时,才更新附件字段 if ( ! empty( $copyright ) ) { // 更新图片说明(对应后台的「说明」字段,即post_excerpt) // 同时同步更新描述字段(post_content),不需要的话可以删掉这一行 wp_update_post( array( 'ID' => $post_ID, 'post_excerpt' => $copyright, 'post_content' => $copyright, ) ); // 可选:把版权信息设为图片的alt文本,不需要就删掉 update_post_meta( $post_ID, '_wp_attachment_image_alt', $copyright ); } }
关键修复点说明
- 参数修正:
wp_read_image_metadata()需要传入图片的绝对服务器路径,而不是附件的post ID,我用get_attached_file()获取了正确的路径。 - 安全检查:每一步都加了数组和字段存在性判断,彻底避免「非法字符串偏移」的报错。
- 兼容性处理:先读原始图片的EXIF,再 fallback 到WordPress保存的元数据,确保不同场景下都能拿到版权信息。
- 空值判断:只有当版权信息不为空时才执行更新,避免覆盖用户手动设置的内容(如果想强制覆盖,可以去掉这个判断)。
使用注意事项
- 把代码添加到你的主题
functions.php文件,或者自定义插件中即可生效。 - 这个钩子只对新上传的图片生效,已经上传的旧图片需要批量处理的话,可以额外写个批量更新函数。
- 注意测试不同格式的图片(JPG/PNG等),不是所有图片都包含EXIF版权信息。
内容的提问来源于stack exchange,提问作者Romain Guillaume
相关产品推荐
相关产品推荐

