Obsługa tłumaczenia slugów w Polylang Free

gabriela

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:

  1. 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 );
  1. 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:

  • Dodać nowy blok if ( 'XX’ === $lang ) w funkcji fix_permalink, gdzie XX to kod języka ustawiony w Polylang (np. de, fr)
  • Dodać odpowiednią regułę add_rewrite_rule dla nowego sluga
  • Odświeżyć permalinki w panelu admina: Ustawienia → Bezpośrednie odnośniki → Zapisz zmiany