如何在WooCommerce/WordPress中保留可下载音频文件名的空格
WooCommerce可下载音频保留原始带空格文件名解决方案
代码放置位置
将以下代码添加到当前激活主题的functions.php文件末尾,或添加到自定义代码片段插件中(更推荐,可避免主题更新后代码被覆盖,修改错误也不会直接导致网站崩溃)。
实现代码
// 下载时输出带空格的原始音频文件名 add_filter( 'woocommerce_download_file_name', 'custom_restore_original_audio_filename', 10, 4 ); function custom_restore_original_audio_filename( $filename, $download_id, $product, $download ) { // 获取当前下载文件对应的媒体附件ID $attachment_id = $download->get_id(); if ( empty($attachment_id) ) { return $filename; } // 读取媒体附件的原始标题(上传时默认保存的是带空格的原始文件名) $original_title = get_the_title( $attachment_id ); if ( empty($original_title) ) { return $filename; } // 保留原文件后缀名 $file_extension = pathinfo( $filename, PATHINFO_EXTENSION ); // 如不需要对文件名做任何安全过滤直接保留所有空格,可将下一行替换为 $new_filename = $original_title . '.' . $file_extension; $new_filename = sanitize_file_name( $original_title ) . '.' . $file_extension; return $new_filename; } // 可选:关闭WordPress上传时自动替换文件名空格为连字符的逻辑,从源头保留原始文件名 add_filter( 'sanitize_file_name_chars', 'custom_allow_space_in_audio_filename', 10, 1 ); function custom_allow_space_in_audio_filename( $special_chars ) { // 从非法字符列表中移除空格 return array_diff( $special_chars, array( ' ' ) ); }
逻辑说明
- 主逻辑通过WooCommerce官方提供的
woocommerce_download_file_name钩子实现,触发下载时会自动关联对应产品、下载文件的信息,无需手动匹配产品ID,所有可下载产品都会生效。 - 代码默认读取媒体附件的标题作为输出文件名,你可以在媒体库中单独修改每个音频附件的标题,自定义下载输出的文件名。
- 可选钩子仅在需要媒体库存储的文件本身就保留空格时使用,如果仅需要用户下载时看到带空格的文件名、服务器存储的文件仍用连字符分隔,不需要添加这段代码。
注意事项
- 若不使用可选的上传过滤代码,上传音频后请检查媒体库中对应附件的标题,确保和你想要输出的原始文件名一致。
- 如需要仅对特定产品的下载文件名做修改,可在主函数中添加产品ID判断逻辑,示例:
// 仅对ID为123、456的产品生效 if ( !in_array( $product->get_id(), array(123,456) ) ) { return $filename; }
内容的提问来源于stack exchange,提问作者Mac Dalland
相关产品推荐
相关产品推荐

