WordPress插件PHP搜索表单提交时出现404页面错误求助
你的问题核心在于WordPress环境中,直接使用相对路径action="search.php"无法正确定位到插件目录下的search.php文件,再加上WordPress的URL重写机制,导致表单提交时路径错误,最终出现404页面。下面是具体的修复步骤:
1. 修正表单的Action路径
在stracking_init函数中,把表单的action属性改为插件目录下search.php的绝对URL。WordPress提供了plugins_url()函数来安全获取插件文件的URL,这样不管插件放在哪个位置,路径都不会出错。
修改后的stracking_init函数:
function stracking_init(){ // 获取search.php的绝对URL $search_url = plugins_url('search.php', __FILE__); echo '<form action="' . esc_url($search_url) . '" method="post">'; echo "<h1>Britchi Tracking</h1>"; echo '<p>'; echo 'Costumers Name (required) <br/>'; echo '<input type="text" name="search" placeholder="Emmanuel John" size="70"/>'; echo '</p>'; echo '<p><input type="submit" name="csearch" value="Search"></p>'; echo '</form>'; }
这里用esc_url()转义URL,符合WordPress安全规范,能避免XSS风险。
2. 优化Search.php的数据库操作(可选但推荐)
你当前直接用mysqli_connect连接数据库,不符合WordPress的最佳实践。建议使用WordPress内置的wpdb类,它已经处理了数据库连接、安全转义等问题,更安全可靠:
修改后的search.php:
<?php // 加载WordPress环境,确保wpdb可用 require_once($_SERVER['DOCUMENT_ROOT'] . '/wp-load.php'); global $wpdb; $table_name = $wpdb->prefix . 'demo'; // 自动获取数据库表前缀,适配不同WordPress安装 $set = isset($_POST['search']) ? sanitize_text_field($_POST['search']) : ''; ?> <table border=""> <tr> <th>Firstname</th> <th>Lastname</th> <th>Email</th> <th>RecivedPort</th> <th>DestinationPort</th> <th>Location</th> <th>Destination</th> </tr> <?php if($set) { // 使用prepare防止SQL注入 $results = $wpdb->get_results($wpdb->prepare("SELECT * FROM $table_name WHERE cname = %s", $set)); if($results) { foreach($results as $row) { ?> <tr> <td><?php echo esc_html($row->cname); ?></td> <td><?php echo esc_html($row->ctracking); ?></td> <td><?php echo esc_html($row->cemail); ?></td> <td><?php echo esc_html($row->crport); ?></td> <td><?php echo esc_html($row->cdport); ?></td> <td><?php echo esc_html($row->clocation); ?></td> <td><?php echo esc_html($row->cdestination); ?></td> </tr> <?php } } else { echo '<tr><td colspan="7">nothing found</td></tr>'; } } else { echo '<tr><td colspan="7">nothing found</td></tr>'; } ?> </table>
这里做了几个关键优化:
- 加载
wp-load.php确保能调用WordPress的函数和类 - 使用
wpdb->prefix自动获取数据库表前缀,适配不同的WordPress安装 - 用
prepare方法防止SQL注入,提升安全性 - 用
sanitize_text_field和esc_html处理输入输出,避免XSS攻击
3. 添加CSRF安全验证(推荐)
为了提升表单安全性,建议添加WordPress的nonce验证,防止跨站请求伪造攻击:
在stracking_init函数的表单中添加nonce字段:
function stracking_init(){ $search_url = plugins_url('search.php', __FILE__); echo '<form action="' . esc_url($search_url) . '" method="post">'; // 添加nonce字段 wp_nonce_field('britchi_search_action', 'britchi_search_nonce'); echo "<h1>Britchi Tracking</h1>"; // ... 其他表单内容 }
然后在search.php中验证nonce:
<?php require_once($_SERVER['DOCUMENT_ROOT'] . '/wp-load.php'); // 验证nonce if (!isset($_POST['britchi_search_nonce']) || !wp_verify_nonce($_POST['britchi_search_nonce'], 'britchi_search_action')) { wp_die('Invalid request.'); } // ... 后续数据库操作 ?>
为什么之前会跳转到process.php?
大概率是因为相对路径search.php在前端页面(比如文章页、自定义页面)中,浏览器会解析为当前页面URL的同级目录下的search.php,而这个目录下不存在该文件,可能你的主题或其他插件有表单提交的默认处理逻辑,导致被重定向到process.php,或者是WordPress的404机制被触发后出现的错误路径。修复action的绝对路径后就能解决这个问题。
内容的提问来源于stack exchange,提问作者Britchi2

