W WordPressie można ustawić strukturę linków dla postów, np. domena.pl/nazwa-posta/
, domena.pl/kategoria/nazwa-posta/
lub domena.pl/?p=123
. Robi się to w Ustawienia
→ Bezpośrednie odnośniki
. Nie ma jednak możliwości zastosowania zmiany np. tylko do wybranej kategorii – struktura linków zostanie zmieniona dla wszystkich postów. W dzisiejszym wpisie pokażę, jak to objeść. Przekierujemy posty należące do kategorii „Wiadomości” z domena.pl/nazwa-posta/
do domena.pl/moja-kategoria/nazwa-posta/
.
Zmiana linków na front-endzie
Pierwszy krok to zmiana linków na front-endzie. Aby to zrobić, dodaj poniższy kod do pliku functions.php
w motywie potomnym:
add_filter( 'post_link', function( $permalink, $post ) {
if ( has_category( 'Wiadomości', $post->ID ) && ! empty( $post->post_name ) ) {
$permalink = trailingslashit( home_url('/moja-kategoria/'. $post->post_name .'/' ) );
}
return $permalink;
}, 10, 2 );
Gdy będziesz teraz przeglądać swojego bloga, zauważysz, że posty z kategorii „Wiadomości” mają nowe linki. Niestety kliknięcie w nie spowoduje błąd 404, ponieważ WordPress nie potrafi znaleźć w bazie posta z danym linkiem. Trzeba więc mu przetłumaczyć link na formę przez niego zrozumiałą, czyli domena.pl/index.php?name=nazwa-posta
.
Tłumaczenie linka
Poniższy kod pomoże WordPressowi połapać się w linkach. Dodaj go pod poprzednim kodem.
add_action( 'generate_rewrite_rules', function( $wp_rewrite ) {
$new_rules['moja-kategoria/([^/]+)/?$'] = 'index.php?name=$matches[1]';
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
} );
Teraz nowy link działa poprawnie.
Przekierowanie starego linka na nowy
W tej chwili dany post można wywołać adresem domena.pl/moja-kategoria/nazwa-posta/
i domena.pl/nazwa-posta/
. Przekierujemy zatem ten drugi na ten pierwszy, żeby nie dublowały nam się adresy:
add_action( 'template_redirect', function() {
if ( is_single() ) {
$post = get_post();
global $wp;
// Pobierz aktualny adres URL
$url = home_url( $wp->request );
// Jeśli post jest z kategorii "Wiadomości" i adres nie zawiera ciągu /moja-kategoria/, przekieruj post
if ( has_category( 'Wiadomości', $post->ID ) && ! empty( $post->post_name ) && strpos( $url, '/moja-kategoria/' ) === false ) {
$permalink = trailingslashit( home_url('/moja-kategoria/'. $post->post_name . '/' ) );
wp_redirect( $permalink, 301 );
die;
}
}
} );
Tym sposobem posty z kategorii „Wiadomości” zyskały nową strukturę linków.
Jeśli masz pytania, daj znać w komentarzu!