Wdrożenie Omnibusa w sklepie na WooCommerce (kurs)

Sklep internetowy z produktami cyfrowymi na WooCommerce, czyli klasyka. Pojawia się jednak kwestia plików do pobrania. Nie w kontekście bezpieczeństwa (nieuprawnione pobieranie), bo to w nawet w standardowej konfiguracji WooCommerce jest dość dobrze zabezpieczone. Chodzi o miejsce, jakie kolejne pliki zajmują (głównie w kontekście kopii zapasowych), o obciążenie łącza w przypadku, gdy kilka osób naraz będzie „ssało coś większego”. Rozwiązanie problemu relatywnie proste – skorzystać z jakiejś usługi typu S3 (Simple Storage Service) do przechowywania i dystrybuowania plików.

Serwowanie plików do pobrania z Amazon S3 w WooCommerce

Zadanie potencjalnie dość łatwe – wystarczy konto np. w Amazon AWS (S3) lub Alibaba Cloud (Object Storage Service) lub…, do tego bucket (kontener) na pliki, odpowiednie uprawnienia (użytkownik, ACL) i mamy linki do plików, które można wklejać w ustawieniach produktu do pobrania w WooCommerce.

Pojawia się pytanie jednak klasyczne – jak na WordPressa przystało – pytanie, „czy można prościej, czy może jest jakaś wtyczka do tego?”. Jest, nawet nie jedna. Z tym że właściwie wszystkie są płatne, i jakbym miał jakąś wybierać, to pewnie sięgnąłbym do samego źródła WooCommerce, czyli oficjalną wtyczkę Amazon S3 Storage od autorów WooCommerce, która o dziwo nie jest nawet specjalnie droga (29 $ rocznie).

Ale ktoś może powiedzieć, że to 29 $, tam 59, jeszcze w innym miejscu 99, 149… i szybko robi się z tego niezła sumka do płacenia co roku. Więc pojawia się kolejne klasyczne – jak na WordPressa przystało – pytanie, czyli „czy nie ma jakiejś bezpłatnej wtyczki?”.

WC Download Products from AWS S3

Jest, nawet – jak się zdaje – przygotowana przez naszego rodaka (Piotr Włoch) wtyczka WC Download Products from AWS S3, która niestety ostatnio nie jest aktualizowana, a ku mojemu jeszcze większemu zaskoczeniu nie jest specjalnie popularna (wg repozytorium wtyczek WordPressa ma trochę ponad 30 aktywnych instalacji).

Co jest o tyle dziwne, że wtyczka działa całkiem sprawnie (o tym za chwilę, bo niekoniecznie działa sprawnie „z marszu”), i po skonfigurowaniu usługi Amazon AWS/S3 (WP-Admin -> WooCommerce -> Ustawienia -> Download prodcts from AWS S3) w oknie edycji produktu cyfrowego, gdy wybierzemy dodanie pliku z biblioteki, mamy do dyspozycji również pliki znajdujące się w usłudze Amazon S3:

Wystarczy wybrać opcję „browse Amazon AWS S3 Bucket”, a następnie wybrany plik. Możliwe jest też wgrywanie nowych plików za pomocą wtyczki, co oczywiście wymaga ustawienia odpowiednik uprawnień, ale choć jest to wygodne, to niesie ze sobą pewne ryzyko (uprawnienia).

Wybrane pliki z Amazon S3 pojawiają się w ustawieniach produktu, tak, jak pliki z lokalnej biblioteki:

I teoretycznie po zakupie danego produktu dostępne są do pobrania w sposób identyczny, jak te lokalne. Napisałem teoretycznie, bo jest mały wielki problem z działaniem wtyczki. Przynajmniej na moim serwerze.

Losowe pliki do pobrania

Weźmy produkt, który przygotowałem na potrzeby testów wtyczki, a którego ustawienia znajdują się na grafice powyżej. Mamy tu do pobrania 4 pliki z lokalnej biblioteki (lokalny-01, lokalny-02, lokalny-03 i lokalny-04) oraz 3 serwowane z usługi Amazon S3 (S3-01, S3-02 i S3-03).

Po zapisaniu produktu i jego zakupie lista plików do pobrania dla kupującego może wyglądać tak:

Na liście znajdują się wszystkie pliki lokalne, ale tylko jeden plik z S3, konkretnie S3-02, ale to nie ma właściwie znaczenia, bo jest to zachowanie dość losowe. Równie dobrze mogłoby brakować innych plików (w tym lokalnych), a inne mogłyby być. Loteria. I to niezależnie, czy dodajmy jakieś pliki z Amazon S3 do produktu, czy tylko korzystamy z lokalnych zasobów.

I choć nie wgłębiałem się zbytnio w przyczynę problemu, to trochę na zasadzie logiki udało mi się ją dość szybko wyeliminować…

Poprawka, eliminująca błąd

To, na co zwróciłem uwagę, to owa losowość występuje (najprawdopodobniej) nie na etapie samego zamówienia, bo w kolejnych zamówieniach lista plików do pobrania jest identyczna, a już na etapie zapisywania pliku.

A jeśli tak, to kolejna rzecz, na którą zwróciłem uwagę, to podstawianie przez wtyczkę WC Download Products from AWS S3 nazwy pliku (adresu URL) w miejscu na nazwę pliku, czego w standardzie WooCommerce nie robi. Przynajmniej nie na tym etapie. Niestety nawet zmiana nazwy (czy nawet usunięcie zawartości pola „nazwa”) przed zapisaniem produktu nie pomagała.

A skoro tak, to postanowiłem testowo w pliku JavaScript (współ)odpowiedzialnym za wybór plików usunąć elementy związane ze wstawianiem nazwy pliku (tu znajdziesz zmodyfikowaną wersję pliku). I jak się okazało, to był strzał w dziesiątkę. Identyczny produkt jak wcześniej, ale pliki do pobrania dodane jeszcze raz, po modyfikacji pliku i po zakupie wszystkie pliki są dostępne:

Trzeba tylko pamiętać, by wyczyścić cache przeglądarki, tak by pobrała z serwera ponownie ten plik (np. odświeżyć stronę za pomocą klawisza F5 z przytrzymanym klawiszem ctrl), co będzie widać po tym, że nie będzie automatycznie uzupełniane pole z nazwą pliku do pobrania.

Niestety trzeba też ponownie dodać pliki do pobrania w produktach, które zostały utworzone lub modyfikowane w tym zakresie po instalacji wtyczki (nawet tych z lokalnymi plikami do pobrania).

Poza tą niedogodnością, w kilku testach, na kilku stronach, wtyczka zdaje się działać bez problemowo.

(!) Zgłoś błąd na stronie | Lub postaw nam kawę :-)
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Wdrożenie Omnibusa w sklepie na WooCommerce (kurs)
Patryk
Wdrożenie Omnibusa w sklepie na WooCommerce (kurs)