wpml — правка юрл в языковом свитчере
14 марта, 2021WPML — это очень полезная и очень сложная машина, и в силу своей сложности на разных этапах создания сайта можно столкнуться с разными неожиданными багами.
Надо сказать, что команда плагина ведет очень большую работу по улучшению архитектуры плагина, но … Он реально невероятно сложен. Он затрагивает практически любую нативную операцию самого WordPressа, а помимо него это может делать любой из имеющихся на сайте плагинов, и конечно предусмотреть все возможные способы взаимодействия не представляется возможным
Здесь пойдет речь по ситуации когда вы настраиваете пермалинки на на какой-нибудь пост-тайп при помощи функции add_rewrite_rule. Мы столкнулись с тем, что в общем и целом все в порядке, но переключатель языков во всех случаях указывает на текущий адрес единичной записи.
То есть если у вас 2 языка ( английский и немецкий ) на сайте, и структура пермалинков выставлена на добавление языкового домена в начало url, то в языковом свитчере вы должны иметь два url : http://siteurl/prefix/post_title
и http://siteurl/de/prefix/post_title
. А имеете оба равными текущей локали, то есть или 2 английских или 2 немецких.
Мы не искали глубинные причины такого поведения, но мы нашли быстрое решение, оно быстрое и оно работает :
add_filter( 'wpml_current_ls_language_url_endpoint', function( $url, $post_lang, $data, $current_endpoint ) {
if ( $post_lang == 'de' && $data['code'] == 'en' ) {
$url = str_replace( 'de/', '', $url );
}
else if ( $post_lang == 'en' && $data['code'] == 'de' ) {
$url = str_replace( '/custom_prefix', '/de/custom_prefix', $url );
}
return $url;
}, 10, 4 );
Как видно из сниппета, решение базируется на фильтре 'wpml_current_ls_language_url_endpoint'
, он задействован только на отрисовке свитчера, так что вы спокойно можете здесь редактировать url, не боясь, что зацепите еще какие-нибудь пермалинки на сайте.