WordPress 4.9.1单站点有永久链接转译选项,多站点缺失求解
为什么WordPress多站点缺失西里尔文转拉丁文永久链接选项?怎么恢复?
这个问题我之前维护WordPress多站点时碰到过,本质是多站点的权限架构和默认设置逻辑导致的,我来给你拆解原因和解决办法:
问题原因
WordPress单站点里的「西里尔文转拉丁文永久链接」选项,本质属于**permalink sanitization(永久链接清理)**的一部分,单站点模式下这个选项开放给站点管理员自主控制。但在多站点模式下:
- 核心默认把这类全局影响的设置权限收归给了网络管理员,单个站点的「设置/常规」页面会隐藏或禁用这个选项;
- 在WordPress 4.9.1的多站点版本中,官方并没有在网络后台的「网络设置」面板里添加对应的开关,导致这个功能直接被“藏起来”,单个站点管理员完全看不到选项入口。
解决办法
根据你的需求(全局所有站点生效,还是单个站点单独设置),有两种方案可选:
方案一:全局开启并恢复单个站点的设置选项(推荐)
如果你是网络管理员,想要让所有站点都能自主开关这个转译功能,可以通过添加一个**必须使用插件(MU Plugin)**来实现:
- 在服务器的
wp-content文件夹下,创建mu-plugins子文件夹(已存在则跳过); - 在
mu-plugins里新建transliterate-permalinks.php文件,粘贴以下代码:
<?php /* Plugin Name: Enable Transliteration for Multisite Description: Restores Cyrillic to Latin transliteration option for permalinks in WordPress Multisite Version: 1.0 */ // 处理实际的转译逻辑 add_filter('sanitize_title', 'sanitize_title_with_cyrillic_transliteration', 10, 3); function sanitize_title_with_cyrillic_transliteration($title, $raw_title, $context) { if ($context === 'save' && get_option('permalink_transliterate', true)) { // 西里尔文转拉丁文映射表 $cyrillic = array('а','б','в','г','д','ђ','е','ж','з','и','ј','к','л','љ','м','н','њ','о','п','р','с','т','ћ','у','ф','х','ц','ч','џ','ш','А','Б','В','Г','Д','Ђ','Е','Ж','З','И','Ј','К','Л','Љ','М','Н','Њ','О','П','Р','С','Т','Ћ','У','Ф','Х','Ц','Ч','Џ','Ш'); $latin = array('a','b','v','g','d','dj','e','zh','z','i','j','k','l','lj','m','n','nj','o','p','r','s','t','c','u','f','h','c','ch','dz','sh','A','B','V','G','D','Dj','E','Zh','Z','I','J','K','L','Lj','M','N','Nj','O','P','R','S','T','C','U','F','H','C','Ch','Dz','Sh'); $title = str_replace($cyrillic, $latin, $title); $title = remove_accents($title); } return $title; } // 在单个站点的「设置/常规」页面恢复转译选项 add_action('admin_init', 'add_transliteration_option_to_multisite'); function add_transliteration_option_to_multisite() { if (is_multisite() && current_user_can('manage_options')) { add_settings_field( 'permalink_transliterate', __('Transliterate Permalinks', 'default'), 'render_transliteration_setting_field', 'general', 'default', array('label_for' => 'permalink_transliterate') ); register_setting('general', 'permalink_transliterate', array( 'type' => 'boolean', 'default' => true, 'sanitize_callback' => 'rest_sanitize_boolean' )); } } function render_transliteration_setting_field() { $enabled = get_option('permalink_transliterate', true); echo '<input type="checkbox" id="permalink_transliterate" name="permalink_transliterate" value="1" ' . checked(1, $enabled, false) . ' />'; echo '<label for="permalink_transliterate">' . __('Convert Cyrillic characters to Latin in permalinks.', 'default') . '</label>'; }
- 保存文件后,所有站点的「设置/常规」页面底部就会恢复转译选项,站点管理员可自主开关,代码会自动处理转译逻辑。
方案二:仅针对单个站点开启转译
如果你只需要给第二个站点单独开启功能,不需要显示设置选项,可直接在该站点的主题functions.php文件末尾添加以下代码:
// 为当前站点实现西里尔文转拉丁文永久链接 add_filter('sanitize_title', 'custom_cyrillic_to_latin', 10, 3); function custom_cyrillic_to_latin($title, $raw_title, $context) { if ($context === 'save') { $cyrillic = array('а','б','в','г','д','ђ','е','ж','з','и','ј','к','л','љ','м','н','њ','о','п','р','с','т','ћ','у','ф','х','ц','ч','џ','ш'); $latin = array('a','b','v','g','d','dj','e','zh','z','i','j','k','l','lj','m','n','nj','o','p','r','s','t','c','u','f','h','c','ch','dz','sh'); $title = str_replace($cyrillic, $latin, $title); $title = remove_accents($title); } return $title; }
这段代码会自动将该站点的西里尔文标题转译为拉丁文永久链接,无需额外设置。
注意:如果后续更换主题,记得把这段代码复制到新主题的
functions.php里,或者改用MU插件方案更稳定。
内容的提问来源于stack exchange,提问作者Dejan Dozet
相关产品推荐
相关产品推荐

