自定义Rewrite规则致WordPress Elementor编辑异常(关联Polylang)
问题:自定义Rewrite规则致Elementor编辑模式崩溃(关联Polylang)
环境
- WordPress 6.7.2
- Elementor Pro 3.28.2
- Polylang 3.6.7
核心问题
自定义两条Rewrite规则,实现/fr/xxx或/en/xxx这类链接加载数据库中的汽车品牌信息,前台功能完全正常,但导致WordPress后台点击「用Elementor编辑」时页面无法加载,必须进入安全模式。禁用这两条规则后,Elementor编辑恢复正常。
问题规则如下:
'^fr/(?!garage|cars|elementor|car-page|compare-your-cars)([A-Za-z0-9-]+)/?$' => 'index.php?pagename=car-make-fr&make=$matches[1]', '^en/(?!garage|cars|elementor|car-page|compare-your-cars)([A-Za-z0-9-]+)/?$' => 'index.php?pagename=car-make&make=$matches[1]',
排查过程
- 尝试通过
is_edit_mode()及自定义函数FF_bElementor_Edition_mode_PHP_v2判断编辑模式,仅在非编辑模式启用规则,未解决问题。 - 发现问题与Polylang强关联,测试流程:
- 初始状态:页面编辑报错,需安全模式
- 禁用Polylang:编辑恢复正常
- 启用Polylang:编辑正常,但自定义规则失效
- 进入「设置→固定链接」保存(刷新Rewrite规则):编辑再次报错,自定义规则恢复生效
完整代码
Rewrite规则函数
function FF_rewrite_url_rules($rules) { $new_rules = array( // Car-Series // Version FR : fr/garage/{make}/{model} '^fr/garage/([^/]+)/([^/]+)/?$' => 'index.php?pagename=car-series-fr&make=$matches[1]&model=$matches[2]', // fr/garage/X/Y ==> fr/garage/bmw/3-series // Page "Car Series" / index.php?pagename=car-series&make=bmw&model=3-series // Version EN : en/garage/{make}/{model} '^en/garage/([^/]+)/([^/]+)/?$' => 'index.php?pagename=car-series&make=$matches[1]&model=$matches[2]', // Car-Versions // Version FR : fr/garage/{make}/{model}/{series} '^fr/garage/([^/]+)/([^/]+)/([^/]+)/?$' => 'index.php?pagename=car-versions-fr&make=$matches[1]&model=$matches[2]&series=$matches[3]', // fr/garage/X/Y/Z ==> fr/garage/bmw/3-series/sport-line // Page "Car Versions" / index.php?pagename=car-versions&make=$matches[1]&model=$matches[2]&series=$matches[3] / Encore utilisé ?? // Version EN : en/garage/{make}/{model}/{series} '^en/garage/([^/]+)/([^/]+)/([^/]+)/?$' => 'index.php?pagename=car-versions&make=$matches[1]&model=$matches[2]&series=$matches[3]', // Car-page // Version FR : fr/cars/{ID_Car} '^fr/cars/([0-9]+)/?$' => 'index.php?pagename=car-page-fr&ID_Car=$matches[1]', // fr/cars/XXX ==> fr/cars/123 // Page "Car Page" / index.php?pagename=car-page&ID_Car=123 // Version EN : en/cars/{ID_Car} '^en/cars/([0-9]+)/?$' => 'index.php?pagename=car-page&ID_Car=$matches[1]', // compare-your-cars v1 '^fr/compare-cars-old/?$' => 'index.php?pagename=compare-your-cars-fr', '^en/compare-cars-old/?$' => 'index.php?pagename=compare-your-cars', // compare-your-cars v2 '^fr/compare-cars/?$' => 'index.php?pagename=compare-your-cars-v2-fr', '^en/compare-cars/?$' => 'index.php?pagename=compare-your-cars-v2', // Car-make // Les règles "Car-make" posent problème en mode édition, donc on ne les ajoute que si on n'est PAS en mode édition. // On exclut ici : // Les pages qui ne sont PAS des makes : 'garage', 'cars' // Les pages d'édition Wordpress/Elementor : 'elementor', 'car-page', 'compare-your-cars' (et éventuellement d'autres slugs réservés) // Version FR : fr/{make} // '^fr/(?!garage|cars)([A-Za-z0-9-_]+)/?$' => 'index.php?pagename=car-make-fr&make=$matches[1]', '^fr/(?!garage|cars|elementor|car-page|compare-your-cars)([A-Za-z0-9-_]+)/?$' => 'index.php?pagename=car-make-fr&make=$matches[1]', // Version EN : en/{make} // '^en/(?!garage|cars)([A-Za-z0-9-_]+)/?$' => 'index.php?pagename=car-make&make=$matches[1]', '^en/(?!garage|cars|elementor|car-page|compare-your-cars)([A-Za-z0-9-_]+)/?$' => 'index.php?pagename=car-make&make=$matches[1]', ); // Les nouvelles règles sont placées avant les règles existantes // custom_log('FF_rewrite_url_rules is returning new rules'); custom_log('FF_rewrite_url_rules / Returning rules merged with personal rules'); return array_merge($new_rules, $rules); }
添加Rewrite过滤器的代码
// Ajouter le filtre pour générer les règles de réécriture add_filter('generate_rewrite_rules', function($wp_rewrite) { // if(!FF_bElementor_Edition_mode_PHP_v2()){ // N'appliquer les règles personnalisées que si l'éditeur Elementor n'est PAS actif if (\Elementor\Plugin::$instance->editor->is_edit_mode() ) { custom_log('generate_rewrite_rules filter / Elementor IS in Edition mode / Not changing rules'); } elseif (\Elementor\Plugin::$instance->preview->is_preview_mode() ) { custom_log('generate_rewrite_rules filter / Elementor IS in Preview mode / Not changing rules'); } else { custom_log('generate_rewrite_rules filter / Elementor is NOT in Edition or Preview mode / Merging rules'); $wp_rewrite->rules = FF_rewrite_url_rules($wp_rewrite->rules); } });
请求解决
目前该问题已困扰多时,希望能找到方案,既保留前台自定义链接的功能,又能正常使用Elementor编辑页面。
内容的提问来源于stack exchange,提问作者Franck FELIX
相关产品推荐
相关产品推荐

