WordPress: zmiana struktury linków dla postów z wybranej kategorii

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 UstawieniaBezpoś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/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!

Pani Marta
Jestem Marta. Pani Marta. Na moim blogu dzielę się prostymi sposobami na bezwtyczkowe ulepszenie swojej strony WordPress. Jeśli brakuje Ci czegoś w tym wpisie lub chcesz, abym poruszyła temat, na którym Ci zależy, daj znać w komentarzu!

Dodaj komentarz

*

*

*

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *