You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:05:39