Pomoc w tworzeniu niestandardowego typu postu za pomocą pokazu slajdów za pomocą niestandardowych pól meta?

16

Muszę utworzyć niestandardowe pola meta (postów) dla mojego niestandardowego typu postu „Pokaz slajdów” (ten typ postu jest już utworzony). Każdy metabox przechowuje zawartość na każdym slajdzie slajdu i zapisuje go w odpowiednich polach niestandardowych. Każdy metaboks powinien zawierać następujące pola:

  • Tytuł (pole tekstowe)
  • Obraz (pole tekstowe dla adresu URL img lub najlepiej lista rozwijana pokazująca miniatury obrazów dołączonych do posta)
  • Kod do umieszczenia (obszar tekstowy)
  • Opis (wysiwyg)
  • Ukryj slajd (pole wyboru, aby tymczasowo ukryć slajd bez usuwania go)
  • Usuń slajd (przycisk, który usuwa zawartość pól meta wpisu, które zostały wypełnione przez ten slajd)

Chciałbym również gdzieś przycisk, który pozwala mi „dodać slajd”, więc po kliknięciu dodaje on kolejną niestandardową meta-box „Slajd”, który jest duplikatem pierwszego, ale dodaje przyrostową liczbę do każdego niestandardowego pola meta. Obecnie mam tylko 15 metaboksów, a szablon pokazu slajdów jest skonfigurowany w taki sposób, że jeśli tylko 5 metaboksów jest wypełnionych, wyświetlanych jest tylko 5 slajdów.

Na koniec chciałbym móc ponownie uporządkować slajdy, czy to za pomocą funkcji „Przeciągnij i upuść”, czy innego pola tekstowego, w którym mogę wpisać numer zamówienia.

Dostałem go prawie tam, gdzie go potrzebuję, dzięki wtyczce „More Fields” i pomocy kodu Rarst. Dzięki wtyczce „Więcej pól” w każdym metaboksie mam następujące pola:

  • Tytuł (pole tekstowe)
  • Obraz (lista rozwijana obrazów dołączonych do posta)
  • Kod do umieszczenia (obszar tekstowy)
  • Opis (wysiwyg)
  • Ukryj slajd (pole wyboru, aby tymczasowo ukryć slajd bez usuwania go)

Oto zrzut ekranu przedstawiający konfigurację za pomocą wtyczki „More Fields”:

alternatywny tekst

Problem polega na tym, że po utworzeniu nie ma możliwości usunięcia slajdu, ponieważ „Więcej pól” nigdzie nie jest używany <?php delete_post_meta($post_id, $key, $value); ?>. Innym problemem związanym z wtyczką jest to, że jest zbyt zawodna i często psuje się wraz z aktualizacjami.

Udało mi się wdrożyć podobne rozwiązanie z własnymi niestandardowymi metaboksami, które obejmują:

  • Tytuł (pole tekstowe)
  • Obraz (pole tekstowe dla img URL)
  • Kod do umieszczenia (obszar tekstowy)
  • Opis (obszar tekstowy)
  • Ukryj slajd (pole wyboru, aby tymczasowo ukryć slajd bez usuwania go)

Dzięki tej implementacji nie mogę uruchomić wielu pól TinyMCE ani pola rozwijanego obrazu. Kod TinyMCE wydaje się działać, dopóki nie dodać kod, który tworzy przyrostowe kopie pierwszej METABOX w którym momencie uzyskać to prawo błędu nad polem gdzie przyciski TinyMCE powinno być: Warning: array_push() [function.array-push]: First argument should be an array....

Ponadto teraz polegam na moich pisarzach, aby umieścili W KAŻDYM slajdzie wideo lub obraz dla każdego slajdu i jest w porządku, ale może lepiej mieć przycisk radiowy, który pozwala im wybrać, który slajd jest (prawdopodobnie domyślnie obraz), który jest powiązany z instrukcją wyświetlania warunkowego w szablonie pokazu slajdów.

Obsługuję przesyłanie zdjęć za pomocą wbudowanego pola „Featured Image” na pasku bocznym, chociaż nie miałbym nic przeciwko niestandardowemu metaboksowi, który po prostu powiedział „Upload Images” w górnej części panelu zapisu.

W końcu szukam pokazu podobnego do tego: http://www.nytimes.com/slideshow/2010/08/10/science/20100810angier-1.html . Chcę, aby mój mógł mieć również wideo jako treść na slajdzie zamiast obrazu. Potrzebuję intuicyjnego i łatwego w obsłudze panelu administracyjnego dla moich pisarzy (nie są oni zbytnio obeznani z technologią i nie są niezawodni przy użyciu html i / lub skrótów). Na wszelki wypadek nie widać z przykładu, każdy slajd powinien wygenerować nową odsłonę.

Zmiana kolejności Drag'n'Drop nie jest priorytetem, ale byłoby fajnie. Znalazłem wtyczkę, która radzi sobie z tym naprawdę dobrze: SlideDeck . Niestety wtyczka nie odpowiada moim potrzebom, ale sposób, w jaki radzą sobie z porządkowaniem slajdów, jest całkiem sprytny. Jest to oddzielny metaboks na pasku bocznym, który pozwala przeciągać slajdy w wybranej kolejności. W ten sposób dodajesz slajdy, klikając przycisk „Dodaj slajd”, który dodaje kolejny Metabox Slajdu do panelu zapisu. Oto zrzut ekranu:

alternatywny tekst

Możesz także zobaczyć więcej zrzutów ekranu z tego działania w repozytorium wordpress .

Oto cały mój kod:

Funkcje konfigurujące mój typ postu pokazu slajdów i paginację pokazu slajdów: http://loak.pastebin.com/g63Gf186

Oryginalny kod z DeluxeBloggingTips.com (DBT), na podstawie którego oparłem Metaboksy: http://loak.pastebin.com/u9YTQrxf

Wersja kodu DBT, którą zmodyfikowałem, aby udostępnić mi przyrostowe wersje tego samego metaboksu: http://loak.pastebin.com/WtxGdPrN

Zmodyfikowana wersja kodu DBT, którą Chris Burbridge utworzył, aby umożliwić wiele wystąpień TinyMCE: http://loak.pastebin.com/Mqb3pKhx Z tym kodem TinyMCE działają.

Moja modyfikacja kodu Burbridge, która próbuje włączyć moją inkrementację oraz pole, które pozwala wybrać obraz z rozwijanej listy wszystkich obrazów dołączonych do posta: http://loak.pastebin.com/xSuenJTK W tej próbie TinyMCE jest zepsuty i menu rozwijane nie działa.

Prawdopodobnie nie ma to znaczenia, ale na wypadek, gdybyś się zastanawiał, oto kod, którego używam, aby pobrać kod osadzania z niestandardowej meta postu, zmienić jego rozmiar i wstawić do posta: http://loak.pastebin.com / n7pAzEAw

To jest zredagowana wersja oryginalnego pytania odzwierciedlająca aktualny status projektu i odpowiadająca na pytania zamieszczone w komentarzach. Dzięki Chris_O za wystawienie nagrody za to. Dziękuję także Rarstowi i Justinowi za pomoc w tym zakresie na forum ThemeHybrid.com . Spędziłem nad tym wiele godzin i utknąłem (kilka godzin spędziłem sam na tym pytaniu). Każda pomoc byłaby bardzo mile widziana.

matowy
źródło
Czy możesz narysować prosty obraz, który pokazuje cały obraz, na przykład szkic? Myślę, że to pomaga lepiej zrozumieć twoje potrzeby.
hakre
Dodałem kilka przykładów na dole. Jeśli to nie rozwiąże problemu, daj mi znać.
mat
Czy nadal nie jest jasne?
mat
Ktoś? Czy to jest włączone?
mat
@Hakre, jesteś tam?
mat.

Odpowiedzi:

6

Wygląda na to, że najbezpieczniejszym zakładem i najłatwiejszą drogą byłoby rozwidlenie wtyczki More Fields specjalnie do użytku. Dwie największe cechy, które widzę, że potrzebują widelca, to „fabryka” pola i interfejs przeciągania i upuszczania.

Wiele pól

Moją sugestią byłoby przyjrzenie się klasie WordPress Widget i wykorzystanie jej jako modelu dla fabryki pól - w zasadzie pożycz możliwość tworzenia wielu instancji pola, gdy już stworzysz dla niego strukturę.

Jest to sedno działania wielu widżetów na pasku bocznym:

  • Kod dla każdego widgetu definiuje się raz, rozszerzając WP_Widgetklasę.
  • Następnie możesz utworzyć tyle kopii widżetu, ile chcesz
    • Specyfika każdego widgetu jest przechowywana jako dane szeregowane w tabeli opcji
  • Możesz dostosować każdy widżet, usunąć go prostym deletepoleceniem i jawnie ustawić jego położenie za pomocą interfejsu przeciągania i upuszczania Wygląd

Przeciągnij i upuść

Jeszcze raz proponuję poszukać inspiracji w systemie widżetów WordPress. Mamy już skonfigurowany dość intuicyjny interfejs „przeciągnij i upuść”, więc zmiana przeznaczenia tego samego kodu w innym miejscu byłaby dość łatwa. Lub, jeśli chcesz się naprawdę zachwycić, możesz wdrożyć własny system przeciągania i upuszczania w oddzielnym niestandardowym polu meta.

Tak więc każdy slajd byłby zdefiniowany przez niestandardowe pole meta połączone z postem. Kolejność slajdów będzie ustalana przez osobne niestandardowe pole meta, które również jest połączone z postem. Polecam przesyłanie aktualizacji slajdów za pośrednictwem AJAX, abyś mógł dynamicznie aktualizować meta-skrzynkę zamówienia slajdów na podstawie informacji (to zapobiega konieczności ręcznego naciśnięcia „aktualizacji” i oczekiwania na ponowne załadowanie strony przed przeniesieniem rzeczy).

Interfejs jQuery ma świetny „ przeciągalny ” interfejs, którym można łatwo manipulować dla swoich celów w tym niestandardowym polu meta. Najtrudniejszą częścią nie jest budowanie interfejsu, ale spójna, dokładna komunikacja między meta-boxem a kolekcją slajdów meta-boxów w innym miejscu na stronie.

W podsumowaniu

To, co zebrałem z twojego postu, to to, że masz nieco wykonalne rozwiązanie:

  • Dodano 15 niestandardowych pól do niestandardowego typu postu za pomocą widżetu Więcej pól, ale chcesz dynamicznie dodawać / usuwać pola zamiast pracować z ustawioną liczbą
  • Potrzebujesz sposobu na dostosowanie kolejności tych pól niestandardowych, aby slajdy ładowały się w kolejności

Podchodzę do tego, abstrahując proces tworzenia niestandardowych meta do klasy, której mogę używać wielokrotnie do tworzenia nowych niestandardowych pól meta. Następnie rozszerzyłbym klasę, aby zainicjować dwa typy meta-boxów: jeden dla slajdów, drugi dla struktury slajdów. Chciałbym również wbudować w meta-box struktury slajdów możliwość dynamicznego tworzenia nowych meta-boxów slajdów (meta-boxy slajdów zawierałyby własne działanie „usuń”).

Cały pokaz będzie nie są przechowywane przez polach meta zjeżdżalnia, ale przez okna meta struktury suwak w polu niestandardowych meta na stanowisko - zwyczaj meta byłoby postrzępione tablicą, z każdego z preparatów w postaci tablic w nim - w zamówienie . Dostosowanie kolejności pokazu slajdów w polu meta struktury spowoduje reorganizację tablicy i ponowne zapisanie meta postu. W ten sposób mam tylko 1 wartość meta do odczytania, gdy chcę uzyskać dostęp do pokazu slajdów.

Pomiędzy SlideDeck, More Fields i niestandardowym kodem, który do tej pory stworzyłeś, masz już pod ręką większość swojego rozwiązania ... wystarczy, że wszystko będzie działało jednocześnie. Przed dodaniem ozdobników JavaScript skupię się najpierw na wdrożeniu root-a - dynamiczne tworzenie, modyfikowanie, zapisywanie i usuwanie slajdów jest ważniejsze niż edytor tekstowy IMO. Najpierw załatw to. Następnie wyłącz system zamawiania. Następnie możesz skupić się na uzyskaniu wielu wystąpień TinyMCE działających na stronie.

EAMann
źródło
Dzięki za pomoc! W tej chwili jest to trochę poza moim zestawem umiejętności, ale będzie dobrym przewodnikiem po procesie uczenia się. Zdaję sobie sprawę z „klas” i zdaję sobie sprawę, że już korzystam z klasy w kodzie metaboksów, ale nadal ich nie rozumiem. Kolejną rzeczą, której jestem „świadomy”, ale nie do końca rozumiem, jest użycie tablic.
mat
Twoja rada, jak najpierw upuścić podstawy, ma sens, ale mam do czynienia z pewnymi ograniczeniami w świecie rzeczywistym, które wymagają ode mnie jak najszybszego wejścia w środowisko produkcyjne, a jednym z najważniejszych czynników jest edytor wysiwyg, ponieważ wielu autorów jest bardzo nietechnicznych . Nie mam nic przeciwko temu, aby projekt był przyrostowy i polegał na kulach po drodze, ale to podejście oczywiście musi być skalowalne. To powiedziawszy, wydaje mi się, że użycie wtyczki „więcej pól” może służyć jako rozwiązanie tymczasowe, dopóki tego nie rozwiążę, jednak nie jestem pewien, czy to zadziała z ...
matt
Twoje podejście do zapisywania całego pokazu slajdów w jednym niestandardowym polu. Czy naprawdę uważasz, że lepsze to wszystko? Może to zabrzmieć ignorancko, ale wydaje mi się, że jest dużo więcej miejsca na błędy, jeśli wp musi przepisać cały pokaz slajdów za każdym razem, gdy wprowadzona zostanie niewielka zmiana.
mat
Zapisanie całego programu w jednym polu meta zapobiega i wprowadza problemy: Oszczędza czas w witrynie prezentacji, nie zmuszając Cię do wybierania, czytania i zapętlania wielu pól. Jeśli jednak coś psuje się w jednym slajdzie i zostaje zapisane do DB, psuje cały pokaz slajdów. Zdecydowanie kompromis, ale zawsze wybieram szybkość i łatwość rozwoju.
EAMann
Czy mówisz, że oszczędza czas na froncie witryny? Dlaczego miałoby tak być, jeśli pokazuje tylko jeden slajd naraz?
mat