wpml — правка юрл в языковом свитчере

14 марта, 2021

WPML — это очень полезная и очень сложная машина, и в силу своей сложности на разных этапах создания сайта можно столкнуться с разными неожиданными багами.

Надо сказать, что команда плагина ведет очень большую работу по улучшению архитектуры плагина, но … Он реально невероятно сложен. Он затрагивает практически любую нативную операцию самого 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, не боясь, что зацепите еще какие-нибудь пермалинки на сайте.

Categorised in: html, wordpress