我在我的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/testcategory
和category
是一个查询变量,我可以得到。
但是,当用户提交搜索表单时(我在其中设置了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/