Obsługa tłumaczenia slugów w Polylang Free
Artykuł z 21 kwietnia, 2026
Problem
Polylang Free nie obsługuje natywnie tłumaczenia slugów dla Custom Post Types. Oznacza to, że WordPress domyślnie używa klucza CPT jako sluga we wszystkich wersjach językowych, zamiast odpowiedniego sługa dla każdego języka.
Rozwiązanie
Zamiast polegać na mechanizmach Polylang, można zastosować dwa uzupełniające się podejścia:
- Filtr post_type_link – przechwytuje generowanie URL-i i podmienia domyślny slug na właściwy dla danego języka. Dzięki temu wszystkie linki generowane przez WordPress (menu, karty postów, sitemapy) zawierają poprawny, przetłumaczony slug.
function fix_permalink( $post_link, $post ) {
if ( 'sample-slug' === $post->post_type && 'publish' === $post->post_status ) {
if ( function_exists( 'pll_get_post_language' ) ) {
$lang = pll_get_post_language( $post->ID );
if ( 'pl' === $lang ) {
$post_link = str_replace( '/sample-slug/', '/custom-slug-pl/', $post_link );
}
if ( 'en' === $lang ) {
$post_link = str_replace( '/sample-slug/', '/custom-slug-en/', $post_link );
}
}
}
return $post_link;
}
add_filter( 'post_type_link', 'fix_permalink', 10, 2 );
- Reguły add_rewrite_rule – rejestrują przetłumaczone slugi w tablicy reguł WordPress, dzięki czemu serwer rozumie przychodzące URL-e i potrafi je obsłużyć bez błędu 404. Bez tych reguł linki wyglądałyby poprawnie, ale strony nie ładowałyby się.
add_action( 'init', function () {
// PL
add_rewrite_rule(
'^custom-slug-pl/([^/]*)/?$',
'index.php?sample-slug=$matches[1]&lang=pl',
'top'
);
// EN
add_rewrite_rule(
'^en/custom-slug-en/([^/]*)/?$',
'index.php?sample-slug=$matches[1]&lang=en',
'top'
);
}, 20 );
Dodawanie nowego języka
Przy dodaniu kolejnego języka należy: