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

如何将包含foreach循环的代码移入echo do_shortcode中?

问题解决:将WooCommerce表单代码移入短码内执行

问题背景

现有一段可正常生成WooCommerce通知设置表单的代码,需要放入echo do_shortcode('[wcm_restrict]...[/wcm_restrict]')短码中执行,但尝试多种方法均失败:

  • 直接粘贴代码到短码字符串中无效
  • 使用输出缓冲区后,短码未被解析,表单仍直接输出
  • 用函数包裹代码后,出现Undefined variable '$user'错误

原代码(模板文件notification-settings.php中):

/**
 * @var WP_User $user
 */
use OneSignalNotificator\Frontend\WooCommerce\WooCommerceAccountNotificationsPanel;

foreach (WooCommerceAccountNotificationsPanel::fields as $fieldName => $fieldSettings) {
    woocommerce_form_field( $fieldName, 
                            $fieldSettings, 
                            get_user_meta($user->ID,    
                            $fieldName, 
                            true) ?? null
    );
}

$user变量在外部action回调中定义:

add_action('woocommerce_account_notifications-settings_endpoint', function () {
    $user = wp_get_current_user();
    require_once('templates/notification-settings.php');
});

解决方案

方案1:优化输出缓冲区用法

核心是正确捕获表单HTML,无空格包裹短码标签,确保短码被解析:

/**
 * @var WP_User $user
 */
use OneSignalNotificator\Frontend\WooCommerce\WooCommerceAccountNotificationsPanel;

// 启动缓冲区捕获表单输出
ob_start();

foreach (WooCommerceAccountNotificationsPanel::fields as $fieldName => $fieldSettings) {
    woocommerce_form_field(
        $fieldName,
        $fieldSettings,
        get_user_meta($user->ID, $fieldName, true) ?? null
    );
}

// 获取捕获的HTML并清空缓冲区
$form_html = ob_get_clean();

// 用短码包裹HTML并处理输出(注意标签前后无多余空格)
echo do_shortcode("[wcm_restrict]{$form_html}[/wcm_restrict]");

方案2:带参数的函数包裹法

将$user作为参数传入函数,捕获输出后返回,再传入短码:

/**
 * @var WP_User $user
 */
use OneSignalNotificator\Frontend\WooCommerce\WooCommerceAccountNotificationsPanel;

function render_notification_fields(WP_User $user) {
    ob_start();
    foreach (WooCommerceAccountNotificationsPanel::fields as $fieldName => $fieldSettings) {
        woocommerce_form_field(
            $fieldName,
            $fieldSettings,
            get_user_meta($user->ID, $fieldName, true) ?? null
        );
    }
    // 返回捕获的HTML内容,而非直接输出
    return ob_get_clean();
}

// 调用函数并传入$user,用短码包裹后输出
echo do_shortcode("[wcm_restrict]" . render_notification_fields($user) . "[/wcm_restrict]");

关键注意点

  1. 变量作用域:函数内部无法直接访问外部$user,必须通过参数传入(不推荐使用global,不符合代码规范)
  2. 输出捕获:woocommerce_form_field会直接输出HTML,必须用ob_start()/ob_get_clean()捕获内容,才能放入短码中处理
  3. 短码格式:短码标签前后不能加多余空格,否则WordPress无法识别短码
  4. 短码执行:必须通过do_shortcode()处理包含短码的字符串,确保短码逻辑被执行

内容的提问来源于stack exchange,提问作者bluedimensional

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:25:57