如何从ACF自定义字段提取附件URL用于WordPress发布邮件
解决WordPress首次发布文章时通过ACF字段获取附件发送邮件的问题
问题核心是ACF返回的是文件URL,但wp_mail需要服务器本地文件路径,直接用get_field拿到的URL无法被识别为有效附件,需要做URL到本地路径的转换,以下是修改后的完整代码:
function send_mail_post($new_status, $old_status, $post) { // 仅在文章首次发布时触发 if ($new_status === 'publish' && $old_status !== 'publish') { $attachments = array(); // 从ACF获取附件URL $attachment_url = get_field('attachment_1', $post->ID); if ($attachment_url) { // 将URL转换为服务器本地文件路径 $attachment_path = ABSPATH . parse_url($attachment_url, PHP_URL_PATH); // 验证文件存在后再加入附件数组 if (file_exists($attachment_path)) { $attachments[] = $attachment_path; } } // 发送邮件(确保$destinatario_email等变量已提前定义) wp_mail($destinatario_email, $oggetto_email, $email_message, $intestazioni_email, $attachments); } } add_action('transition_post_status', 'send_mail_post', 10, 3);
关键说明:
- URL转本地路径:用
parse_url($attachment_url, PHP_URL_PATH)提取URL中的路径部分,再通过ABSPATH(WordPress根目录绝对路径)拼接成服务器可识别的本地文件路径。 - 有效性校验:增加
file_exists检查,避免因ACF字段为空或文件不存在导致邮件发送失败。 - ACF字段配置:确保你的ACF附件字段「Return Format」选项设置为「File URL」,否则无法正确获取到URL值。
额外注意:
- 确认服务器对目标文件路径有读取权限,否则wp_mail无法读取附件内容。
- 若需支持多个附件,可循环处理多个ACF字段,依次将有效路径加入
$attachments数组。
内容的提问来源于stack exchange,提问作者Roberto Paolucci
相关产品推荐
相关产品推荐

