在WordPress与Formidable Forms中,如何输出含PHP的字符串并执行其中代码?
解决WordPress+Formidable Forms中存储的HTML字符串执行短码/PHP逻辑的问题
可行方案如下(按推荐度排序):
方案一:直接使用短码+动态替换条目ID(最优解)
无需在HTML中嵌套PHP标签,直接在自定义字段里存储带Formidable短码的HTML结构,例如:
<h2>[frm-field-value field_id=11 entry="%ENTRY_ID%"]</h2> <p>邮箱:[frm-field-value field_id=12 entry="%ENTRY_ID%"]</p>
在页面模板中,通过以下代码处理:
// 获取自定义字段中的签名HTML模板 $signature_template = get_post_meta(get_the_ID(), 'your_signature_field_key', true); // 从URL参数获取当前提交的条目ID $current_entry_id = isset($_GET['entry_id']) ? intval($_GET['entry_id']) : ''; if ($current_entry_id) { // 替换模板中的占位符为实际条目ID $signature_template = str_replace('%ENTRY_ID%', $current_entry_id, $signature_template); } // 执行短码并输出最终HTML echo do_shortcode($signature_template);
这种方式完全利用WordPress原生短码机制,无需执行额外PHP代码,更安全且符合开发规范。
方案二:执行HTML中嵌套的PHP代码(适合已有模板的场景)
如果你的自定义字段已经包含嵌套PHP的HTML字符串,可通过正则匹配+eval执行(因你完全控制内容,无安全风险):
// 获取存储的HTML内容 $content = get_post_meta(get_the_ID(), 'your_custom_field_key', true); // 匹配所有<?php ... ?>代码块 preg_match_all('/<\?php\s*(.+?)\s*\?>/s', $content, $matches); foreach ($matches[0] as $index => $php_block) { // 捕获PHP代码执行结果 ob_start(); eval($matches[1][$index]); $execution_result = ob_get_clean(); // 替换原PHP块为执行结果 $content = str_replace($php_block, $execution_result, $content); } // 输出处理后的HTML echo $content;
注意:eval仅在你100%控制输入内容时使用,禁止用于用户可编辑的内容。
方案三:临时文件执行(适合复杂PHP逻辑场景)
若模板包含大量复杂PHP逻辑,可将内容写入临时PHP文件再执行:
$content = get_post_meta(get_the_ID(), 'your_custom_field_key', true); // 创建临时PHP文件 $temp_file = wp_tempnam('signature-builder'); file_put_contents($temp_file, $content); // 执行临时文件并捕获输出 ob_start(); include $temp_file; $processed_content = ob_get_clean(); // 清理临时文件 unlink($temp_file); // 输出结果 echo $processed_content;
需确保服务器对WordPress临时目录有写入权限,此方案仅在必要时使用。
内容的提问来源于stack exchange,提问作者Thessa Verbruggen
相关产品推荐
相关产品推荐

