如何正确编写调用ACF文件上传字段的WordPress短代码
问题修复说明
你写的短代码存在4个核心语法/逻辑错误:
- 变量名非法:判断条件中错误使用
$delib-fichier,PHP不允许变量名包含减号,和你之前赋值的$delib_fichier(下划线命名)不匹配,会直接触发语法错误。 - 嵌套PHP标签错误:已经处于PHP执行环境中拼接字符串时,不需要额外写
<?php echo ?>标签,直接拼接变量即可,这种写法会导致PHP标签被当成普通文本输出,代码完全失效。 - 冗余无效代码:
$url = wp_get_attachment_url( $file );这行的$file变量从未定义,属于无用代码,会触发PHP未定义变量警告。 - 缺少兼容处理:没有兼容ACF文件字段返回附件ID的场景,也没有做安全转义,不符合WordPress开发规范。
正确可直接使用的代码
把以下代码替换你原来的短代码片段,放到主题的functions.php或者自定义功能插件里即可:
add_shortcode('delib-fichier', function($atts, $content = null) { // 提取短代码属性,支持传入post_id指定文章,默认取当前循环文章 $atts = shortcode_atts([ 'post_id' => get_the_ID(), ], $atts); $delib_fichier = get_field('delib-fichier', intval($atts['post_id'])); $output = ''; // 兼容ACF返回数组/附件ID两种返回格式 if (is_numeric($delib_fichier)) { $delib_fichier = [ 'url' => wp_get_attachment_url($delib_fichier), 'filename' => basename(get_attached_file($delib_fichier)) ]; } // 字段有值时输出安全转义后的下载链接 if (!empty($delib_fichier) && isset($delib_fichier['url'])) { $output .= sprintf( '<a href="%s" target="_blank" rel="noopener noreferrer">%s</a>', esc_url($delib_fichier['url']), esc_html($delib_fichier['filename']) ); } return $output; });
使用说明
- 正常在文章/页面内容编辑器里直接写
[delib-fichier],即可自动输出当前文章对应ACF字段的文件下载链接 - 如果需要在非文章循环页面(比如分类页、首页、独立模板页)调用指定文章的文件,可以传参使用:
[delib-fichier post_id="123"],把123换成对应文章ID即可
内容的提问来源于stack exchange,提问作者Calikyo
相关产品推荐
相关产品推荐

