如何修改MediaWiki LanguageSelector扩展以保留自定义URL参数dbid?
保留LanguageSelector切换语言时的自定义URL参数
当然可以修改LanguageSelector扩展来保留dbid这类自定义参数!核心思路是让扩展在生成语言切换链接时,把当前URL里的自定义参数一并带上,而不是只添加setlang参数。下面是具体的修改步骤:
1. 定位扩展的核心代码文件
找到你安装的LanguageSelector扩展的主文件(通常是LanguageSelector.php),打开它并搜索生成语言切换链接的代码段。一般来说,这段代码会出现在钩子函数里(比如SkinTemplateNavigation::Universal),或者专门的链接生成方法中。
2. 修改链接生成逻辑
原来的代码大概率是直接生成只带setlang参数的URL,类似这样:
$href = $title->getFullURL( [ 'setlang' => $langCode ] );
我们需要把当前URL里的自定义参数(比如dbid)保留下来,替换成下面的逻辑:
// 获取当前请求对象,用来读取URL参数 $request = $skin->getRequest(); // 读取当前URL的所有查询参数 $currentParams = $request->getQueryValues(); // 移除已有的setlang参数,避免切换语言时出现冲突 unset($currentParams['setlang']); // 【可选】如果只想保留特定参数(比如只留dbid),可以加个白名单过滤 // $allowedParams = ['dbid']; // $currentParams = array_intersect_key($currentParams, array_flip($allowedParams)); // 添加新的语言切换参数 $currentParams['setlang'] = $langCode; // 生成包含所有保留参数的新URL $href = $title->getFullURL($currentParams);
举个完整的例子,如果扩展是通过SkinTemplateNavigation::Universal钩子添加语言链接的,修改后的钩子函数大概是这样:
public static function onSkinTemplateNavigationUniversal( $skin, &$links ) { global $wgLanguageSelectorLanguages; $title = $skin->getTitle(); $request = $skin->getRequest(); foreach ( $wgLanguageSelectorLanguages as $langCode => $langName ) { $currentParams = $request->getQueryValues(); unset($currentParams['setlang']); // 只保留dbid参数的话取消下面两行注释 // $allowedParams = ['dbid']; // $currentParams = array_intersect_key($currentParams, array_flip($allowedParams)); $currentParams['setlang'] = $langCode; $links['user-menu'][$langCode] = [ 'text' => $langName, 'href' => $title->getFullURL($currentParams), 'class' => 'language-selector-link', ]; } return true; }
3. 生效修改
修改完成后,记得清除MediaWiki的缓存(可以直接刷新页面,或者在服务器上运行php maintenance/rebuildCache.php命令),这样新的链接生成逻辑就会生效了。
之后再切换语言时,URL里的dbid参数就会被保留下来,比如从/w/MainPage?dbid=12345切换到德语后,URL会变成/w/index.php?title=Main_Page&dbid=12345&setlang=de。
内容的提问来源于stack exchange,提问作者user3103115
相关产品推荐
相关产品推荐

