(Moje pierwsze pytanie dotyczące WP kiedykolwiek zadane! Bądź łagodny!)
Buduję witrynę składającą się głównie ze stron (tj. Statycznych), używając WP jako CMS. Na dole kilku stron pojawią się 1, 2 lub 3 „pola promocyjne” - w zasadzie obrazy przycisków, które prowadzą do innych części witryny. Chociaż na danej stronie pojawią się tylko 3 pola promocyjne, będzie około 30 różnych do wyboru.
Gdy mój klient tworzy nową stronę, chciałbym, aby mógł wybrać pudełka promocyjne z czegoś w rodzaju listy rozwijanej wszystkich możliwych pudeł promocyjnych.
Wydaje mi się, że powinno to działać tak:
- Utwórz niestandardowy typ postu o nazwie „pole promocyjne”. (Choć równie łatwo może to być tag zwykłych postów).
- Użyj narzędzia takiego jak Niestandardowy szablon pola, aby utworzyć menu rozwijane w edytorze stron, w którym wartości opcji menu rozwijanych są dynamicznie generowane z listy wszystkich istniejących postów w polu promocyjnym. ( To jest część, której nie umiem zrobić. )
- Uzyskaj dostęp do wynikowych metadanych (numer wpisu jest naprawdę wszystkim, czego potrzebuję, a następnie mogę uzyskać wszystko inne) w szablonie strony.
Opierając się na odpowiedziach na inne pytania tutaj, przyjrzałem się najpierw WPAlchemy MetaBox, Posts-2-Posts i SLT Custom Fields, ale przyznaję, że dokumentacja dla każdego z nich jest nieco bardziej maniakalna niż ja, więc nie zagłębiłem się zbyt głęboko.
Rada? Czy jedno z powyższych narzędzi jest dla mnie właściwym rozwiązaniem i muszę to rozgryźć? Czy coś mi umyka?
źródło
Odpowiedzi:
Jako autor WPAlchemy jestem nieco stronniczy, ale zasadniczo masz dobry model roboczy nakreślony do naśladowania w zależności od wybranej trasy.
Jeśli jednak używasz WPAlchemy, w zasadzie zrobiłbyś coś takiego: (krok # 2):
custom/meta.css
może zawierać style, w których można stylizować formularz, icustom/meta.php
zasadniczo jest plikiem HTML z zawartością FORMULARZA w polu meta, w tym przypadku listą rozwijaną, aby wygenerować listę rozwijaną, należy wykonać niestandardowe zapytanie wp, aby uzyskać wszystkie niestandardowe posty typy. WPAlchemy ma specjalne funkcje pomocnicze pomagające w tworzeniu elementów formularza.Istnieje dodatkowa dokumentacja pomocna podczas pracy w szablonie.
Głównym celem WPAlchemy było utrzymanie kontroli w rękach dewelopera, od stylizacji (look + feel) do definicji zawartości meta-box.
A ja i inni zawsze jesteśmy gotowi pomóc tym, którzy komentują i zadają pytania.
źródło
do_meta_boxes
od jakiejś logiki warunkowej lub alternatywnie naadd_meta_boxes_{%TYPE%}
..Hehe, jesteś nowicjuszem! Rozerwamy cię na strzępy ...!
j / k :) Serdecznie witamy wszystkich początkujących tutaj, cieszę się, że cię mamy.
Po raz trzeci usłyszałem ten wymóg, dwa razy od klientów, a nie od ciebie (i twojego klienta). To mówi mi, że jest to dość powszechna potrzeba.
Podobała mi się twoja analiza, więc postanowiłem zakodować klasę, aby zająć się twoim drugim punktem. Nazwałem go
LittlePromoBoxes
, ponieważ nigdy nie mogę dostać tej piosenki z mojej głowy, dzięki nimi . Zasadniczo używam tej klasy do enkapsulacji, aby w przeciwnym razie uniknąć potencjalnych konfliktów nazw z funkcjami, które musiałbym napisać.Możesz umieścić tę klasę w
functions.php
pliku motywu lub w pliku .PHP wtyczki, którą możesz pisać (ale nie martw się, wygląda na dużo bardziej złożoną niż jest.)Pierwsza funkcja
on_load()
jest funkcją statyczną, którą wywołuję na końcu deklaracji klasy, aby zainicjować trzy (3) zaczepy, których potrzebujesz (funkcje statyczne fyi są zasadniczo funkcjami związanymi z klasą , a nie instancją) :init
Hak zarejestrowaćpromo-box
rodzaj postu,add_meta_boxes_post
Hak, co pozwala na określenie METABOX iwp_insert_post_data
Hak, co pozwala na przechwytywanie wybranych pól promocyjnych i zapisać do bazy danych.Każdy z tych haków odwołuje się do innej funkcji statycznej w klasie (były to funkcje, które hermetyzowałem, tworząc klasę).
Pominę opisywanie
action_init()
funkcji i mojejmake_labels()
funkcji pomocnika, zakładając, że wiesz, jak zarejestrować typ postu na podstawie twojego pytania.action_add_meta_boxes_post()
Funkcja rejestruje METABOX przy użyciu funkcji rdzenia WordPressadd_meta_box()
i mam skomentował To parametry, które wyjaśniają, dlaczego mijałem co minąłem dla każdego. Funkcja wywołania zwrotnegothe_little_promo_boxes_metabox()
jest oczywiście kolejną funkcją statyczną klasy i właśnie to wyświetla zawartość w metaboksie. Używa przede wszystkim podstawowej funkcji WordPresswp_dropdown_pages()
do wyświetlania listy pól promocyjnych (pamiętaj, że wyświetla inne typy postów oprócz „strony”, ale tylko wtedy, gdy są oznaczone jako będące'hierarchical'=>true
w rejestracji typu postów. Dlaczego tylko hierarchiczne? Bo właśnie w ten sposób napisałem to, dlatego! :)Ponieważ pokazujemy trzy (3) menu rozwijane, musimy nadać każdemu unikalny identyfikator w kodzie HTML (
"promo_box_{$i}"
), ale o tej samej nazwie w nawiasach kwadratowych ('promo_boxes[]'
), aby PHP zgromadził je w tablicy wewnątrz$_POST
zmiennej (do której WordPress ma dla nas dostęp; zobaczysz jak za chwilę) . I oczywiście musimy ustawić wybraną wartość ((empty($promo_boxes[$i]) ? 0 : $promo_boxes[$i])
), jeśli rzeczywiście jedna z wartości została wcześniej wybrana.Użyłem również funkcji rdzenia WordPress,
get_post_type_object()
aby pokazać, jak uzyskać etykiety z typu postu, a także funkcji rdzenia WordPress,get_post_meta()
aby pobrać tablicę identyfikatorów pól promocyjnych z niestandardowego klucza pola „_promo_boxes”, który pokażę, że masz aby zapisać następny (uwaga: użyłem poprzedzającego podkreślenia w nazwie,'_promo_boxes'
który powoduje, że WordPress ukrywa się przed standardowym interfejsem użytkownika niestandardowego pola, gdy użytkownik edytuje post.) .Ostatnią funkcją, którą należy opisać, zanim zobaczysz kod, jest to, że
filter_wp_insert_post_data()
odbiera istniejące dane postu w pierwszym parametrze ($data
) i zawartość$_POST
tablicy dzięki WordPressowi jako drugiemu parametrowi ($postarr
). Wewnątrz tej funkcji wywołujemy funkcję podstawową WordPressupdate_post_meta()
i wyodrębniamy tablicę pól promocyjnych ($postarr['promo_boxes']
), aby zapisać niestandardową wartość pola dla klucza'_promo_boxes'
dla wpisu określonego przez$_POST
tablicę (tj$postarr['ID']
.).To powiedziawszy, oto kod dla
LittlePromoBoxes
klasy:Są jeszcze dwie (2) funkcje statyczne, o których jeszcze nie wspomniano:
get_promo_boxes()
orazget_promo_box()
; są to funkcje pomocnicze, które pomogą ci odzyskać postypost_type='promo-box'
według ich numerów porządkowych 1..3. Ale aby uczynić je bardziej WordPress, tak jak tutaj, są dwie funkcje otoki do dodania dofunctions.php
pliku motywu (pamiętaj, że możesz przekazać post jako parametr, ale nie musisz tego robić, chyba że używasz innego posta niż ten w Loop ) :Teraz możesz wywołać jedną lub obie te funkcje w
single.php
pliku motywu za pomocą kodu, który może wyglądać następująco (ten kod mógł zostać napisany w pętli, ale większość funkcji WordPress lubi powielać kod, aby mogli go odczytać zamiast eliminować nadmiarowość Tak więc, kiedy jesteś w Rzymie ...):źródło