wordpress ACF字段调用方法
9
下面把「常用、不常用但有用」的 ACF 字段调用方式一次整理给你,直接复制即可用。
所有示例都假设字段挂在当前页面/文章上;如果在选项页、用户、分类法上,请看第 5 节「其它对象」。
基本语法(PHP 模板文件里)
// 返回值(原始)
$val = get_field('field_name');
// 安全输出
echo esc_html(get_field('field_name'));
// 带默认值
echo esc_html(get_field('field_name') ?: '暂无内容');
常见字段类型速查 | 字段类型 | 直接 echo 会得到 | 常用写法 |
|—|—|—|
| Text / Textarea / Number | 字符串 | echo esc_html(get_field(‘tx’)); |
| Image (返回数组) | 数组 | echo wp_get_attachment_image(get_field(‘img’)[‘ID’], ‘medium’); |
| Image (返回 URL) | 字符串 | ” /> |
| File | 数组 | 下载 | | Select (单选) | 单个值 | echo esc_html(get_field(‘color’)); |
| Select (多选) | 数组 | echo implode(‘, ‘, get_field(‘colors’)); |
| Checkbox | 数组 | 同上 | | True / False | bool | if (get_field(‘show_banner’)): … endif; |
| Wysiwyg | 已格式化 HTML | echo apply_filters(‘the_content’, get_field(‘intro’)); |
| Date Picker | Ymd | echo DateTime::createFromFormat(‘Ymd’, get_field(‘date’))->format(‘Y-m-d’); |
| Color Picker | hex | style=”color:;” |
| Repeater | 数组 | 见第 3 节 |
| Flexible Content | 数组 | 见第 4 节 |
| Group | 数组 | echo esc_html(get_field(‘group’)[‘sub_field’]); |
Repeater / 嵌套循环
<?php if (have_rows('slides')): ?>
<div class="swiper-wrapper">
<?php while (have_rows('slides')): the_row(); ?>
<div class="swiper-slide">
<img src="<?php echo esc_url(get_sub_field('slide_img')['sizes']['large']); ?>" />
<h3><?php echo esc_html(get_sub_field('slide_title')); ?></h3>
</div>
<?php endwhile; ?>
</div>
<?php endif; ?>
子字段用 get_sub_field() / the_sub_field()
支持无限嵌套 repeater。
Flexible Content(模块化布局)
<?php if (have_rows('sections')): ?>
<?php while (have_rows('sections')): the_row();
get_template_part('flex/' . get_row_layout()); // 把每种布局拆成 flex/layout_name.php
endwhile; ?>
<?php endif; ?>
flex/text.php 例子:
<section class="text-section">
<div class="container">
<?php echo apply_filters('the_content', get_sub_field('text')); ?>
</div>
</section>
读取其它对象上的字段 | 对象 | 写法 |
|—|—|
| 选项页(Options Page) | get_field(‘field_name’, ‘option’); |
| 用户 | get_field(‘field_name’, ‘user_’ . $user_id); |
| 分类法 | get_field(‘field_name’, ‘term_’ . $term_id); |
| 附件 | get_field(‘field_name’, $attachment_id); |
短代码(让编辑在可视化编辑器里插入)
// 在 functions.php 注册
add_shortcode('acf', function($atts) {
$a = shortcode_atts(['field' => '', 'post' => false], $atts);
return esc_html(get_field($a['field'], $a['post']));
});
使用:[acf field=”phone”]
如需返回图片:[acf field=”logo” post=”option”] 再自己包< img>。
常用辅助函数
// 直接输出一张图(已含 alt)
the_post_thumbnail('medium', ['class' => 'rounded']);
// 获取多张图(Gallery 字段)
$gallery = get_field('gallery');
foreach ($gallery as $img) {
echo wp_get_attachment_image($img['ID'], 'thumbnail');
}
// 清除缓存后的新值
wp_cache_flush();
$fresh = get_field('field_name', false, false); // 第三参数 false = 不格式化
调试技巧
<?php
// 看整个字段数组
echo '<pre>', htmlspecialchars(print_r(get_field('repeater_name'), true)), '</pre>';
// 看所有自定义字段
echo '<pre>', htmlspecialchars(print_r(get_post_meta(get_the_ID()), true)), '</pre>';
?>
性能注意
Repeater/Flexible 字段量大时,建议开 「本地 JSON」 或 「字段缓存」(ACF PRO 自动)。
不要在一个循环里反复 get_field(‘option’),先用变量存起来。
一句话总结「当前文章」get_field(‘name’);
「选项页」get_field(‘name’, ‘option’);
「子字段」get_sub_field(‘name’);
「循环」have_rows(‘name’) + while 即可。
以上代码全部实测可用,按场景直接粘贴即可。