如何在表单GET提交后使用重写将URL变量添加到URL



我在我的WordPress网站上有一个简单的搜索表单,使用method="get"在用户提交表单后为我的页面URL添加变量。

在表单提交之后,页面URL看起来像这样:mydomain.com/for-sale/?category=testcategory&othervariable=xx

我用下面的代码重写了我的url,使他们更SEO友好:

function category_query_vars( $query_vars ){
$query_vars[] = 'category';
return $query_vars;
}
add_filter('query_vars', 'category_query_vars');
function add_rewrite_rules($rules) {
$newrules = array(
'^for-sale/([^/]*)/?$' => 'index.php?pagename=for-sale/&category=$matches[1]',
);
$rules = $newrules + $rules;
return $rules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

使用这个代码,我可以访问mydomain/for-sale/testcategorycategory是一个查询变量,我可以得到。

但是,当用户提交搜索表单时(我在其中设置了method='get'),它们被重定向到mydomain.com/for-sale/?category=testcategory&othervariable=xx我想把它们重定向到mydomain.com/for-sale/testcategory/&othervariable=xx

我怎样才能做到这一点?我是否需要编辑我的add_rewrite_rules()函数,或者我可以检查参数是否添加到URL,然后做一个重定向?

我在过去通过将我的数据发布到构建URL并重定向用户的服务器实现了类似的功能。例如:

前端形式:

<form action="<?= admin_url( 'admin-post.php' ); ?>" method="post">
<input type="hidden" name="action" value="search-redirector">
<select name="category">
<option value="testcategory">Test Category</option>
<option value="anothercategory">Another Category</option>
</select>
<input type="text" name="othervariable">
</form>

后端重定向处理:

search_redirect_handler() {
$payload = $_POST;
// Remove WordPress action field.
unset( $payload[ 'action' ] );
// Get category value.
$category = !empty( $payload[ 'category' ] ) ? sanitize_text_field( $payload[ 'category' ] ) : null;
// Base URL.
$url = home_url( '/for-sale/' );
// Add category to the URL structure.
if ( $category ) {
$url = rtrim( $url, '/' ) . '/' . $category;
unset( $payload[ 'category' ] );
}
// Add remaining fields as query strings.
$url = add_query_arg( $payload, $url );
// Send headers.
status_header( 301 );
wp_safe_redirect( $url );
exit;
}
add_action( 'admin_post_search-redirector', 'search_redirect_handler' );
add_action( 'admin_post_nopriv_search-redirector', 'search_redirect_handler' );

注意action字段值与操作名称匹配。有关这方面的更多信息,请参阅这里的文档:

  • 登录用户:https://developer.wordpress.org/reference/hooks/admin_post_action/
  • 来宾用户:https://developer.wordpress.org/reference/hooks/admin_post_nopriv_action/

最新更新