Przejdź do głównej zawartości

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.

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.

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.

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_field przy 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.

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.

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.

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 priorytetu 100 w 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.

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.

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.

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ść.)