Joomla 4中如何输出non-sef URL Joomla3旧代码失效解决方案
Joomla 4 输出non-sef URL实现方法
Joomla 4对路由层API做了重构,Joomla 3版本的JSite::getRouter()调用逻辑不再兼容,直接使用旧代码会出现参数丢失、解析结果错误的问题。
当前页面non-sef URL获取代码
在Joomla 4的模板、组件、模块、插件运行环境中,可直接使用以下代码输出当前页面对应的non-sef URL:
<?php use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; // 加载当前URI实例与站点路由器 $currentUri = Uri::getInstance(); $router = Factory::getApplication()->getRouter(); // 解析SEF地址拿到原生查询参数 $queryParams = $router->parse($currentUri); // 过滤路由器生成的内部临时参数(所有以__开头的字段) foreach ($queryParams as $paramKey => $paramVal) { if (substr($paramKey, 0, 2) === '__') { unset($queryParams[$paramKey]); } } // 拼接生成标准non-sef URL $nonSefUrl = 'index.php?' . http_build_query($queryParams); echo $nonSefUrl;
自定义SEF URL转non-sef URL方法
如果需要转换指定的SEF地址,只需要替换URI实例加载逻辑即可:
<?php use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; // 填入需要转换的目标SEF URL $targetSefUrl = 'https://你的站点地址/分类/文章别名.html'; $targetUri = Uri::getInstance($targetSefUrl); $router = Factory::getApplication()->getRouter(); $queryParams = $router->parse($targetUri); foreach ($queryParams as $paramKey => $paramVal) { if (substr($paramKey, 0, 2) === '__') { unset($queryParams[$paramKey]); } } $nonSefUrl = 'index.php?' . http_build_query($queryParams); echo $nonSefUrl;
注意事项
- 多语言站点下解析结果会自动携带
lang参数,无需手动追加 - 如果需要保留URL中不属于Joomla路由的自定义参数(如广告追踪参数),可以将URI实例中获取的原始query参数合并到
$queryParams后再拼接 - 不要继续使用Joomla 3时代的
JSite静态类调用路由,Joomla 4中该类的方法仅做了向下兼容别名,底层逻辑已变更,会出现解析异常
内容的提问来源于stack exchange,提问作者Jordan Weinstein
相关产品推荐
相关产品推荐

