如何在WordPress页面中展示Perl CGI脚本的运行结果?
解决方案
方法1:让表单直接提交到页面内的iframe(最简单,无需修改CGI)
你之前的核心问题是表单参数没传递到iframe里的CGI脚本,只需给表单添加target属性指向iframe的name,就能让提交后的参数直接传给CGI,结果在页面内的iframe展示,同时保留WP页面的原有风格。
步骤:
- 在WP页面插入带
name属性的iframe:
<iframe name="cgi-result" width="100%" height="600" style="border: none;"></iframe>
(可按需调整宽高,border: none能让iframe更贴合WP页面样式)
- 修改你的HTML表单,添加
target="cgi-result":
<form action="/cgi-bin/test.cgi" method="POST" target="cgi-result"> <!-- 你的表单字段:文本框、单选框等 --> <input type="text" name="email" placeholder="输入邮箱"> <!-- 其他单选选项 --> <button type="submit">提交</button> </form>
提交后浏览器不会跳转,参数会正常传递给CGI,结果直接在页面内的iframe中显示,不会出现“未填写邮箱”的错误(前提是表单字段name和CGI接收的字段名一致)。
方法2:用WP短代码嵌入CGI输出(无iframe,风格完全统一)
如果不想用iframe,可通过WP短代码让CGI结果直接融入WP页面,无需跳转。
子方法A:短代码转发表单请求并输出结果
在WP主题的functions.php(或用「Code Snippets」这类自定义代码插件)中添加以下代码:
function cgi_test_shortcode() { // 处理表单提交 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 把POST参数传递给CGI脚本 $ch = curl_init($_SERVER['DOCUMENT_ROOT'] . '/cgi-bin/test.cgi'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch); // 返回CGI输出,WP会自动套用页面样式 return $result; } // 未提交时显示表单 return '<form action="" method="POST"> <input type="text" name="email" placeholder="输入邮箱"> <!-- 你的其他表单字段 --> <button type="submit">提交</button> </form>'; } add_shortcode('cgi_test', 'cgi_test_shortcode');
之后在WP页面中插入[cgi_test]短代码即可。提交表单后页面刷新,CGI结果会直接显示在当前WP页面内,完全匹配网站风格。
子方法B:修改CGI输出为HTML片段(无需PHP基础)
如果你不想碰PHP,可修改Perl CGI脚本,让它只输出结果的HTML片段(去掉完整的<html>、<body>等标签):
#!/usr/bin/perl use strict; use CGI; my $cgi = CGI->new; # 接收表单参数 my $email = $cgi->param('email'); # 你的计算逻辑... # 只输出结果片段(无需HTTP头,WP页面已提供) print '<p>你的结果说明文本</p>'; print '<table><tr><td>计算结果</td><td>...</td></tr></table>'; print '<p>底部说明文本</p>';
之后在WP页面中用iframe加载这个修改后的CGI,就能得到无多余框架的融合效果。
关于你之前的跳转代码错误
你写的Perl跳转代码问题在于:Location HTTP头必须在所有输出前发送,且发送后必须退出脚本,否则会导致服务器错误。正确写法示例:
#!/usr/bin/perl use strict; # 先处理表单参数、计算结果(如需传递结果,需存在session或cookie中) # ... # 发送跳转头 print "Location: /your-wp-page-url\n"; print "Content-Type: text/html\n\n"; exit; # 必须退出,避免后续代码执行
但这种方法需要额外处理结果存储,对新手来说复杂度较高,更推荐前面的方法1或2。
内容的提问来源于stack exchange,提问作者saitori
相关产品推荐
相关产品推荐

