Chciałbym programowo dodać widżety do moich dwóch pasków bocznych, które mam. Nie mogłem znaleźć żadnego oficjalnego sposobu na zrobienie tego?
Zacząłem szukać w bazie danych. Odkryłem, że jest to opcja „sidebars_widgets”, która umieszcza widżety na paskach bocznych. Gdy patrzymy na opcje, nazwy widżetów mają na końcu dodany numer, taki jak: nazwa_widgetu-6. Skąd ta liczba?
Masz pomysł, jak to naprawić?
Odpowiedzi:
Kiedy zacząłem tę odpowiedź, powinna to być tylko mała uwaga. Cóż, nie udało mi się. Przepraszam! Zostań ze mną, w głębi jest ukryty skarb…
Jak są przechowywane widżety WordPress
Lista widżetów jest przechowywana w opcji o nazwie
'sidebars_widgets'
. Avar_export()
może dać coś takiego:Ignoruj
'wp_inactive_widgets'
i'array_version'
. Nie musimy się tym przejmować.Pozostałe klucze są identyfikatorem zarejestrowanych pasków bocznych. W takim przypadku paski boczne mogły zostać zarejestrowane za pomocą tego kodu:
Domyślnie paski boczne są puste po rejestracji. Oczywiście.
Dla każdej zarejestrowanej klasy widżetu tworzona jest osobna opcja, zawierająca wszystkie niezbędne opcje. Opcja jest poprzedzona ciągiem
widget_
. Aby uzyskać opcje dla wszystkich aktywnych widżetów RSS, musimy przyjrzeć się…Możliwe wyjście:
Zwróć uwagę na liczbę 2 . Wszystkie argumenty dla wielu instancji są przechowywane w tej jednej opcji posortowanej według liczb.
Aby zobaczyć, które klasy widżetów są już znane WordPressowi, przejdź do
wp-admin/options.php
i przewiń w dół, aż zobaczysz coś takiego:Tak, dane serializowane. Nie, nie możesz ich tutaj przeczytać. Nie martw się, nie musisz.
Widżet demonstracyjny
Aby lepiej zilustrować wewnętrzne funkcjonowanie, napisałem bardzo prosty widżet demonstracyjny:
Uwaga konstruktor:
't5_demo_widget'
jest$id_base
identyfikatorem tego widgetu. Jak widać na zrzucie ekranu, jego argumenty są przechowywane w opcjiwidget_t5_demo_widget
. Wszystkie niestandardowe widżety będą traktowane w ten sposób. Nie musisz zgadywać nazwy. A skoro masz napisane swoje widżety (prawdopodobnie) znasz wszystkie argumenty ze swoimi klasa$instance
parametrów.Podstawy motywu
Najpierw musisz zarejestrować niektóre paski boczne i niestandardowy widget. Prawidłowe działanie tego jest łatwy do zapamiętania:
'widgets_init'
. Umieść wszystko w pojemniku - klasa lub funkcja. Dla uproszczenia użyję funkcji o nazwiet5_default_widget_demo()
.Cały poniższy kod przechodzi do
functions.php
. KlasaT5_Demo_Widget
powinna być już załadowana. Po prostu umieściłem go w tym samym pliku…Do tej pory takie proste. Nasz motyw jest teraz gotowy na widżet, widżet demo jest znany. Teraz zabawa.
Naprawdę nie chcesz niszczyć ustawień użytkownika. Jeśli na paskach bocznych jest już trochę treści, twój kod nie powinien na niej działać. Dlatego zatrzymujemy się w tym przypadku.
Okej, zakładając, że paski boczne są puste… potrzebujemy licznika:
Widżety są ponumerowane . Te liczby są drugim identyfikatorem WordPress.
Niech tablica to zmieni:
Potrzebujemy też licznika (więcej na ten temat później):
A oto jak używamy licznika, nazw paska bocznego i argumentów widgetu (cóż, mamy tylko jeden argument:)
text
.Zwróć uwagę, jak tworzony jest identyfikator widżetu:
id_base
minus,-
licznik. Zawartość widget jest przechowywany w innej zmiennej$demo_widget_content
. Oto licznik, w którym klucz i argumenty widgetu są przechowywane w tablicy.Zwiększamy licznik o jeden, gdy skończymy, aby uniknąć kolizji.
To było łatwe. Teraz widżet RSS. Więcej pól, więcej zabawy!
Oto coś nowego:
update_option()
spowoduje to zapisanie argumentu widgetu RSS w osobnej opcji. WordPress znajdzie je automatycznie później.Nie zapisaliśmy argumentów widżetu demonstracyjnego, ponieważ teraz dodajemy drugą instancję do naszego drugiego paska bocznego…
… I zachowaj wszystkie argumenty za
t5_demo_widget
jednym razem. Nie trzeba dwa razy aktualizować tej samej opcji.Cóż, wystarczy widżetów na dziś, zapiszmy
sidebars_widgets
też:Teraz WordPress będzie wiedział, że istnieją zarejestrowane widżety i gdzie przechowywane są argumenty dla każdego widżetu. A
var_export()
na pasku bocznym będzie wyglądać następująco:Kompletny kod ponownie:
Jeśli przejdziesz do
wp-admin/widgets.php
teraz, zobaczysz trzy wstępnie ustawione widżety:I to wszystko. Posługiwać się …
… Aby wydrukować widżety.
Istnieje niewielka usterka: w celu wstępnej rejestracji musisz dwa razy załadować interfejs. Jeśli ktoś może tu pomóc, będę bardzo wdzięczny.
źródło
widget_t5_demo_widget
dotyczy tutajupdate_option( 'widget_t5_demo_widget', $demo_widget_content );
:?Dziękujemy za udostępnienie rozwiązania. Użyłem tego, co zostało opisane w tym pytaniu, aby utworzyć fragment kodu, którego można użyć do bardzo łatwej inicjalizacji pasków bocznych. Jest bardzo elastyczny, możesz utworzyć tyle widżetów, ile chcesz, bez konieczności modyfikacji kodu. Wystarczy skorzystać z haków filtru i przekazać argumenty w tablicy. Oto skomentowany kod:
To jest funkcja pomocnicza, która sprawdza, czy pasek boczny zawiera już zawartość:
Teraz musimy utworzyć funkcję, która jest podpięta do akcji „sidebar_init”.
A teraz inicjalizacja widgetu:
Ostatnią czynnością jest utworzenie widgetów na każdym pasku bocznym:
Ta funkcja służy do śledzenia, ile wystąpień określonego widżetu zostało już zdefiniowanych:
Ostatnią rzeczą, którą musimy zrobić, to faktycznie przypisać wartości. Skorzystaj z tych funkcji filtrów:
I:
Idealnie byłoby wywołać initialize_sidebars w funkcji konfiguracji, która jest wywoływana po aktywacji wtyczki lub motywu w następujący sposób: Aktywacja motywu:
Aktywacja wtyczki:
Podsumowując użycie tego konglomeratu funkcji:
utwórz funkcję, która inicjuje paski boczne, które są podłączone do filtra „alter_initialization_sidebars”.
utwórz funkcję dla każdego właśnie dodanego paska bocznego, który jest podłączony do filtra „alter_initialization_widgets_ $ sidebarname”. Zamień $ sidebarname na nazwę każdego paska bocznego utworzonego w kroku 1.
Możesz również po prostu skopiować ten niezakomentowany kod do pliku funkcji i od razu rozpocząć tworzenie funkcji filtrowania: Kod na pastie (bez funkcji filtra inicjującego)
źródło
Przede wszystkim dziękuję @toscho za szczegółową odpowiedź.
To prosty przykład dla tych, którzy szukają prostego rozwiązania i domyślnych opcji widgetu:
Uwaga 1: Możesz przejść
sidebar-id
do menu widżetów i sprawdzić pożądany pasek boczny. Pierwszy<div id="widgets-holder-wrap">
„s<div>
dziecko masidebar-id
.Uwaga 2: Możesz przejść
widget_name
do menu widżetów i sprawdzić żądany widżet. Zobaczysz coś takiego<div id="widget-6_widget_name-__i__" class="widget ui-draggable">
.Chciałbym, żeby to pomogło.
źródło
Tak to się robi:
(OSTRZEŻENIE, to może USUNĄĆ wszystkie poprzednie widżety, jeśli nie włożysz oryginalnych widgetów do
widgets
tablicy).-Numer może być użyty, jeśli później chcesz dodać opcje do widżetu za pomocą czegoś takiego:
źródło
$widgets = get_option( 'sidebars_widgets' );