将查询字符串添加到url,并将其显示为普通url部分/文件夹/

时间:2020-05-15 作者:Peps

我在一些URL中添加了一个查询字符串,但它并不漂亮:

?city=Amsterdam
因此,我想将url的结构如下:https://example.com/realpage1/realpage2/amsterdam/ or https://example.com/realpage1/amsterdam/ 取决于内容的类型。

然后使用htaccess获取变量,如:

RewriteRule ^/(.*)/(.*)/(.*)$ ?city=$3
页面/aaa/bbb/DO退出。但上面给出了404。

如何在Wordpress中实现这一点?谢谢

UPDATE:根据@pat的建议,以及用户提供的注释中的代码,我现在有了下面的代码。但是,仍然返回了404。我错过了什么?代码被添加到我的子主题函数中。顺便提一下php。

function wpdocs_flush_rules() {

    $rules = get_option( \'rewrite_rules\' );

    if ( ! isset( $rules[\'(.*)/(.*)/([a-zA-Z-]{4,20})/?$\'] ) ) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }

}
add_action( \'wp_loaded\',\'wpdocs_flush_rules\' );


function wpdocs_insert_rewrite_rules( $rules ) {

    $newrules = array();
    $newrules[\'(.*)/(.*)/([a-zA-Z-]{4,20})/?$\'] = \'index.php?stad=$matches[3]\';
    return $newrules + $rules;

}
add_filter( \'page_rewrite_rules\', \'wpdocs_insert_rewrite_rules\' );


function wpdocs_insert_query_vars( $vars ) {

    $vars[] = \'city\';
    return $vars;

}
add_filter( \'query_vars\', \'wpdocs_insert_query_vars\' );

2 个回复
最合适的回答,由SO网友:Peps 整理而成

好吧,经过几天的挖掘,我终于找到了答案。问题是:

index.php?pagename=$matches[1]/$matches[2]&city=$matches[3]
“pagename”参数也必须设置和填充,并使用两个“slug”。

我最终得到的完整代码是:

function custom_rewrite_rule() {
    add_rewrite_rule( \'(.*)/(.*)/([a-z-]{4,20})[/]?$\', \'index.php?pagename=$matches[1]/$matches[2]&city=$matches[3]\', \'top\' );
}
add_action(\'init\', \'custom_rewrite_rule\', 10, 0);

function insert_custom_query_vars ( $vars ) {

    $vars[] = \'city\';
    return $vars;

}
add_filter( \'query_vars\', \'insert_custom_query_vars\' );
快乐博客;)

SO网友:simongcc

这里有几点需要分享,因为我可以预见评论会很长,我在这里发布了一些建议供参考,希望能够解决这个问题。

关于重写的第一点

$newrules[\'/(\\d*)$\'] = \'index.php?city=$matches[1]\';
我猜您希望使用如下urlhttps://example.com/new_york/ 城市将占据的道路new_york 比如城市=纽约。然而,规则(\\d*) 它只希望筛选出数字,因此将忽略0-9以外的字符。

只是猜测它会是([^/]+)

不包括斜杠“/”,+将任何字符1匹配到无限次,表示捕获组

$newrules[\'([^/]+)/?$\'] = \'index.php?city=$matches[1]\';
请尝试此中的正则表达式tool(该工具需要退出/ => 编写为\\/, 在php代码中,您不需要这样做)

关于优先级的第二点rewrite_rules_array 使用,以便将上面的规则添加到规则的末尾(如果有其他插件也这样做,则添加到近端)。重写规则按顺序匹配。因此,有可能404是在规则与类似模式匹配之前确定的。

可以通过多种方式将规则置于更高的优先级,例如放入其他早期的规则筛选器或使用add\\u rewrite\\u rule()和top 属性使其以更高的优先级匹配。换言之,首先匹配此规则的可能性会增加,并可能导致其他不期望的效果。因此,有必要进行彻底的测试,以满足您的需求。Please expect testing and adjustment to be made before it comes to satisfaction.

请参阅不同过滤器的文档:

function wpdocs_insert_rewrite_rules( $rules ) {

    $newrules = array();
    $newrules[\'([^/]+)/?$\'] = \'index.php?city=$matches[1]\';
    return $newrules + $rules;
}
add_filter( \'TRY_CHANGING_FILER_HERE_IF_LOADING_PRIORITY_MATTERS\',\'wpdocs_insert_rewrite_rules\' );
使用上述过滤器的另一种方法是使用add_rewrite_rule()

add_action(\'init\', \'ws366689_insert_rewrite_rules\' );
function ws366689_insert_rewrite_rules() {
        add_rewrite_rule(\'([^/]+)/?$\', \'index.php?city=$matches[1]\', \'top\');
}
关于写入格式,我个人认为您可以使用文档中显示的格式来编写数组,以简化和清晰。

function wpdocs_insert_query_vars( $vars ) {

    $vars[] = \'city\';
    return $vars;

}
add_filter( \'query_vars\',\'wpdocs_insert_query_vars\' );
还需要更新wpdocs\\u flush\\u rules()中的规则。

相关推荐

Wp-登录时的基本身份验证.htAccess,但允许从WooCommerce注销

我使用.htaccess 在我的WC网站上进行基本身份验证,以帮助防止黑客访问wp-login, 效果很好。。。除WooCommerce外,如果登录的客户想要从其帐户注销-单击注销链接后,他们会收到基本的身份验证弹出窗口,要求他们“授权”(由我们的.htaccess).在Woocommerce仪表板上:您好MrTest(不是MrTest?注销)<<;单击“注销”将打开基本身份验证登录框。。。。我们如何避免这种情况?以下是htaccess的内容:<FilesMatch \"wp-login.p