【问题标题】:Wordpress: How to add URL variables to URL using Rewrite after form GET submitWordpress:如何在表单 GET 提交后使用 Rewrite 将 URL 变量添加到 URL
【发布时间】: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 中然后进行重定向?

【问题讨论】:

    标签: php wordpress url-rewriting url-parameters


    【解决方案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 字段值与操作名称匹配。有关这方面的更多信息,请参阅此处的文档:

    【讨论】:

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