WordPress上传图片时波兰语首字母被截断问题(含preg_replace代码)
WordPress图片上传特殊字符文件名截断问题
我在WordPress中实现了一个功能,上传图片时会将文件名填充到ALT、TITLE、CAPTION字段,期望这些字段内容与文件名一致。
使用的代码如下:
add_action( 'add_attachment', 'my_set_image_meta_upon_image_upload' ); function my_set_image_meta_upon_image_upload( $post_ID ) { if ( wp_attachment_is_image( $post_ID ) ) { $my_image_title = get_post( $post_ID )->post_title; $my_image_title = preg_replace( '%\s*[-_\s]+\s*%', ' ', $my_image_title ); $my_image_meta = array( 'ID' => $post_ID, 'post_title' => $my_image_title, 'post_content' => $my_image_title, 'post_excerpt' => $my_image_title, ); update_post_meta( $post_ID, '_wp_attachment_image_alt', $my_image_title ); wp_update_post( $my_image_meta ); } }
但出现以下问题:
- 当文件名为“Śnieżka”时,上传后字段内容变为“nieżka”
- 当文件名为“Snieżka”时,上传后字段内容能正常显示为“Snieżka”
即文件名首字母为波兰语字符时会被截断,烦请告知原因。
问题原因
问题出在WordPress对上传文件名的默认处理逻辑上:WordPress在生成附件的post_title时,会调用 sanitize 相关函数处理文件名,其中部分字符串操作函数是单字节的,无法正确识别波兰语这类多字节Unicode字符(比如Ś),导致首字符被错误截断。你的代码直接获取了这个已经被处理过的post_title,所以出现了内容缺失的情况。
解决办法
绕开WordPress处理后的post_title,直接从原始文件路径提取文件名:
add_action( 'add_attachment', 'my_set_image_meta_upon_image_upload' ); function my_set_image_meta_upon_image_upload( $post_ID ) { if ( wp_attachment_is_image( $post_ID ) ) { // 获取附件的原始文件路径 $file_path = get_attached_file( $post_ID ); // 提取不含扩展名的文件名 $my_image_title = pathinfo( $file_path, PATHINFO_FILENAME ); // 替换文件名中的分隔符为空格 $my_image_title = preg_replace( '%\s*[-_\s]+\s*%', ' ', $my_image_title ); $my_image_meta = array( 'ID' => $post_ID, 'post_title' => $my_image_title, 'post_content' => $my_image_title, 'post_excerpt' => $my_image_title, ); update_post_meta( $post_ID, '_wp_attachment_image_alt', $my_image_title ); wp_update_post( $my_image_meta ); } }
直接从原始文件路径提取文件名,能避免WordPress默认处理逻辑对多字节字符的错误截断,确保特殊字符文件名完整保留到ALT、TITLE等字段中。
内容的提问来源于stack exchange,提问作者cosiek
相关产品推荐
相关产品推荐

