Język

Napisz do mnie

Wtyczka WooCommerce · od 2020

WOOT

Wtyczka WooCommerce, która pokazuje katalog sklepu jako sortowalne, filtrowalne tabele z dodawaniem do koszyka w każdym wierszu.

Pierwsze wydanie
Aktywne instalacje
1000+
Ocena
4.8 / 5 (18)Czytaj opinie
  • PHP
  • WordPress
  • WooCommerce
  • WP_Query
  • MySQL (własne tabele przez dbDelta)
  • admin-ajax
  • WC AJAX (wc-ajax=add_to_cart)
  • JavaScript (klasy ES6, fetch, AbortController)
  • AlaSQL
  • WPML

O mnie

WOOT renderuje katalog WooCommerce jako tabelę: jeden wiersz na produkt, kolumna dla dowolnego pola produktu, atrybutu, taksonomii lub klucza meta oraz element dodawania do koszyka w każdym wierszu. Tabele konfiguruje się w panelu administracyjnym albo opisuje inline w shortcode [woot]. Ten sam silnik rysuje też koszyk, listy wariantów, upselle, cross-selle, produkty powiązane i tabele pojedynczego produktu.

Trudność polega na tym, że jedna kolumna musi wykonywać trzy zadania: renderować komórkę, sortować zapytanie serwera i działać jako filtr. Produkty mają kilka typów (prosty, z wariantami, grupowany, zewnętrzny, wariant), które zachowują się inaczej w komórce i w koszyku. Wszystkie dane tabel przechodzą przez jeden publiczny punkt końcowy AJAX, który musi pozostać używalny na dużych katalogach i nie może ujawniać wersji roboczych, niepublicznych typów wpisów ani plików na serwerze.

Silnik tabel w przeglądarce (data-table-23.js) to zwykły JavaScript z klasami ES6 i fetch. Cache'uje strony według skrótu żądania, anuluje nieaktualne żądania, może przełączyć tabelę w tryb w przeglądarce i odpytywać ją SQL-em po tablicy JSON oraz zmienia układ na małych ekranach. jQuery służy tylko do wywoływania własnych zdarzeń koszyka WooCommerce.

WOOT · tabele produktów

co rozwiązano

AKTYWNYod 2020

Zapytania tabel po stronie serwera

shipped · 2020

Co to dajeKlienci stronicują, sortują i filtrują tabele produktów według ceny, SKU lub stanu w swoim języku, a presety list, takie jak bestsellery, pokazują dokładną liczbę pozycji.

Problem
Każde przejście strony, kliknięcie sortowania i zmiana filtra przychodzi jako jedno żądanie AJAX. Musi stać się jednym WP_Query, który respektuje widoczność w katalogu, presety tabel, filtry, język odwiedzającego i klucze sortowania, których WP_Query nie obsługuje.
Rozwiązanie

get_table_data() czyta ograniczony białą listą zestaw kluczy żądania, stosuje presety i filtry jako transformacje argumentów zapytania, łata SQL tylko tam, gdzie WP_Query nie wystarcza, i zwraca wiersze z łączną liczbą do stronicowania.

Technologie
  • PHP
  • WP_Query
  • WooCommerce
  • WPML
Zadania · 6
Jeden publiczny punkt końcowy obsługuje każdą tabelę i każdego odwiedzającegoBiała lista kluczy żądania, sanityzacja każdego według typu, budowa argumentów WP_Query, zwrot wierszy i liczby

get_table_data() jest zarejestrowana dla użytkowników zalogowanych i anonimowych. Przechodzi po $_REQUEST przez switch i zachowuje tylko znane klucze: post_type, per_page, orderby, order, current_page, table_id, wp_columns_actions, filter_data, filter_provider, fields, lang, predefinition i shortcode_args_set. Liczby przechodzą przez intval, klucze przez sanitize_key, ładunki JSON przez json_decode i rekurencyjny sanitizer.

Dwa z tych kluczy to nazwy hooków. wp_columns_actions jest przekazywany do apply_filters(), by załadować profil kolumn, a filter_provider wybiera filtr woot_filter_provider_{name}, który dodaje warunki filtra. Oba są sanityzowane jako tekst, ale nie są sprawdzane względem listy zarejestrowanych nazw.

Ta sama funkcja jest wywoływana z PHP z tablicą dla tabel renderowanych przy ładowaniu strony, więc ścieżka serwerowa i ścieżka AJAX dzielą jedną implementację. Każdy wiersz powstaje przez wywołanie domknięcia renderującego każdej żądanej kolumny, z ID produktu zachowanym jako pid dla akcji komórek.

Sortowanie po cenie, SKU lub stanie oznacza sortowanie po postmetaKolumny deklarują meta_key i orderby; zapytanie mapuje klucze sortowania na meta_value(_num)

Wpis kolumny taki jak price niesie 'orderby' => 'meta_value_num' i 'meta_key' => '_price'. get_table_data() wyszukuje żądany klucz sortowania w profilu kolumn i przepisuje na jego podstawie argumenty zapytania.

Lista rozwijana sortowania używa własnych kluczy (price-desc, sku, stock-desc, sales i tak dalej), tłumaczonych w filtrze woot_wp_query_args. Sortowanie po stanie i łącznej sprzedaży wyklucza produkty grupowane i zewnętrzne klauzulą product_type NOT IN, ponieważ te typy nie mają własnego stanu ani wartości sprzedaży. Dla sortowań z listy wtyczka wywołuje też WC()->query->get_catalog_ordering_args(), co dołącza własne klauzule porządkowania WooCommerce dla popularności, oceny i ceny, więc te sortowania zgadzają się ze stroną sklepu.

WP_Query nie potrafi sortować po post_statusPodpiąć filtr posts_orderby dla tego jednego zapytania i zdjąć go zaraz po jego wykonaniu

Dla orderby=post_status domknięcie jest dodawane do posts_orderby przed WP_Query i usuwane po nim, więc inne zapytania w tym samym żądaniu zachowują własne porządkowanie.

Presety top-N (bestsellery, najnowsze) muszą pokazywać dokładnie N produktówOgraniczyć posts_per_page do N i ustawić found_posts na N, aby paginacja liczyła tylko N pozycji

Preset bestsellerów sortuje po total_sales, a preset najnowszych po post_date, oba z posts_per_page ustawionym na N. WP_Query zgłasza found_posts dla wszystkich pasujących produktów, więc po zapytaniu found_posts jest ustawiane na limit presetu, a paginacja pokazuje tylko top N.

Presety potrzebują włączania i wykluczania według kilku taksonomiiSparsować zwarty ciąg reguł do zagnieżdżonego tax_query; odwrócić relację przy wykluczeniu

Reguła presetu jest zapisana jako ciąg taki jak product_cat:25,26|pa_color:19|rel:AND. get_by_taxonomy() zamienia ją w jedną zagnieżdżoną grupę tax_query i pomija taksonomie, które już nie istnieją.

W wariancie wykluczającym każda klauzula używa NOT IN, a relacja jest zamieniana (AND staje się OR i odwrotnie), co jest prawem De Morgana: wykluczenie produktów pasujących do A i B oznacza zachowanie tych spoza A lub spoza B. Presety SKU mapują SKU wariantu na ID jego produktu nadrzędnego, ponieważ tabela wymienia produkty nadrzędne.

Żądania admin-ajax gubią język odwiedzającegoWysyłać ustawienia regionalne z każdym żądaniem i przełączać WPML na nie przed zapytaniem i renderowaniem

admin-ajax.php działa poza kontekstem języka front-endu. draw_table_data() zapisuje get_locale() w JSON tabeli, przeglądarka odsyła to jako lang, a get_table_data() przekazuje to przez filtr woot_current_lang.

Klasa słownika podpina ten filtr i wywołuje $sitepress->switch_lang(), więc WP_Query zwraca produkty we właściwym języku. Tytuły kolumn i etykiety są tłumaczone przez WOOT_Vocabulary::get() z własnej tabeli wtyczki, ładowanej raz na żądanie i kluczowanej według ustawień regionalnych.

Model kolumn

shipped · 2020

Co to dajeWłaściciel wybiera, które szczegóły produktu pojawiają się jako kolumny tabeli, w tym własne pola sklepu, i może kopiować lub przenosić konfiguracje tabel.

Problem
Kolumna to więcej niż komórka. To samo pole musi renderować się dla każdego typu produktu, sterować sortowaniem i pojawiać się jako widżet filtra, a właściciele sklepów dodają własne taksonomie i klucze meta.
Rozwiązanie

Każda tabela działa na profilu: tablicy deskryptorów pól, których domknięcia renderują komórkę, zmieniają argumenty WP_Query dla filtrowania i opisują widżet filtra. Taksonomie i klucze meta są dodawane do profilu w czasie działania.

Technologie
  • Domknięcia PHP
  • Filtry WordPressa
  • MySQL
  • dbDelta
Zadania · 5
Jedna definicja pola musi sterować komórką, sortowaniem i filtremProfil deskryptorów z domknięciami render, filter-args i filter-UI dla każdego pola

WOOT_WooCommerce::action() zwraca profil. Każdy klucz to pole z tytułem, domknięciem action renderującym komórkę dla ID produktu, danymi sortowania (order, orderby, meta_key) oraz, dla pól filtrowalnych, domknięciami get_filter_query_args i get_filter_draw_data. Indeks 0 zawiera ustawienia na poziomie tabeli: typ wpisu, dozwolone statusy, dostawcę filtra.

Profile są rejestrowane po nazwie i rozwiązywane przez apply_filters na akcji tabeli. Koszyk, warianty, widok pojedynczego produktu, a nawet własne ekrany administracyjne wtyczki (lista tabel, klucze meta, słownik) działają na tym samym silniku z własnymi profilami.

Każda taksonomia i atrybut produktu powinny być kolumnąKolumny z get_object_taxonomies('product') minus wewnętrzne, pokazywane jako drzewa terminów

product_type, product_visibility, product_shipping_class i translation_priority z WPML są usuwane z listy. Komórka pokazuje własne terminy produktu przez build_taxonomy_tree() ograniczone do przypisanych ID terminów, jako linki lub zwykły tekst według opcji kolumny.

Strona filtra dodaje klauzulę tax_query, której operator (IN, NOT IN, AND) pochodzi z ustawień tabeli i jest sprawdzany względem tej białej listy.

Właściciele sklepów potrzebują kolumn dla dowolnych kluczy metaTypowany rejestr meta (tekst, liczba, kalendarz) daje tryb sortowania i filtr dla każdego klucza

Klucze meta są przechowywane dla tabeli w woot_tables_meta wraz z typem. assemble_meta_for_system() zamienia każdy w pole profilu: tekst sortuje po meta_value i filtruje przez LIKE; liczba sortuje po meta_value_num i filtruje liczbowym BETWEEN na suwaku zakresu; kalendarz filtruje jako DATETIME albo jako liczbowy znacznik czasu unix, wybierany dla pola, ponieważ wtyczki takie jak ACF przechowują daty w różnych formatach.

Pola są scalane z profilem przez filtr ext_{action}, a każdy klucz pojawia się też na liście sortowania z wpisami rosnącymi i malejącymi.

Wiersze razy kolumny powtarzają te same wyszukiwania produktów i opcjiStatyczne cache na poziomie żądania dla produktów, opcji tabel, wierszy kolumn i wierszy meta

Każde domknięcie kolumny potrzebuje obiektu WC_Product, więc get_product() trzyma statyczną mapę wyników wc_get_product(). Opcje tabel są dekodowane z JSON raz na tabelę, wiersze meta są cache'owane po md5 ciągu SQL, a budowniczy filtrów rozwiązuje profil raz, zamiast dla każdego pola.

Konfiguracje tabel potrzebują własnego przechowywania, klonowania i przenoszeniaCztery własne tabele przez dbDelta; klonowanie kopiuje kolumny i meta; import wypełnia z JSON

install.php tworzy woot_tables, woot_tables_columns (indeksowane po table_id i is_active, uporządkowane według pos_num), woot_tables_meta i woot_vocabulary. Kolejność kolumn ustawiana przeciąganiem przychodzi jako lista ID i jest zapisywana z powrotem jako pos_num.

clone() kopiuje wiersz tabeli, potem jej kolumny i klucze meta pod nowym ID tabeli. Eksport zrzuca wszystkie cztery tabele i opcje jako JSON; import czyści każdą tabelę i wstawia wiersze, po sprawdzeniu uprawnień i nonce.

Filtrowanie

shipped · 2020

Co to dajeKlienci zawężają tabelę według zakresów, dat, kategorii i tekstu, a tabele podążają za istniejącą wtyczką filtrów sklepu na tej samej stronie.

Problem
Filtry przychodzą z przeglądarki jako płaska mapa klucz/wartość i muszą stać się argumentami WP_Query: zakresy meta, klauzule taksonomii, wyszukiwanie tekstu i zakresy dat. Sklepy, które już używają wtyczki filtrów, oczekują, że tabela za nią podąży.
Rozwiązanie

Dostawca filtra przekazuje każdy klucz do własnego domknięcia zapytania kolumny. Zewnętrzne wtyczki filtrów podłączają się jako alternatywni dostawcy zwracający listę ID produktów.

Technologie
  • WP_Query
  • meta_query
  • tax_query
  • posts_where
  • $wpdb->prepare
Zadania · 5
Filtr zakresu dat potrzebuje dwóch pól dla jednej kolumnyRozdzielić pole kalendarza na key i key---to; dostawca usuwa przyrostek i odwraca compare

Gdy budowany jest formularz filtra, pole kalendarza jest duplikowane pod kluczem ---to z etykietami Od i Do. W drodze powrotnej provider() widzi nieznany klucz kończący się na ---to, usuwa przyrostek i wywołuje to samo domknięcie kolumny z flagą, więc domknięcie porównuje przez <= zamiast >=.

Suwaki zakresu potrzebują granic, zanim jakikolwiek filtr zostanie ustawionyWyliczyć MIN i MAX klucza meta w SQL, gdy administrator nie ustawił granic

Jeśli pole zakresu nie ma skonfigurowanego minimum lub maksimum (-1), get_field_drawing_data() uruchamia SELECT MIN lub MAX(cast(meta_value as UNSIGNED)) na postmeta dla klucza meta pola przez $wpdb->prepare. Nazwa funkcji pochodzi z wewnętrznej białej listy, a nie z żądania. Suwak liczby komentarzy czyta swoje granice z tabeli wpisów.

Wyszukiwanie tekstu musi obejmować wybrane pola bez SQL injectionKlauzula posts_where z esc_like i prepare; lista pól ograniczona do trzech kolumn wpisu

Przeszukiwane pola pochodzą z shortcode, ale są filtrowane do post_title, post_content i post_excerpt. Każde staje się LOWER(field) LIKE %s z wartością escapowaną przez esc_like i związaną przez prepare.

W przeglądarce wyszukiwanie uruchamia się na Enter tylko wtedy, gdy pole osiągnie swój minlength, a pusty Enter lub Escape usuwa frazę, co nie dopuszcza krótkich fragmentów słów do serwera.

Tabele muszą podążać za filtrem HUSKY (WOOF) na tej samej stronieOdtworzyć żądanie WOOF, uruchomić jego predykcję ID i podać ID do post__in

Przy filter_provider=woof shortcode przechwytuje dane żądania WOOF do JSON tabeli. Przy każdym wywołaniu AJAX dostawca przywraca z niego $_GET, prosi o wszystkie wyniki, wywołuje woof_products_ids_prediction() i czyta woof_wp_query_ids, akceptując tablicę lub ciąg rozdzielony przecinkami i zachowując tylko dodatnie liczby całkowite. Brak ID oznacza post__in = [0].

Stan filtra MDTF musi dotrzeć do żądania AJAXZdekodować stan MDTF, zażądać tylko argumentów zapytania, usunąć jego własne flagi, wstępnie pobrać ID produktów

Parametr page_mdf jest dekodowany, a MDTF uruchamiany z mdf_get_query_args_only, aby zwrócił argumenty WP_Query zamiast HTML. Klauzula meta mdf_hide_post i klauzula product_visibility są usuwane (WOOT dodaje własne), porządkowanie jest odrzucane, a zapytanie działa z fields=ids. Lista ID podróżuje jako dane filtra i staje się post__in.

Dodawanie do koszyka z tabeli

shipped · 2020

Co to dajeKlienci kupują dowolny typ produktu wprost z tabeli, dodają wiele wierszy naraz, a koszyk pozostaje zgodny z resztą sklepu.

Problem
Każdy typ produktu potrzebuje innego elementu zakupu, ilości są ograniczone stanem, a koszyk tabeli musi pozostać zsynchronizowany z mini-koszykiem motywu i stroną koszyka WooCommerce.
Rozwiązanie

Serwer emituje zwarty deskryptor dla każdego typu produktu, przeglądarka buduje z niego elementy i wysyła do własnego punktu końcowego AJAX WooCommerce. Zawartość koszyka jest rysowana przez ten sam silnik tabel.

Technologie
  • API koszyka WooCommerce
  • WC AJAX
  • JavaScript
  • fetch
Zadania · 5
Produkt prosty, z wariantami, grupowany i zewnętrzny potrzebują różnych elementówSerwer emituje typowany deskryptor data-about; JS buduje pole, checkbox lub link do okna

add_to_cart.php sprawdza is_purchasable() i is_in_stock() i, gdy stan jest zarządzany, wymaga niezerowej ilości. Dla produktów prostych deskryptor niesie ID, stan i SKU; klient buduje pole liczbowe z max ustawionym na stan, tylko do odczytu dla produktów sprzedawanych pojedynczo, plus checkbox do dodawania zbiorczego.

Produkty z wariantami i grupowane dostają przycisk otwierający okno z tabelą swoich dzieci. Produkty zewnętrzne linkują do zewnętrznego URL. Nieznane typy przechodzą przez filtr woot_woocommerce_add_to_cart, aby inne wtyczki mogły dostarczyć znaczniki.

Dodawanie do koszyka musi zachowywać się jak własny przycisk WooCommercePOST na wc-ajax=add_to_cart, potem wywołanie wc_fragment_refresh dla mini-koszyków motywu

Adres punktu końcowego jest brany z wc_add_to_cart_params, gdy WooCommerce go wypisuje, więc własne punkty końcowe AJAX nadal działają. Ilość jest sprawdzana względem max przed wysłaniem. Po sukcesie wtyczka wywołuje wc_fragment_refresh, odświeża własne informacje o koszyku i, zależnie od opcji tabeli, przekierowuje do koszyka lub kasy.

Klienci chcą dodać wiele wierszy jedną akcjąZaznaczone wiersze i ilości w jednym żądaniu; warianty dostają ID rodzica i atrybuty

Checkbox w nagłówku kolumny koszyka zaznacza wszystkie wiersze. add_to_cart_some() przechodzi po wysłanych pozycjach. Dla wariantu odbudowuje mapę attribute_* z get_attributes('edit') i wywołuje WC()->cart->add_to_cart() z ID rodzica, ilością, ID wariantu i tą mapą, czyli w postaci, jakiej oczekuje koszyk WooCommerce.

Produkty z wariantami potrzebują tabeli swoich wariantówDostawca filtra przełącza post_type na product_variation i ogranicza post__in do dzieci

WOOT_WooCommerceVariations::filter_provider() ustawia post_type na product_variation, a post__in na dzieci rodzica, po sprawdzeniu, że rodzic jest widoczny dla odwiedzającego. Tabele upselli, cross-selli, produktów grupowanych i powiązanych dzielą klasę bazową WOOT_WooCommerceUniversal i różnią się tylko źródłem ID.

W wierszach wariantów tytuł dostaje dopisane nazwy terminów atrybutów, a kolumny taksonomii czytają własny slug atrybutu wariantu zamiast terminów przypisanych do wpisu.

Sam koszyk powinien być sortowalną tabeląDomknięcia profilu koszyka biorą ID produktu i ilość; silnik rysuje go w trybie JSON

Profil woot_cart łączy skonfigurowane kolumny produktu z ilością, sumą częściową (WC_Cart::get_product_subtotal) i usuwaniem. Każda zmiana koszyka odpowiada świeżą tabelą koszyka, liczbą pozycji i sumą częściową. Usuwanie i aktualizacja znajdują linię koszyka po product_id lub variation_id.

Okno koszyka przejmuje skórkę tabeli, która je otworzyła: blok stylów rodzica jest kopiowany, a jego ID tabeli zastępowane ID tabeli okna. Opcja tabeli może też ukrywać produkty już będące w koszyku przez post__not_in.

Silnik tabel w przeglądarce

shipped · 2020

Co to dajeTabele reagują szybko przy stronicowaniu i sortowaniu, kilka tabel może dzielić stronę, a szerokie tabele pozostają używalne na telefonach.

Problem
Stronicowanie, sortowanie i wyszukiwanie muszą sprawiać wrażenie natychmiastowych, kilka tabel z różnymi skórkami może dzielić stronę, a szerokie tabele muszą działać na telefonach.
Rozwiązanie

data-table-23.js to klasa bez zależności dla każdej tabeli, z cache według skrótu żądania, anulowaniem żądań, opcjonalnym trybem SQL w przeglądarce i przełącznikiem zwartego układu.

Technologie
  • JavaScript (klasy ES6)
  • fetch
  • AbortController
  • AlaSQL
  • CustomEvent
Zadania · 6
Strona lub kolejność sortowania już widziane nie powinny ponownie uderzać w serwerCache'ować odpowiedzi pod skrótem całego obiektu żądania; czyścić przy zdarzeniach

__hash_object() serializuje request_data do JSON i składa go w 32-bitowy skrót używany jako klucz cache. Cache jest wyłączony w trybach JSON i load-more, gdzie dane są już lokalne. Rozszerzenia takie jak porównywarka i ulubione wysyłają table23-reset-cache, gdy ich dane się zmieniają.

Małe katalogi powinny sortować i wyszukiwać bez przejść do serweraTryb to_json ładuje wszystkie wiersze raz, potem sortuje, stronicuje i przeszukuje je przez AlaSQL

W trybie to_json serwer zwraca każdy wiersz (posts_per_page -1). Po pierwszej odpowiedzi tabela sama przełącza się na tryb json, a draw_data() buduje SELECT ... WHERE ... ORDER BY ... LIMIT ... OFFSET i uruchamia go przez AlaSQL na tablicy. Jednostronicowa tabela znaleziona w cache jest przeszukiwana i sortowana w ten sam sposób.

Wolna wcześniejsza odpowiedź nie może nadpisać nowszej stronyPrzerwać poprzedni fetch przez AbortController przed wysłaniem następnego

Każda tabela trzyma swój bieżący AbortController. Nowe żądanie strony, sortowania lub filtra przerywa oczekujące, więc wolna wcześniejsza odpowiedź nie może już nadpisać nowszej strony.

Szerokie tabele muszą przełączać się na zwarty układ na telefonachRenderować ponownie tylko przy przekroczeniu punktu granicznego szerokości; handler resize zablokowany na 999 ms

Każda tabela ma własne compact_view_width. Nasłuchiwacz resize porównuje nowy stan z poprzednim i przerysowuje tylko przy zmianie; flaga blokady nie pozwala mu odpalić ponownie przez 999 ms. Kolumny oznaczone hide-on-mobile są pomijane przy budowie nagłówków, pływający nagłówek jest wyłączany w trybie zwartym, a reguły media-hide dla poszczególnych kolumn są generowane jako CSS dla HTML ID tabeli.

Kilka tabel z różnymi skórkami na jednej stronieCSS skórki używa symbolu zastępczego tid, zamienianego na HTML ID każdej tabeli przy renderowaniu

get_theme_css() czyta skórkę najpierw z folderu woot-skins motywu, a potem z folderu skins wtyczki, zamienia symbol zastępczy tid na HTML ID tabeli i usuwa komentarze oraz zbędne odstępy. Każda reguła jest ograniczona do jednej tabeli, więc skórki nie przeciekają między tabelami na tej samej stronie.

Komórki mogą zawierać własne tabeleKonfiguracja zagnieżdżonej tabeli dostarczana jako JSON w ukrytym div i tworzona po każdym rysowaniu

draw_table_data() koduje konfigurację z JSON_HEX_QUOT i JSON_HEX_TAG, aby mogła siedzieć wewnątrz HTML bez wyrwania się z elementu. Po narysowaniu wierszy do_after_draw() znajduje tabele wewnątrz komórek i tworzy dla każdej instancję WOOT_GeneratedTables, bez poziomego paska przewijania.

Bezpieczeństwo publicznych punktów końcowych

w produkcie

Co to dajePubliczne tabele pokazują tylko produkty, które powinny być widoczne, a odwiedzający nie mogą użyć żądań tabel, by dotrzeć do ukrytej treści ani uruchomić kodu.

Problem
Dane tabel, okna i akcje koszyka są serwowane anonimowym odwiedzającym przez admin-ajax, a żądania niosą ustawienia tabel, argumenty shortcode, nazwy skórek i nazwy hooków.
Rozwiązanie

Widoczność jest egzekwowana w czasie zapytania i dla każdego wpisu, nazwy docierające do ścieżek, CSS lub SQL są sprowadzane do bezpiecznych zestawów znaków w jednym miejscu, a każdy zapis administracyjny sprawdza uprawnienia i nonce.

Technologie
  • Uprawnienia WordPressa
  • nonce
  • $wpdb->prepare
  • sanityzacja danych wejściowych
Zadania · 5
Publiczne żądania tabel niosą typ wpisu i status wybrane przez klientaWymusić status publish dla odwiedzających; typy niepubliczne tylko dla tabel zbudowanych na nich

Tuż przed uruchomieniem WP_Query post_status jest resetowany do publish dla każdego bez read_private_posts, niezależnie od tego, o co prosiło żądanie, shortcode lub ustawienia tabeli. Status z argumentów shortcode jest respektowany tylko dla takich użytkowników.

Typy wpisów, których nie można wyświetlić (kupony, zamówienia, szablony), są odrzucane dla użytkowników bez edit_posts, chyba że zapisana tabela została zbudowana dla tego typu wpisu przez administratora.

Okna i shortcode biorą ID produktu od klientawoot_can_read_post() sprawdza status, widoczność i, dla wariantów, rodzica

Jedna funkcja decyduje, czy odwiedzający może zobaczyć dane wpisu: opublikowane wpisy typów publicznych są otwarte, typy niepubliczne wymagają praw edycji, inne statusy wymagają read_post, a wariant jest widoczny tylko wtedy, gdy widoczny jest jego rodzic. Tabele pojedynczego produktu, wariantów, upselli i inne tabele okien, shortcode galerii oraz rozszerzenia wywołują ją przed renderowaniem.

Nazwy skórek przychodzą z kilku źródeł i trafiają do ścieżki plikubasename() plus filtr [A-Za-z0-9_-] w jednym wąskim gardle; ID tabeli filtrowane przed CSS

Skórka może pochodzić z ?woot_skin=, shortcode, rozszerzeń lub ustawień tabeli, a wszystkie przechodzą przez get_theme_css(). Tam nazwa jest redukowana przez basename() i filtr znaków usuwający kropki i ukośniki, więc nie może wskazywać poza foldery skórek. HTML ID tabeli, wpisywane do drukowanego CSS, jest filtrowane tak samo, aby nawiasy klamrowe ani ostre nie mogły wyrwać się z bloku style.

Punkt końcowy okien wywołuje hooki i shortcode według nazwyWywoływalne są tylko hooki woot_, call_id jest oczyszczany, renderują się tylko shortcode wtyczki

get_smth() jest publiczna. Jej gałąź ogólna wywołuje apply_filters na nazwie z żądania tylko wtedy, gdy nazwa zaczyna się od woot_, a towarzyszący call_id jest sprowadzany do liter, cyfr, podkreślenia i myślnika, zanim jakiekolwiek dalsze zapytanie go zobaczy. Gałąź shortcodes_set usuwa każdy shortcode spoza białej listy wtyczki przed do_shortcode(). Gałęzie eksportu i importu wymagają manage_woocommerce.

Zapisy administracyjne i SQL budowany z nazw kolumnUprawnienia i nonce przy każdym zapisie; identyfikatory SQL sprowadzone do [A-Za-z0-9_]

Handlery tabel, kolumn, meta i słownika sprawdzają manage_woocommerce i woot_settings_nonce przed zapisem. Rozszerzenie załączników dodaje sprawdzenie logowania i sprawdzenia edit_post na poziomie obiektu.

Nazw kolumn, pól ORDER BY i kluczy WHERE nie da się związać przez prepare(), więc get_rows() sprowadza je do bezpiecznego zestawu znaków, ogranicza porządek do ASC lub DESC, a logikę do AND lub OR, i wiąże tylko wartości.

Liczby

wordpress.org
  • Aktywne instalacje 1000+ licznik wordpress.org.
  • Opinie 18 Średnia ocena: 4.8 na 5.
  • Lat wsparcia 6 Od 4 września 2020, ostatnia aktualizacja 12 października 2026.