PORADNIK

REDO JSComposer Additional – plugin dodający widget do WPBakery

W tym artykule stworzymy nowy widget do stworzonego wcześniej pluginu, o którym dowiesz się z poprzedniego artykułu: Własna wtyczka dodająca widget do pluginu WPBakery

Załóżmy, że chcielibyśmy określić widok, który będzie wyświetlał w określony sposób, w dowolnym miejscu na stronie dla konkretnego typu posta i z wybranymi polami. Dodatkowo całość ma być kompatybilna z pluginem WPBakery Page Puilder. Do tego celu użyjemy stworzonego we wcześniejszym wpisie pluginu REDO JSComposer Additional.

Jak stworzyć plugin dodający widget do WPBakery, który  wyświetla wybrane Custom Post’y ?

Zabierajmy się do działania.

Wchodzimy do folderu z naszym pluginem – redo-jscomposer-additional – następnie wchodzimy w folder – widgets – i tworzymy nowy plik .php, który nazwiemy custom-post-widget.php.

Ścieżka do nowego pluginu dodającego widgety do WPBakery

Ścieżka do nowego pluginu dodającego widgety do WPBakery 2

Teraz podobnie jak w poprzednim poście tworzymy podstawowy szkielet naszego widget’u. Do tego celu wykorzystamy wcześniej stworzony widget projekty i skopiujemy co nam potrzebne.

Zostawiamy ścieżkę zabezpieczającą dostęp do plików ABSPATH, zmieniamy nazwę klasy dziedziczącej na WPBakeryShortCode_customPostWidget. Należy zostawić tablicę $args oraz zapytanie WP_Query oraz funkcję vc_map(). Wszystko należy poprawnie skonfigurować.

Poniżej znajduje się pusty szkielet naszego widget’u skonfigurowany pod napisanie naszego nowego dodatku do pluginu.

Teraz możemy przystąpić do edycji widget’u, aby pobrał odpowiednie wartości i wyświetlił je w formie odpowiedniego widoku.

Zacznijmy od przygotowania naszego widgetu do pobrania listy custom post’ów oraz pól, które chcielibyśmy wyświetlić. Skorzystamy z wbudowanej opcji WPBakery, pozwalającej na pobranie listy post’ów z pluginu CPT UI. Listę przekażemy do zmiennej $customPostList.

Chcielibyśmy sprawdzić co znajduje się w naszej zmiennej, aby móc poprawnie przefiltrować dane i przekazać do naszej funkcji vc_map. Potrzebna nam do tego funkcja, która pozwala na debugowanie zmiennej. Funkcję stworzymy w pliku main.php, więc musimy się cofnąć do folderu głównego naszego pluginu i przejść do edycji pliku.

Tworzymy funkcję debug(), nadajemy jej parametry public static aby można było się do niej odwołać w pliku customPostRedo.php. Do funkcji przekazywać będziemy zmienną $var– zawierającą naszą zmienną do “sprawdzenia” oraz zmienną $die – odpowiadającą za działanie funkcji, będziemy przekazywać w niej wartość true albo false w zależności czy chcemy aby debug działał.

Aby poprawnie wyświetlało wartości zmiennej musimy użyć tagu html – <pre></pre>‘ oraz funkcji print_r, która wypisze wartość debugowanej zmiennej.

Jeśli parametr $die będzie miał wartość false, używamy funkcji die(), która uśmierci funkcję debug().

Już wiemy jak sprawdzić co znajduje się w naszej zmiennej, zastosujmy na niej naszą funkcję.

debugowanie zmiennej

Otrzymaliśmy tablicę, zawierającą listę custom post’ów, których używamy na naszym WordPressie oraz ich wartości ustawione w pluginie CPT UI. W naszym przypadku chcielibyśmy wydobyć następujące pola:

  • nazwa typu posta – znajduje się ona zarówno jako nazwa tablicy [‘partnerzy’] oraz jako wartość pola [name],
  • pola, których używa nasz post – podstawowe pola, takie jak tytuł posta, opis itp, które znajdują się pod wartością pola [supports],
  • custom fields – pola własne, które chcielibyśmy wyświetlić w widoku – niestety nie znajdują się w tablicy, którą otrzymaliśmy.

Po odpowiedniej pracy na tablicy otrzymanej za pomocą get_option(‘cptui_post_types’) jesteśmy w stanie wykonać dwie pierwsze kropki z powyższej listy. Aby wydobyć custom-fields, musimy stworzyć odpowiednią funkcję w pliku main.php. Przejdźmy do jego edycji.

Tworzymy funkcję prepareCustomFields(), nadajemy status public static, abyśmy mieli dostęp w innych plikach. Pierwszym krokiem w funkcji jest pobranie grup naszych pól, które posiadamy w pluginie Custom Fields. Posłuży nam do tego wbudowana funkcja: acf_get_raw_field_groups(). Wywołujemy ją do zmiennej $groups. Pobraną listę grup musimy odpowiednio posortować i przekazać do tablicy wyściowej, którą zwrócimy do pliku customPostRedo.php, nazwiemy ją $fields.

Stwórzmy funkcję, która odpowiednio przypisze nam nazwy pola do tablicy $fields. Funkcję nazwiemy parseCustomFields(), która będzie pobierać wartości:

  • $fieldList– lista pól custom fields, którą pobierzemy za pomocą wbudowanej funkcji: acf_get_fields(), dla danej grupy pól,
  • $fields tablica wyjściowa naszej funkcji,
  • $group– ID grupy pól.

W pętli foreach()odpowiednio przypisujemy pola custom fields do naszej tablicy.

Teraz za pomocą naszej funkcji przypisujemy do tablicy custom fields. Za pomocą pętli foreach()przypisujemy dla każdej z grup odpowiednie pola. Ustawiamy tytuł grupy przechowywany w wartości $group[“title”] oraz pobieramy listę pól za pomocą acf_get_fields(). Następnie wywolujemy naszą funkcję parseCustomFields() w której przekazujemy odpowiednio parametry. Zwracamy za pomocą return naszą tablicę z custom fields.

Wracamy do pliku customPostRedo.php i przystępujemy do odpowiedniej modyfikacji danych przed przesłaniem ich do vc_map. Posiadamy już naszą listę custom postów z polami podstawowymi, która znajduje się w zmiennej $customPostList. Stwórzmy dwie nowe tablice, które odpowiednio przechowają typ custom post’a oraz parametry (pola custom post’a):

  • $_custom_posts – tablica przechowująca podstawowe pola posta oraz jego typ i nazwę,
  • $_custom_posts_params– tablica przechowująca nazwy typów postów,

Sprawdzamy czy nasza lista $customPostList zawiera jakieś custom post’y. Następnie dla każdego post’a przypisujemy odpowiednio wartości do naszych tablic $_custom_posts oraz $_custom_posts_params.

  • $_custom_posts_params[$postList[“label”]] = $postList[“name”] – tutaj przypisujemy nazwę typu posta, np projekty, do tablicy $_custom_posts,
  • $_custom_posts[$postList[“name”]][“type”] = $postList[“name”] tutaj przekazujemy typ do tablicy z polami posta nazwę typu posta,
  • $_custom_posts[$postList[“name”]][“label”] = $postList[“label”] – label typu posta,
  • $supportsArray– tutaj odwracamy wartości tablicy $postList[“supports”], aby nazwa pola była nazwą klucza, następnie za pomocą pętli foreach() przekazujemy wartość klucza do wartości, żeby później łatwiej wydobywać nazwę pola,
  • $_custom_posts[$postList[“name”]][“supports”] = $supportsArray– przekazujemy tablicę $supportsArray.

Kolejnym krokiem będzie przygotowanie listy custom fields dla odpowiednich typów wpisów.

Pobieramy listę postów za pomocą utworzonej wcześniej w pliku main.php funkcji prepareCustomFields(), którą dziedziczymy z naszej klasy VC_REDO za pomocą operatora dziedziczenia ‘ :: ‘.

Tworzymy pustą tablicę do, której przekażemy odpowiednio nazwy pól własnych. Sprawdzamy czy zmienna $fields nie jest pusta, następnie za pomocą foreach(). Każde pole w tablicy $fields odpowiednio przypisujemy do naszej tablicy $customFieldsList.

Przechodzimy do stworzenia tablicy, którą przekażemy do vc_map. Tablica będzie zawierać wcześniej utworzone tablice, które zostaną w odpowiedni sposób przekazane według parametrów vc_map (pełną dokumentacją znajdziesz w dokumentacji: https://kb.wpbakery.com/docs/inner-api/vc_map/ ).

Tworzymy tablicę, którą przekażemy później jako parametr w vc_map i nazwiemy ją $paramsArray[]. Przekazujemy do niej pierwszą tablicę z nazwami własnych typów postów – $_custom_posts_params w parametrze valueNazwę pola, za pomocą, którego później będziemy wydobywać wybrany typ posta nazwiemy redo_post, którą przekazujemy w parametrze param_name.

Teraz chcielibyśmy dodać do naszego pluginu możliwość wybierania pól do wyświetlenia. Zrobimy to przekazując odpowiednio wcześniej stworzone tablice do tablicy $paramsArray[], za pomocą pętli foreach(). Dla każdego klucza $key z tablicy $_custom_postsprzypisujemy wartość $cp.

Pierwszym krokiem w pętli będzie stworzenie tablicy, wykluczającej pole custom-fields z tablicy z podstawowymi polami (custom-fields będą przekazane w oddzielnej tablicy), nazwiemy ją $custom_params. Za pomocą funkcji unset() usuwamy pole custom-fields z listy. Następnie za pomocą value przekazujemy tablicę $custom_params, a w param_name nadajemy nazwę od nazwy typu posta $key i dodajemy przyrostek _post_support.

Teraz przechodzimy do dodania custom fields do naszego widgetu. Działamy nadal w tej samej pętli foreach(). Sprawdzamy czy istnieje pole custom-fields w danym typie posta za pomocą sprawdzenia wartości $cp[“supports”][“custom-fields”]. Jeśli dana wartość istnieje tworzymy kolejną pętle foreach() do, której przekazujemy $customFieldListgdzie klucz przekazujemy jako zmienną $fka wartość jako zmienną $fv. W pętli tworzymy tablicę $customList przechowującą listę pól własnych, które pobieramy z $fv[“customFields”]. Następnie przypisujemy wartości kluczy do wartości w naszej liście $customList za pomocą pętli foreach(). Ostateczną formę tablicy $customList przesyłamy do tablicy $paramsArray[] analogicznie jak tablicę $custom_params.

Na dole cały kod tworzący tablicę $paramsArray[].

Przekazujemy tablicę $paramsArray do vc_map oraz standardowo nazywamy nasz widget. Jeśli nie wiesz na czym to polega odsyłam do poprzedniego poradnika.

Nasz widget już pobiera listę własnych typów postów, oraz ich pól, a także pól własnych z pluginu Custom Fields. Możemy teraz wybrać jakie typy postów chcemy wyświetlić i jakie pola.

WPBakery - plugin dodający własny widget

Udało nam się stworzyć widget, natomiast nie obsłużyliśmy jeszcze wyświetlenia wybranych parametrów. Przechodzimy do edycji widoku wyświetlanego przez nasz widget.

Najpierw za pomocą funkcji extract() pobieramy atrybuty przekazane do naszego widgetu w WPBakery. Wszystkie wartości będą znajdować się w tablicy $atts.

Typy postów, które zostały wybrane w widget’cie znajdują się pod kluczem $atts[‘redo_post’]Wcześniej nazwaliśmy nazwę parametru dla tablicy $_custom_post_params – redo_post, dlatego wartości znajdują się pod takim kluczem.

Teraz przechodzimy do podzielenia typów postów za pomocą funkcji explode(), która pozwala na dzielenie łancucha string po wybranej wartości. Nasz plugin przekazuje wartości w formie łańcucha string, w którym wartości oddzielone są kolejno przecinkami. Nasze typy postów przekazujemy do zmiennej $postTypes.

Następnie należy sprawdzić czy nasza tablica $postTypesnie jest pusta. Jeśli nie jest przechodzimy do stworzenia widoku dla każdego typu posta znajdującego się w tablicy. Robimy to za pomocą pętli foreach(). Pojedynczy post będzie znajdował się pod zmienną $postType.

Dla pojedynczego posta tworzymy div o nazwie post-type-containerzawierający nazwę typu posta w klasie (za pomocą CSS, możemy następnie odpowiednio modyfikować widok oddzielnie dla każdego typu posta). Wyświetlimy napis h2 informujący o typie posta.

Wewtnąrz pętli foreach() pobieramy listę postów dla danego typu posta (zmienna $postType) i przekazujemy ją do tablicy $postList.

Następnie odpowiednio porządkujemy otrzymane z tablicy $atts wartości i przypisujemy do odpowiednich zmiennych. Tablica $postFields– będzie zawierała pola domyślne posta, jeśli zostały wybrane, natomiast $customFields będzie zawierała pola własne. Wykonujemy operacje wydobywania wartości z tablicy $atts analogicznie jak w przypadku $postTypes.

Teraz sprawdzamy czy posty znajdują się w tablicy $postList. Jeśli tablica nie jest pusta dla każdego pojedynczego posta definiujemy w pętli foreach() zmienną $myPost przechowującą wpis.

Dla każdego posta tworzymy div z klasą post-container i nazwą typu posta.

Następnie w pętli dla pojedynczego posta, sprawdzamy czy zmienna $postFields nie jest pusta i następnie wyświetlamy dla każdego pola div z klasą post-field-container i nazwą pola. Sprawdzamy, czy w $postFields znajduje się wartość thumbnail, która przechowuje obraz. Jeśli tak – używamy funkcji get_the_post_thumbnail(), jeśli nie – get_post_field(). Za pomocą tych funkcji możemy wyświetlić wybrane pola w widoku.

Przechodzimy do wyświetlenia Custom Fields. Sprawdzamy czy nasza tablica $customFields nie jest pusta. Jeśli w tablicy znajdują się w wartości – wyświetlamy div o klasie custom-field-container i nazwa pola. Następnie pobieramy pole własne za pomocą funkcji get_field(). Następnie sprawdzamy czy nasze pobrane pole jest tablicą za pomocą funkcji is_array(). Jeśli jest tablicą wyświetlamy je jako obraz. Nie zawsze ta reguła będzie działać – w zależności jakich pól własnych używamy. W naszym przypadku ta reguła zadziała bo jedyna tablica jakiej używamy w polach własnych to obrazy. Jeśli nie jest to tablica – wyświetlamy pole domyślnie.

Wyświetlanie wybranych typów postów i pól jest gotowe. Otrzymaliśmy widok, który wyświetla pola zaznaczone w widget’cie.

Widget do pluginu WPBakery

Podsumowanie

Plugin REDO JSComposer Additional umożliwia tworzenie widoków dla własnych typów postów i pól, które wybieramy z poziomu pluginu WPBakery. Widok, który otrzymaliśmy możemy łatwo przystosować za pomocą CSS, ponieważ klasy różnią się w zależności od typu posta i nazwy pola.

Trudności w tworzeniu pluginu jest wiele. Przede wszystkim trzeba zapoznać się z tablicami asocjacyjnymi, żeby można było bez problemu operować na zbiorach danych zawartych w tym pluginie. Zapoznać się trzeba także z debugowaniem zmiennych. Niejednokrotnie trzeba sprawdzić co znajduje się w danej tablicy, aby móc zrozumieć kod zawarty powyżej.

Plugin, który został przedstawiony w tym poradniku, bardzo przyspiesza pracę z WPBakery i pluginami CPT UI oraz Custom Fields.