WordPress短码多参数适配及子短码嵌入需求技术问询
解决方案:ACF组字段短码实现动态参数返回与子短码嵌入
需求说明
- 实现
[group]短码根据参数返回对应ACF组字段值,例如[group level_skill]返回技能等级字段值、[group lang]返回语言字段值 - 后续需通过该短码生成结构化HTML,同时支持在HTML中嵌入自定义子短码(如
[time]、[chapters]),且能兼容未来新增的子短码
分步实现方案
1. 基础版:动态返回指定ACF组字段值
修正原始代码语法问题,实现根据参数匹配ACF组字段的功能:
<?php add_shortcode('group', function ($atts) { // 获取ACF组字段 $group_field = get_field('info_global_course'); if (!$group_field) return ''; // 解析短码参数:支持[group level_skill]或[group field="level_skill"]两种写法 $field_name = ''; if (!empty($atts)) { if (isset($atts[0])) { $field_name = sanitize_text_field($atts[0]); } elseif (isset($atts['field'])) { $field_name = sanitize_text_field($atts['field']); } } // 验证字段存在后返回对应值,添加转义防止XSS if (!empty($field_name) && isset($group_field[$field_name])) { return esc_html($group_field[$field_name]); } return ''; }); ?>
使用方式:
[group level_skill]→ 返回技能等级字段值[group lang]→ 返回语言字段值[group field="if_id_true"]→ 返回证书字段值
2. 进阶版:生成HTML结构并嵌入子短码
生成完整HTML结构的同时,自动解析嵌入的子短码,确保未来新增子短码无需修改核心逻辑:
<?php add_shortcode('group', function ($atts) { $group_field = get_field('info_global_course'); if (!$group_field) return ''; // 构建HTML模板,直接写入子短码 $html = ' <div class="course-info-group"> <div class="level_skill border_bottom"> <span class="box_left"><i aria-hidden="true" class="far fa-clock"></i> 时长 </span> <span class="box_right">[time]</span> </div> <div class="video border_bottom"> <span class="box_left"><i aria-hidden="true" class="fas fa-video"></i> 学习章节 </span> <span class="box_right">[chapters]</span> </div> <div class="studants border_bottom"> <span class="box_left"><i aria-hidden="true" class="fas fa-user-graduate"></i> 注册学员</span> <span class="box_right">100</span> </div> <div class="level_skill border_bottom"> <span class="box_left"><i aria-hidden="true" class="fab fa-superpowers"></i> 技能等级</span> <span class="box_right">' . esc_html($group_field['level_skill']) . '</span> </div> <div class="lang border_bottom"> <span class="box_left"><i aria-hidden="true" class="fas fa-globe"></i> 语言</span> <span class="box_right">' . esc_html($group_field['lang']) . '</span> </div> <div class="if_id_true border_bottom"> <span class="box_left"><i aria-hidden="true" class="fas fa-sticky-note"></i> 证书</span> <span class="box_right">' . esc_html($group_field['if_id_true']) . '</span> </div> </div> '; // 关键:通过do_shortcode解析HTML中的所有子短码 return do_shortcode($html); }); ?>
核心要点:
- 直接在HTML模板中写入子短码,
do_shortcode()会自动解析所有已注册的子短码 - 未来新增子短码(如
[instructor])时,只需注册该短码并在HTML模板中添加对应位置即可 - 所有ACF字段值使用
esc_html()转义,避免安全风险
3. 兼容双模式(可选)
同时支持「返回单个字段值」和「返回完整HTML结构」两种模式,通过参数区分:
<?php add_shortcode('group', function ($atts) { $group_field = get_field('info_global_course'); if (!$group_field) return ''; // 解析参数,默认返回完整HTML $atts = shortcode_atts([ 'field' => '', 'mode' => 'full' // full=完整HTML,single=单个字段值 ], $atts); // 单字段模式 if ($atts['mode'] === 'single' && !empty($atts['field']) && isset($group_field[$atts['field']])) { return esc_html($group_field[$atts['field']]); } // 完整HTML模式 $html = ' <div class="course-info-group"> <div class="level_skill border_bottom"> <span class="box_left"><i aria-hidden="true" class="far fa-clock"></i> 时长 </span> <span class="box_right">[time]</span> </div> <div class="video border_bottom"> <span class="box_left"><i aria-hidden="true" class="fas fa-video"></i> 学习章节 </span> <span class="box_right">[chapters]</span> </div> <div class="studants border_bottom"> <span class="box_left"><i aria-hidden="true" class="fas fa-user-graduate"></i> 注册学员</span> <span class="box_right">100</span> </div> <div class="level_skill border_bottom"> <span class="box_left"><i aria-hidden="true" class="fab fa-superpowers"></i> 技能等级</span> <span class="box_right">' . esc_html($group_field['level_skill']) . '</span> </div> <div class="lang border_bottom"> <span class="box_left"><i aria-hidden="true" class="fas fa-globe"></i> 语言</span> <span class="box_right">' . esc_html($group_field['lang']) . '</span> </div> <div class="if_id_true border_bottom"> <span class="box_left"><i aria-hidden="true" class="fas fa-sticky-note"></i> 证书</span> <span class="box_right">' . esc_html($group_field['if_id_true']) . '</span> </div> </div> '; return do_shortcode($html); }); ?>
使用方式:
- 完整HTML结构:
[group] - 单个字段值:
[group mode="single" field="lang"]
内容的提问来源于stack exchange,提问作者kfir ben shimon
相关产品推荐
相关产品推荐

