Konfiguracja
Langeto ma jeden ekran ustawień i celowo mały zestaw opcji. Wszystko jest w WooCommerce > Langeto Tabs i zapisuje się w jednej opcji tabby_settings. Uprawnienie do zapisu to manage_woocommerce, więc menedżer sklepu edytuje zakładki bez pełnego konta administratora.
Włącz Langeto
Dział zatytułowany „Włącz Langeto”Główny przełącznik w sekcji General (enabled), domyślnie włączony. Wyłącz go, aby ukryć wszystkie zakładki na froncie naraz, bez ich kasowania: zakładki zostają zapisane i wracają po ponownym włączeniu. Przy wyłączonym Langeto nie dokłada żadnej zakładki i nie ładuje swojego arkusza stylów.
Shortcode i bloki w zakładkach
Dział zatytułowany „Shortcode i bloki w zakładkach”rich_content, domyślnie wyłączone. Po zaznaczeniu treść zakładki przechodzi przed wypisaniem przez the_content, a to właśnie sprawia, że shortcode albo znacznik bloku w zakładce faktycznie się wykonuje.
Przy wyłączonym treść zakładki jest sanityzowana przez wp_kses_post i dzielona na akapity przez wpautop, więc shortcode wypisuje się jako dosłowny tekst, który wpisałeś. Przy włączonym uruchamia się the_content: shortcode’y się wykonują, bloki renderują, a do treści zakładki stosują się wszystkie filtry, które motyw i inne wtyczki podpięły pod treść wpisu.
Domyślnie jest wyłączone, bo the_content na zapisanym HTML to szersza powierzchnia niż przepuszczenie przez bezpieczny podzbiór, a nie dlatego, że treść zakładek jest niezaufana: pisze ją tylko użytkownik z uprawnieniem manage_woocommerce i dotyczy to wyłącznie zakładek, które sam napisałeś. Włącz, gdy potrzebujesz shortcode’u w zakładce; poza tym zostaw wyłączone.
To pole jest wartością domyślną filtra tabby/use_rich_tab_content, więc dodatek może odpowiedzieć inaczej dla konkretnej zakładki albo produktu. Uwaga: Langeto PRO przejmuje tę decyzję w całości. Przy aktywnym PRO odpowiada jego własny przełącznik, więc zaznaczone pole tutaj nic nie zmieni, gdy tam jest wyłączone, i odwrotnie. Z zainstalowanym PRO ustawiaj to tam.
Zakładki
Dział zatytułowany „Zakładki”Sekcja Tabs to powtarzalna lista. Każdy wiersz to jedna zakładka wielokrotnego użytku i ma trzy pola:
- Tytuł zakładki, etykieta na pasku zakładek produktu oraz nagłówek wypisywany nad treścią. Sanityzowany przez
sanitize_text_fieldprzy zapisie. Wiersz z pustym tytułem jest przy zapisie odrzucany, więc pozostawienie wiersza pustego to sposób na jego usunięcie. - Enabled, przełącznik pojedynczej zakładki. Odznaczone wiersze zapisują się, ale nie renderują na froncie, więc można odstawić zakładkę bez utraty treści.
- Treść zakładki, body, sanityzowane przy zapisie przez
wp_kses_post(zobacz Dozwolony HTML).
Zakładki renderują się na każdej karcie produktu, w kolejności z tego ekranu, po natywnych zakładkach WooCommerce.
Slugi zakładek
Dział zatytułowany „Slugi zakładek”Przy zapisie każda zakładka dostaje stabilny slug wyprowadzony z tytułu przez sanitize_key. Gdy dwie zakładki dałyby ten sam slug, Langeto dokleja _1, _2 i tak dalej, żeby każdy pozostał unikalny. Slug jest wewnętrznym kluczem zakładki, używanym w identyfikatorze panelu (tab-tabby_<slug>), i nie edytuje się go osobno.
Dozwolony HTML w treści zakładki
Dział zatytułowany „Dozwolony HTML w treści zakładki”Treść zakładki jest zawsze sanityzowana przez wp_kses_post przy zapisie, niezależnie od ustawienia treści rozszerzonej. Przy renderze ta sama operacja powtarza się, chyba że Shortcode i bloki w zakładkach jest włączone, wtedy jej miejsce zajmuje the_content. Bezpieczny podzbiór to ten, który WordPress dopuszcza w treści wpisu:
- Linki, listy numerowane i punktowane
- Nagłówki, akapity, łamania wiersza
- Pogrubienie, kursywa i inne wyróżnienia inline
- Obrazy
- Cytaty blokowe i podobne elementy
Skrypty, ramki iframe i inny niebezpieczny kod są usuwane przy zapisie, więc nigdy nie trafiają do bazy. Przy renderze z wyłączoną treścią rozszerzoną zapisana treść jest sanityzowana jeszcze raz i przepuszczana przez wpautop, więc łamania wiersza stają się akapitami, tak jak we wpisie.
Co jest ustalone z założenia
Dział zatytułowany „Co jest ustalone z założenia”Kilka zachowań celowo nie jest ustawieniami:
- Zakładki zawsze renderują się po natywnych zakładkach WooCommerce (filtr działa na priorytecie
98, a każda zakładka jest dokładana od priorytetu100w górę). Nie ma opcji przed/po. - Zakładki zawsze pojawiają się na każdym produkcie. W darmowej wtyczce nie ma edytora zakładek per produkt ani ukrywania per produkt.
- Zakładka z tytułem, ale bez treści, w ogóle nie jest rejestrowana: nie trafia na pasek zakładek, więc klient nie kliknie w nagłówek, pod którym nic nie ma. Panel powtarza ten sam test na sformatowanym HTML, więc treść, która po sanityzacji schodzi do zera, też odpada.
Przechowywanie i sprzątanie
Dział zatytułowany „Przechowywanie i sprzątanie”Cała konfiguracja żyje w jednej opcji tabby_settings (główny przełącznik, przełącznik treści rozszerzonej i tablica global_tabs). Langeto nie tworzy własnych tabel i nie zapisuje post meta. Druga opcja, tabby_db_version, trzyma wersję schematu, żeby przyszłe aktualizacje mogły bezpiecznie migrować dane.
Usunięcie wtyczki z ekranu Wtyczki uruchamia procedurę deinstalacji, która kasuje tabby_settings i tabby_db_version. Nic nie jest wysyłane do żadnej zewnętrznej usługi.
Stylowanie paneli zakładek (CSS)
Dział zatytułowany „Stylowanie paneli zakładek (CSS)”Panele Langeto są stylowane zmiennymi --tabby-*: kolor krawędzi separatora, jej grubość, zarezerwowany margines i czas animacji otwarcia, ograniczone do paneli o identyfikatorze zaczynającym się od tab-tabby_. Nadpisz je z arkusza motywu, aby przemotywować Langeto bez ruszania paneli natywnych:
.woocommerce-tabs .panel[id^="tab-tabby_"] { --tabby-edge: #2563eb; /* kolor krawędzi zakładki */ --tabby-edge-width: 3px; /* jej grubość */}Panele mają wbudowaną paletę dla trybu ciemnego (przez prefers-color-scheme), a krótka animacja otwarcia jest automatycznie wyłączana przy prefers-reduced-motion. Langeto nie dostarcza szablonu PHP do nadpisania w motywie: znacznik panelu to nagłówek i <div> z treścią, przestylowywane w całości tymi zmiennymi CSS.
Rozszerzanie Langeto (dla programistów)
Dział zatytułowany „Rozszerzanie Langeto (dla programistów)”Gdy Langeto zbierze włączone zakładki dla produktu, przepuszcza je przez jeden filtr, zanim WooCommerce je wyrenderuje:
add_filter( 'tabby/resolved_tabs', function ( array $tabs, ?WC_Product $product ): array { // $tabs to tablica obiektów Langeto\Domain\Tab, w kolejności renderowania. // $product to renderowany produkt, gdy WooCommerce go ustawiło.
// Przyklad: ukryj zakladke na konkretnym produkcie. if ( $product && 123 === $product->get_id() ) { $tabs = array_filter( $tabs, fn ( $tab ) => 'warranty' !== $tab->id ); }
return array_values( $tabs );}, 10, 2 );Każdy element to Langeto\Domain\Tab z tylko do odczytu właściwościami id, title, content, enabled i source. Wszystko, co zwrócisz, a co nie jest instancją Tab, jest odrzucane przed renderem, więc renderer nigdy nie dostaje obcego kształtu. Z tego samego haka korzysta zawężanie do kategorii w Langeto PRO. (tabby/booted to wewnętrzny sygnał startu dla dodatków, nie hak na treść.)