如何将包含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]");
关键注意点
- 变量作用域:函数内部无法直接访问外部
$user,必须通过参数传入(不推荐使用global,不符合代码规范) - 输出捕获:
woocommerce_form_field会直接输出HTML,必须用ob_start()/ob_get_clean()捕获内容,才能放入短码中处理 - 短码格式:短码标签前后不能加多余空格,否则WordPress无法识别短码
- 短码执行:必须通过
do_shortcode()处理包含短码的字符串,确保短码逻辑被执行
内容的提问来源于stack exchange,提问作者bluedimensional
相关产品推荐
相关产品推荐

