Nie znam ani jednego bloga na WordPressie po polsku, w którym ten problem byłby rozwiązany. Nawet blogi specjalistów od WordPressa, w których wszystko jest dopieszczone, mają ten defekt. Chodzi o niewinne słówko page, które pojawia się w URL-u przed numerem strony, gdy zaczynamy przeglądać wpisy wstecz i ładowana jest strona z kolejną porcją WordPressowych wpisów. No właśnie, page, a nie jak być powinno: strona. Zobacz ilustrację niżej.
Nie wynika to bynajmniej z małej wagi zagadnienia czy zaniedbania blogerów. Pytanie o tę kwestię zadał mi już 2 lata temu w Pomysłach na tutorial autor innego bloga o WordPressie. Dziś jego bloga już nawet nie ma, a problem lokalizacji page w WordPressie pozostał bez odpowiedzi. Tym większa była moja radość, gdy poznałam rozwiązanie tego problemu.
Page czy strona – ilustracja problemu
Wpaść na kawę i poznać rozwiązanie
3 tygodnie temu był WordUp we Wrocławiu. Sprawy osobiste nie pozwoliły mi być na wszystkich prezentacjach ani na tzw. „after party”. Miałam do dyspozycji tylko 2 godziny i zastanawiałam się, czy w ogóle warto jechać na wrocławski rynek. Napiję się przynajmniej kawy w miłym towarzystwie, zdecydowałam. Tym bardziej że moja WordPressowa znajoma, Ola, przyjechała tam aż z Warszawy.
Abrakadabra, hokus pokus, wyczaruję ci odpowiedź
Kawę zrobiłam sobie w przerwie miedzy drugą a trzecią prezentacją, co zresztą zostało uwiecznione przez Wojtka na fotce. A potem już były same czary. WordPressowy magik, czyli Krzysiek Dróżdż znany również jako WPmagus, rozpoczął prezentację pod równie magicznym tytułem. Odczarowujemy WP_Rewrite – dokładnie tak brzmiał temat prelekcji, w czasie której powiedziałam na głos „Całe życie szukałam tego rozwiązania!”.
Jak zamienić page na strona w WordPressie
Page w stronicowaniu WordPressa po polsku – wersja prosta
Krok 1: Do pliku functions.php swojego motywu dodaj poniższy kod:
/* Zamiana page na strona w URL-u */ function custom_pagination_base() { global $wp_rewrite; $wp_rewrite->pagination_base = 'strona'; } add_action( 'init', 'custom_pagination_base' );
Krok 2: W panelu admina w WordPressie wejdź do Ustawienia -> Bezpośrednie Odnośniki i wciśnij zapisz.
Krok drugi jest niezbędny, gdyż reguły rewrite są cache’owane. Podnowne zapisanie (lub zmiana) bezpośrednich odnośników wymusza odświeżenie cache’a rewrite’ów.
Uwaga:
Odświeżenie reguł rewrite możliwe jest również programowo. Służy do tego celu funkcja Rewrite API/flush rules. Jednak przy jej wykorzystaniu trzeba zachować ostrożność:
- jest kosztowna wydajnościowo (patrz WordPress Codex)
- może wejść w konflikt w innymi pluginami, które również zmieniają rewrite rules
Dziękuję za zwrócenie uwagi na ten fakt komentatorom wpisu.
Page w stronicowaniu WordPressa po polsku – wersja z lokalizacją
Jeszcze bardziej elegancko będzie wykonać to w oparciu o pliki po i mo.
/* Zamiana page na strona w URL-u - wersja z tzw. lokalizacją, czyli tłumaczeniem w oparciu o pliki po i mo */ function custom_pagination_base() { global $wp_rewrite; $wp_rewrite->pagination_base = __("page", "nazwa_motywu"); } add_action( 'init', 'custom_pagination_base' );
Dlaczego wersja z lokalizacją jest pożądana:
- Zgodnie z dobrymi praktykami pisania kodu, należy unikać hardkodowania polskich fraz w kodach źródłowych.
- W przypadku witryn wielojęzykowych musimy zadbać o odpowiednik słówka page dla każdego z języków. Pliki po nam w tym pomogą.
Inne slugi URL, które wymagają tłumaczenia
W WordPressie znajdziemy jeszcze kilka innych slugów w URL-ach, które przydałoby się zaprezentować w języku witryny. Przykłady:
- author (wpisy wg autora) np. webfaces.pl/blog/autor/aga/ zamiast webfaces.pl/blog/author/aga/
- category (wpisy wg categorii) np. webfaces.pl/blog/kategoria/wordpress/ zamiast webfaces.pl/blog/category/wordpress/
- slug w wynikach wyszukiwania
Dlatego dobrym pomysłem będzie zebranie ich w jedną funkcję:
function localize_slugs() { global $wp_rewrite; $wp_rewrite->author_base = __("author", "nazwa_motywu"); $wp_rewrite->category_base = __("category", "nazwa_motywu"); $wp_rewrite->search_base = __("search", "nazwa_motywu"); $wp_rewrite->pagination_base = __("page", "nazwa_motywu"); } add_action('init', 'localize_slugs');
Po dodaniu tej funkcji do pliku functions.php motywu, nie zapomnij odświeżyć cache’a rewrite’ów (Ponowny zapis w Ustawienia ->Bezpośrednie odnośniki).
Więcej możliwości na http://codex.wordpress.org/Class_Reference/WP_Rewrite
Jak w WordPressie przetłumaczyć slug category – prosty sposób
Osoby, które prowadzą blog tylko w polskim języku, a nie chcą ingerować w kod motywu, slug dla kategorii mogą zmienić na polski odpowiednik korzystając z ustawień WordPressa.
W panelu WordPressa wchodzimy w Ustawienia -> Bezpośrednie odnośniki i wypełniamy wg uznania pole Alias kategorii.
Jak w WordPressie przetłumaczyć slug we własnym typie wpisu (ang. custom post type)?
Programiści wykorzystujący własne typy wpisów w WordPressie też mają wpływ na to, jaką postać przyjmie ostatecznie slug dla wpisów opartych o custom post type. W tym celu wykorzystujemy parametr rewrite -> slug przekazywany do funkcji register_post_type.
Oto fragment kodu, za pomocą którego udało mi się w URL-u uzyskać słówko lekarze mimo, że custom post type nazwałam doctors.
Warto bywać na WordUpach
Jak widać, spotkania w kręgach WordPressowców mogą być bardzo owocne. W wiedzę i nowe znajomości. Dlatego z niecierpliwością czekam na nadchodzący WordCamp, który będzie mieć miejsce we Wrocławiu. Przygotowania już trwają.
A jak wygląda sprawa w momencie aktualizacji wordpressa?
Czy pliki językowe nowej wersji nie nadpisują starej?
Dopiero od niedawna wgryzam się w zmiany w motywach wp.
Aktualizacja WordPressa nie dotyka plików motywu, więc o zmiany w motywach można być spokojnym.
Co innego, jeśli robisz aktualizację gotowego motywu – wówczas swoje zmiany stracisz. Dlatego zmiany w motywie dobrze robić z wykorzystaniem tzw. motywów potomnych.
W przypadku motywów potomnych sprawa chyba trochę się komplikuje, w przypadku motywu potomnego na bazie Twenty Twelve pojawiła się u mnie konieczność dodania opcji „My Child Theme textdomain”.
A teraz zastanawiam się czy modyfikując lub tworząc pliki w motywie potomnym jako „nazwa motywu / textdomain” używać nazwy potywu potomnego czy motywu podstawowego.
Tomek, nie wiem, czy Cię dobrze zrozumiałam. Ale:
a. ta sama procedura obowiązuje dla motywów potomnych, po prostu kod wklejamy do functions.php motywu potomnego
b. jeśli chcemy frazy mieć poddane lokalizacji, to w motywie potomnym odwołujemy się do ciągu zdefiowanego wcześniej w load_child_theme_textdomain
Sprawdziłam, wszystko gra.
To ja tylko coś dodam 🙂 Lepiej nie używać $wp_rewrite->flush_rules();, bo będzie się to gryzło z praktycznie każdą wtyczką, która w locie operuje na wp_rewrite. Przez kilka tygodni szukałem problemu, przez który nie działała mi w Majsterkowie wtyczka Polylang (po aktywacji wszędzie dostawałem 404).
Problemem była właśnie ta nieszczęsna linijka. Wystarczyło ją wyrzucić i w ustawieniach WP po prostu kliknąć „zapisz” w ustawieniach bezpośrednich odnośników, żeby załapał zmiany.
Pozdrawiam!
Łukasz, dzięki za tę uwagę. Zmodyfikowałam wpis uwzględniając ten fakt. Wygląda na to, że nie Ty jeden miałeś z tego powodu problemy w kontekście wtyczki polylang:
http://premium.wpmudev.org/forums/topic/flashing-rewrite-rules-causes-issues-with-3rd-party-plugin
To ja tylko dorzucę uwagę, że jeśli modyfikację wp_rewrite’ów podpinasz pod hooka init, to nie chcesz tam za każdym razem tych reguł flushować. To flushowanie będzie Ci przy każdej odsłonie strony usuwało z bazy wszystkie reguły, generowało je od nowa i zapisywało ponownie do bazy). Sflushować wystarczy tylko raz, po zmianie struktury.
Krzysiek, dziękuję za to ważne wyjaśnienie. Właściwie o tym wszystkim (wpływie na wydajność) mówiłeś w prezentacji i nawet w swoim kodzie wykorzystałeś innego hooka. Co więcej, sam Codex wyraźnie zabrania użycie do tego celu hooka init, co doczytałam dopiero pod wpływem Twojego komentarza. Dodałam odpowiedni komentarz do wpisu zalecając ręczne odświeżenie cache’a rewrite’ów, myślę, że tak będzie najbezpieczniej dla czytelników trafiających na ten wpis.
Tak, dla większości osób to jest rozwiązanie najprostsze i najwygodniejsze. Szczególnie, że dodają tę regułę raczej już w trakcie działania strony (więc podpinanie się pod aktywację motywu, czy coś w tym stylu, wcale nie byłoby tu wygodne).
Dzięki za to rozwiązanie. Przydałaby się jeszcze jakaś reguła, która przekierowuje stare adresy na nowe.
Tak naprawdę to wcale nie jest to aż takie niezbędne w tym przypadku. Strony archiwum i tak nie są (nie powinny) być raczej indeksowane przez wyszukiwarki, a i mało kto zapisuje linki do tych stron, bo ich treść się zmienia.
Jeśli natomiast odnotowujesz sporo bezpośrednich wejść na te strony, to oczywiście jak najbardziej powinieneś dodać takie przekierowanie.
Masz rację. Właśnie sobie uświadomiłem, że sam mam wyłączone indeksowanie tych stron 🙂
Ekhem… 🙂
No tak… Tak rzadko tam piszesz, że już zapomniałam o istnieniu Twojego bloga. Ale zwracam honor. Sprawdziłam nawet przez Wayback Machine i wychodzi, że wiedziałeś już jak to zrobić na początku 2011!
Cieszę się, że problem z PAGE został rozwiązany. Sam muszę poprawić swój blog na podstawie umieszczonych informacji. Pozdrawiam.
Świetna sprawa! Muszę również samemu się tym zająć 🙂 Ciekaw jestem czy wpłynie to w jakiś sposób na pozycje strony w wyszukiwarce, najwyższy czas się zaznajomić z funkcjonowaniem kategorii wpisów, efekty mogą być ciekawe i warte poświęcenia czasu. Zapisuję do notatnika i przy wolnej chwili zajmę się tym u mnie, dziękuje !
Super rzecz, zastanawiałem się swojego czasu jak to zmienić i nie wiedziałem. Teraz na pewno wprowadzę to u siebie. Pytanie moje brzmi, a jak ta zmiana na wpływ na pozycjonowanie? Czy nie lepiej zostać przy /page/ gdy google już jest przyzwyczajony do takiej budowy linków?
Ibuu, myślę, że Krzysiek udzielił już odpowiedzi na to pytanie:
Cześć!
Sam od zawsze uznawałem że jeśli piszę stronę po polsku, to w miarę możliwości wszystkie elementy tej strony powinny być właśnie w naszym ojczystym języku. Zaciekawił mnie ten wpis, bo sam niedawno zajmowałem się zamianą oryginalnych linków na polskie na swoim blogu. Jeśli na serwerze na którym stoi blog mamy Apache, to wydaje mi się że najlepszym wyjściem jest skorzystanie z dobrodziejstw mod_rewrite (plik .htaccess). Polecam też WordPressową wtyczkę, która może w tym pomóc – WP htaccess Control. Wystarczy wpisać w odpowiednie pole słowo będące polskim zamiennikiem page, author etc.
Z tym mod_rewrite to nie do końca tak. To jest tylko połowa drogi i to ta łatwiejsza. Za pomocą mod_rewrite sprawisz jedynie, żeby dane linki były przez WordPressa rozpoznawane. Natomiast nijak nie wpłyniesz na to, jakie linki WordPress będzie generował i umieszczał na stronie… (a pamiętaj, że chodzi nie tylko o linki generowane przez WordPressa, ale też wszelkie pluginy, itd.)
Faktycznie proste rozwiązanie. Osobiście sam nie zwróciłem uwagi na to, że ładuje się tam słowo 'page’ a nie 'strona’ 🙂 Dzięki za rozwiązanie.
Łukasz, zwykle dużo ludzi nie zwraca uwagi jak jest zbudowany URL. Mimo wszystko witryna wygląda bardziej „pro”, gdy zadbano o takie detale i myślę, że jak już się wie, jak to robić, to dobrze jest mieć gotowy kawałek kodu pod ręką do wstawienia.
Mam pytanie. Mój blog ma dwa miesiące i pojawiły się problemy ze zdjęciami tzn.wszystkie się zmniejszyły, trochę mnie to martwi.Pojedyncze zaczęłam powiększać, ale nie wiem czy to się nie powtórzy. Proszę o pomoc.
jantar92, Ty masz blog na wordpress.com, musisz zadać pytania u nich na forum supportowym.
Próbowałam zmienić kategorie według:
$wp_rewrite->category_base = __(„category”, THEME_CODE_NAME );
Dla stron(pagination_base) działa, dla kategorii nie.
Natomiast:
$wp_rewrite->extra_permastructs[’category’][’struct’] = (__(„category”, THEME_CODE_NAME ).’/%category%’);
działa.
Czy mógłby ktoś nakreślić 2 sposób z programem Poedit? Tekst page z tłumaczeniem mam dodać ręcznie? Bo niestety 1 sposób z kodem w functions.php na jednym z szablonów nie działa.
Jeśli wam oba sposoby nie działają to pobierzcie plugin Custom Base Terms do wordpressa.
Dzięki niemu możemy przetłumaczyć page i author na polski:
https://wordpress.org/plugins/custom-base-terms/
Mam pytanie. Wyświetla się adres strony: nazwastrony.pl/#section-oferta. Czy ten sam kod można zastosować do zmiany „section” na „sekcja”?
@Takana,
O ile dobrze rozumiem, to korzystasz na swojej stronie z jakiegoś motywu typu OnePage lub innego przewijającego, bazującego na JSie.
Rozwiązanie opisane powyżej nie ma nic wspólnego z Twoim problemem, bo u Ciebie nie ma w ogóle mowy o paginacji – korzystasz z anhorów, które autor motywu nazwał tak a nie inaczej (zresztą zrobił to akurat dość głupio).
Co możesz zrobić?
Możesz spróbować stworzyć motyw pochodny, przezwać w identyfikatorach string „section” na „sekcja” (albo wręcz go usunąć) i sprawdzić, czy nie trzeba wykonać modyfikacji JSa.
PS. Tak, to jest trochę takie wróżenie z fusów, ale trudno powiedzieć coś sensowniejszego, nie wiedząc o jaką chodzi stronę, ani z jakiego motywu i jakich wtyczek korzystasz.
Cześć Aga.
U mnie na stronie w „Ustawienia bezpośrednie odnośników” mam ustawione „/%postname%/”, ale nie wied dlaczego przy tworzeniu stron(pages) z kategoriami, odnośniki do tych stron poprzedzone są kategorią np. http://www.domena.pl/kategoria-1/przykladowa-strona
Można jakoś pozbyć się tego zapisu kategoria-1 w linkach?
Przepraszam, ale w poprzednim komentarzu namieszałem z pytaniem, powinno być tak:
Cześć Aga.
U mnie na stronie w „Ustawienia bezpośrednie odnośników” mam ustawione „/%postname%/”, ale nie wiem dlaczego przy tworzeniu stron(pages) potomków innych stron, odnośniki do tych podstron poprzedzone są linkiem rodzica np. http://www.domena.pl/strona-rodzic/przykladowa-strona
Hej Łukasz, tak właśnie działa WP. Spróbuj ten plugin
https://wordpress.org/support/view/plugin-reviews/custom-permalinks
Dzięki Aga, przetestuję. Dziwi mnie tylko że WP nie ma tego wbudowanego. Dam znać czy rozwiązało mój problem.
Spróbuj ten plugin
w komentarzach znalazłam:
„It just worked like it promissed. My permalinks are set to „%postname%.html” and now I could change my pages permalinks from „/parent/child/” to „/child.html” (and that was all I needed).”
więc to powinno być to, czego szukasz, ale ja nie testowałam
Jestem ciekawy czy da się modyfikować stronę „category” tak aby wyświetlała fragmenty postów we własnych kolumnach. U mnie w motywie jest jedna a ja chciałbym przetestować wygląd z dwiema lub trzema kolumnami.
Pozdrawiam
W jaki sposób mogę zmienić link przy wyszukiwaniu ?
Próbuję wykorzystać to w ten sposób:
function wyszukiwarka() {
if ( is_search() && ! empty( $_GET[’s’] ) ) {
wp_redirect( home_url( „/szukaj/” ) . urlencode( get_query_var( 's’ ) ) );
exit();
}
}
add_action( 'template_redirect’, 'wyszukiwarka’ );
ale niestety nie działa.
Jedyną opcją jaką mogę zrobić to wstawienie zamiast „szukaj” to „search” i wtedy działa.
Dodatkowo próbowałem i też nic:
$wp_rewrite->search_base = __(„szukaj”, „nazwamotywu”);
$wp_rewrite->pagination_base = __(„strona”, „nazwamotywu”);
$wp_rewrite->search_structure = __(„wyszukaj”, „nazwamotywu”);
MorganF, jaki link chcesz zmienić i na co?