已编辑帖子
我已经删除了我原来的回复,因为它妨碍了我。
WordPress(以及许多/最现代的 CMS)的工作方式是,它们告诉 Apache、Nginx 或 IIS 等服务器执行其正常工作,但如果服务器产生有效的 404,则将该结果传递给CMS 在已知点 (index.php) 进行进一步处理。
服务器级别
您可以挂钩的第一个地方是使用 .htaccess 文件之类的服务器级别。你可以有一个规则将/cars/* 映射到/cars/?car_type=*。不重定向,只是映射。该地图应在服务器级别产生有效的 404,这意味着 WordPress 使用已知 URL 和可以忽略的查询字符串启动。 (我 95% 确信这会起作用,但我现在没有可用于测试的 Apache 服务器。)您可以注册查询参数,或者您可以只使用 $_GET 并执行逻辑。
但我不是编辑服务器配置文件的忠实粉丝,尤其是如果这需要更加动态,或者由习惯这样做的人管理。
WordPress 级别
所以下一站是在 WordPress 中以某种方式处理事情。坏消息是,无论您做什么,WordPress 都会将此视为 404。但好消息是,您可以根据需要重新路由 404。
我将继续使用/cars/limo 路径,但您可以根据需要进行调整。
前两个步骤是可选的,但更接近于“官方”的做事方式,我鼓励你这样做,但我稍后会解释如何跳过它们。
首先,我们需要在 WordPress 中注册一个我们感兴趣的模式。第一个参数是一个正则表达式,第二个是一个映射,最后一个说我们基本上想要胜过其他规则。 添加此代码或对其进行任何更改时,您需要刷新 WordPress 永久链接。此外,如果您在本地开发并且根本没有启用重写,则需要打开它们。
add_action(
'init',
static function () {
add_rewrite_rule('cars/(.+)[/]?$', 'index.php?car_type=$matches[1]', 'top');
}
);
然而,前面的事情并没有做很多事情,所以我们还需要告诉 WordPress 我们对某些查询字符串感兴趣。这个查询字符串在前面和后面的函数之间应该是相同的。
add_filter(
'query_vars',
static function ($query_vars) {
$query_vars[] = 'car_type';
return $query_vars;
}
);
最后一步是使用神奇的template_include 过滤器和get_query_var。此过滤器在每个非管理页面上调用,因此请小心处理,并确保仅在保证处于特定场景时才更改返回。 get_query_var 能够提取出我们在第二步中注册的查询字符串。
add_filter(
'template_include',
static function ($template) {
$car_type = get_query_var('car_type');
if ($car_type) {
// The path must be absolute
return __DIR__ . '/cars.php';
}
return $template;
}
);
对于if 逻辑,您可能需要执行其他操作,例如检查数组以查看它是否在已知类型的集合中。如果可能的话,您真的应该避免在此处进行数据库调用,因为请记住,这是在每个页面上调用的。
跳过前两步
如果确实说过您可以跳过前两个步骤,虽然我不推荐这样做,但我想向您展示如何做到这一点。我们仍将使用template_include 钩子,但现在我们将手动查看 URL 并使用它进行操作。这不能保证在不同的服务器环境中存活,并且您可能会遇到一些时髦的场景,所以我说跳过它。我也不打算包含计算页面本身的逻辑,这也应该很容易。
add_filter(
'template_include',
static function ($template) {
$url = wp_parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if( YOUR LOGIC FOR PARSING URL HERE ){
return 'cars.php';
}
return $template;
}
);