Wordpress:如何在表单 GET 提交后使用 Rewrite 将 URL 变量添加到 URL

Posted

技术标签:

【中文标题】Wordpress:如何在表单 GET 提交后使用 Rewrite 将 URL 变量添加到 URL【英文标题】:Wordpress: How to add URL variables to URL using Rewrite after form GET submit 【发布时间】:2021-10-01 16:29:24 【问题描述】:

我的 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 中然后进行重定向?

【问题讨论】:

【参考方案1】:

过去,我通过将我的数据发布到构建 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/

【讨论】:

嗨,非常感谢您的精彩文章。我试过你的代码,提交表单后,类别变量设置正确(我可以使用get_query_var('category')),但URL没有更新,其他变量也没有设置。我还注意到您的代码中有一个小错误;我假设最后几行需要wp_safe_redirect( $url ) 而不是wp_safe_redirect( $redirect ),但是,更新后仍然无法正常工作。仍在尝试弄清楚我还需要更改哪些内容才能使其正常工作.. 哈,我成功了!表单操作 URL 需要 echo :-) 现在您的代码运行良好! (最后几行中的小 $url 编辑)。非常感谢!

以上是关于Wordpress:如何在表单 GET 提交后使用 Rewrite 将 URL 变量添加到 URL的主要内容,如果未能解决你的问题,请参考以下文章

提交并刷新页面后清除表格-Wordpress

在 wordpress 中提交表单后会话丢失

WordPress 强大的表单 - 成功提交表单后更改标题

联系表单 7 成功提交后如何打开弹窗

如何避免表单重复提交

如何在使用 wordpress 以自定义表单提交之前获取图像 url 并发送邮件?