WordPress提交GET表单后如何通过Rewrite重写将URL参数转为路径格式
实现方案
你可以选择前端表单改造或者服务端重定向两种方式实现需求,优先推荐前端改造,避免额外的重定向开销:
方案1:拦截表单提交直接组装友好URL
GET表单默认会把所有字段参数拼接到URL的查询串(?后面的部分),你可以通过JS拦截表单提交事件,手动组装成你需要的友好URL后跳转:
<!-- 你的搜索表单示例,需要给表单加id方便绑定事件 --> <form id="sale-search-form" action="/for-sale/" method="get"> 分类:<input type="text" name="category" id="category"> 其他参数:<input type="text" name="othervariable" id="othervariable"> <button type="submit">搜索</button> </form>
// 绑定表单提交事件 document.querySelector('#sale-search-form').addEventListener('submit', function(e) { // 阻止默认的GET提交行为 e.preventDefault(); const category = document.querySelector('#category').value.trim(); const otherVar = document.querySelector('#othervariable').value.trim(); // 组装基础URL let targetUrl = '/for-sale/'; if (category) { targetUrl += `${encodeURIComponent(category)}/`; } // 拼接其他查询参数 const queryParams = new URLSearchParams(); if (otherVar) { queryParams.append('othervariable', otherVar); } const queryStr = queryParams.toString(); if (queryStr) { targetUrl += `?${queryStr}`; } // 跳转至友好URL window.location.href = targetUrl; });
方案2:服务端检测参数重定向(兜底方案)
如果不想修改前端表单代码,可以用WordPress钩子检测带参数的请求,自动301重定向到友好URL格式:
// 检测请求重定向到友好URL add_action('template_redirect', 'category_friendly_url_redirect'); function category_friendly_url_redirect() { // 仅在for-sale页面且存在category查询参数时触发 if (is_page('for-sale') && isset($_GET['category']) && !empty($_GET['category'])) { $category = sanitize_text_field($_GET['category']); // 组装友好URL $redirect_url = home_url("/for-sale/{$category}/"); // 保留除category外的其他查询参数 $other_params = $_GET; unset($other_params['category']); if (!empty($other_params)) { $redirect_url .= '?' . http_build_query($other_params); } // 301重定向对SEO更友好 wp_redirect($redirect_url, 301); exit; } }
配套调整说明
你之前写的add_rewrite_rules和查询变量注册代码不需要修改,WordPress重写规则默认会自动保留后续的查询参数,操作完成后记得进入WP后台【设置】-【固定链接】点击保存按钮刷新重写规则,否则可能不生效。
注意:你期望的URL格式
mydomain.com/for-sale/testcategory/&othervariable=xx不符合URL规范,第一个查询参数的前缀应为?而非&,最终合法的URL格式为mydomain.com/for-sale/testcategory/?othervariable=xx,上述方案都会自动生成符合规范的URL。
内容的提问来源于stack exchange,提问作者Senne Vandenputte
相关产品推荐
相关产品推荐

