Mój prawdziwy problem jest nieco złożony, więc postaram się tutaj go streścić i uprościć.
Pracuję nad niestandardową aplikacją opartą na WordPress. Zarejestrowałem niestandardowy typ postu, nazwijmy go „osobami”, w których przechowuję informacje o ... osobach.
CPT obsługuje tylko domyślne pola tytułów postów i treści postów, ale są też metaboksy do przechowywania informacji o osobach (myślę, że moja aplikacja to książka adresowa).
Tak więc istnieje metaboks do przechowywania danych osobowych, jeden do przechowywania informacji w sieciach społecznościowych, inny do przechowywania informacji związanych z pracą, tj. Jeśli ta osoba jest dla mnie klientem, dostawcą, jeśli mamy kredyty lub obciążenia ...
Upraszczam tutaj, ale istnieje spójna liczba metaboksów, powiedzmy 12.
Mój problem polega na tym, że niektóre osoby, dla których chcę przechowywać informacje, są przypadkowymi kontaktami i chcę przechowywać tylko dane osobowe, inni są przyjaciółmi i chcę przechowywać dane osobowe i informacje z sieci społecznościowych, inni są klientami lub dostawcami, a ja chcesz przechowywać informacje związane z pracą.
Jeśli podczas edytowania postu chowam się (za pomocą menu opcji ekranu ) lub zamykam niepotrzebny metaboks, kiedy otwieram inny post, w którym go potrzebuję, muszę go pokazać lub ponownie otworzyć. Jest tak, ponieważ pozycja / status / kolejność metaboksów są zapisywane dla poszczególnych użytkowników jako metadane użytkownika .
Jeśli wyobrażasz sobie, że w niektórych postach potrzebuję 2 metaboksów, w niektórych 10 i 5, rozumiesz, że to denerwujące, ponieważ utrzymywanie ich wszystkich wyświetlanych / otwartych sprawia, że ekran edycji jest niski (pasek przewijania wydaje się nie mieć końca), a czasami informacje, których szukam, to na końcu strony po grupie metaboksów bez informacji ...
Pytanie:
Czy możliwe jest zapisywanie pozycji / statusu / zamówienia metaboksów dla poszczególnych postów?
PS: Wiem, że niektóre js / jQuery mogą rozwiązać problem, ale jeśli to możliwe, unikałbym javascript.
'get_user_option_*_post'
aby WP rozpoznał dane niestandardowe. Myślę tylko, że nie podoba mi się zbytnio korzystanie zwp_get_referer
tego na$_SERVER
var, co nie jest tak naprawdę niezawodne, ale myślę, że mam pomysł na rozwiązanie „głównego problemu”;)wp_get_referer()
metody, dlatego nazwałem to nie eleganckim rozwiązaniem PHP ;-) Najpierw pomyślałem o przechowywaniu bieżącego identyfikatora postu dla każdego użytkownika, ale to nie działa, jeśli użytkownik edytuje dwa lub więcej posty w przeglądarce. Czekamy na wiadomość na temat twojego „głównego problemu”. Ciesz się weekendem ;-)Jak zauważył birgire w swojej odpowiedzi , WordPress używa AJAX do aktualizacji statusu metaboksów, a dane przekazywane w żądaniu AJAX nie zawierają identyfikatora postu, co utrudnia aktualizację statusu skrzynek na post.
Po znalezieniu akcji AJAX używanej przez WordPress
'closed-postboxes'
szukałem tego ciągu w folderze admin js, aby dowiedzieć się, jak WordPress wysyła żądanie AJAX.Odkryłem, że dzieje się to
postbox.js
na linii nr 118 .Wygląda to tak:
Zasadniczo WordPress patrzy na elementy DOM z klasą „postbox” i klasą „zamkniętą” i tworzy listę identyfikatorów oddzieloną przecinkami. To samo dotyczy ukrytych elementów DOM z klasą „postbox”.
Tak więc, pomyślałem: mogę stworzyć fałszywy metaboks, który ma odpowiednie klasy i który jest ukryty, ustawiając jego identyfikator na identyfikator posta, i w ten sposób mogę go pobrać w żądaniu AJAX.
Oto co zrobiłem:
W ten sposób stworzyłem metaboks, który jest zawsze zamknięty i zawsze ukryty, więc WordPress wyśle swój identyfikator jako
$_POST
var w żądaniu AJAX, a gdy fałszywy identyfikator skrzynki będzie zawierał ID postu w przewidywalny sposób, będę w stanie rozpoznać post.Potem spojrzałem na to, jak WordPress wykonuje zadanie AJAX.
W
admin-ajax.php
linii 72 WordPress przechwytuje'wp_ajax_closed-postboxes'
z priorytetem 1.Tak więc, aby działać przed WordPress, mógłbym zaczepić tę samą akcję o priorytecie 0.
Zapisanie danych w meta postie umożliwiło filtrowanie
get_user_option_closedpostboxes_mycpt
iget_user_option_metaboxhidden_mycpt
(obie odmianyget_user_option_{$option}
filtra) wymuszenie opcji ładowania WordPress z meta postu:i
źródło