Jak zarządzać połączeniami ajax i JSON w wordpress

13

Mam niestandardowy typ postu, do którego chcę uzyskać dostęp za pośrednictwem jQuery - najlepiej za pomocą JSON.

Najpierw najważniejsze. utworzenie funkcji zwracającej / echos json jest dość łatwe, ale jak mam uzyskać do niej dostęp za pomocą jquery.

jak pisze Mike w tym pytaniu , on - o ile rozumiem - umieszcza je w katalogu głównym wordpress. co uczyniłoby go dostępnym przy użyciu nazwy pliku php - ale czy jest to godne polecenia? Wolę umieścić go w folderze wtyczek.

Próbowałem odczytać kodeks wordpress, ale sposób, w jaki obsługiwane są wywołania ajax, tylko mnie dezorientuje, ponieważ publikujesz każde wywołanie ajax do admin-ajax.php, nawet jeśli nie jest to strona administratora?

Czy ktoś może rozwiązać problemy, które mam?

/Burza

edytować

Problem, jaki miałem, polegał na zrozumieniu, w jaki sposób należy wywoływać ajax w Wordpress, a także gdzie umieścić kod php i js, aby wykonać / obsłużyć wywołania.

W drugim pytaniu, z którym się łączyłem, utworzyłeś funkcję umieszczającą plik w katalogu głównym wp - nie chcę tego robić. Ale nauczyłem się teraz, jak korzystać z wp_ajax_ (nopriv _) [akcja] i mogę skutecznie uzyskiwać dostęp do stworzonego przeze mnie json. Pozostaje problem: gdzie należy umieścić JS, aby wykonać połączenie. Chcę umieścić go w pliku js wtyczek, ale ponieważ ma to być prezentowane na stronie, a nie na stronie administratora, ajaxurl nie jest zdefiniowany, więc muszę echo za pomocą php.

echo admin_url('admin-ajax.php');

Powstaje więc pytanie, jak powinienem połączyć ten php z javascript i jak mam go kolejkować, ponieważ nie jest to plik ani skrypt.

Burza
źródło
Chciałbym edytować tytuł pytania, aby nadać mu bardziej opisowy tytuł, ale po przeczytaniu nadal nie jestem w 100% pewien, jakie jest twoje pytanie. Czy po prostu pytasz, jak uzyskać dostęp do kanału JSON niezwiązanego z niestandardowymi typami postów (czy CPT nie jest tak naprawdę importowany do twojego pytania?) I czy ważne jest, aby nie znajdował się w katalogu głównym? Czy dotyczy to funkcji administratora? Może pomogłoby to, gdybyś wyjaśnił, co tak naprawdę próbujesz osiągnąć z perspektywy użytkownika końcowego, oprócz technicznego podejścia, z którym się zmagasz?
MikeSchinkel,
Tak, mogę powiedzieć, że tytuł nie jest najbardziej opisowy. Po prostu coś tam umieściłem, bo na początku napisałem jeszcze gorszy. Edytowany post z większą ilością informacji.
Storm
Niestandardowy typ postu, który właśnie wprowadziłem, ponieważ wtyczka json-api, która wydaje się popularna, w rzeczywistości nie obejmuje niestandardowych typów postów.
Storm

Odpowiedzi:

17

Ajax Handler

To trochę mylące, że moduł obsługi Ajax znajduje się w wp-admin/katalogu, ale tak, możesz i powinieneś używać go również do żądań innych niż admin. Następnie zarejestrujesz moduł obsługi dla wp_ajax_nopriv_[action]haka zamiast normalnego wp_ajax_[action]. W takim przypadku wystarczy postępować zgodnie z pierwszymi wierszamiadmin-ajax.php , ponieważ żądanie wykonane przez niezalogowanego użytkownika opuści stronę około linii 50.

Więc przypisać funkcję na haku wp_ajax_nopriv_get_custom_post_data, a zostanie on nazywany jeśli poprosić admin-ajax.phpo actionzestaw parametrów get_custom_post_data. Pamiętaj, aby zadzwonić die()na końcu przewodnika, w przeciwnym razie die(-1)zostanie przywrócone ustawienie domyślne . Zarejestruj także zalogowaną wersję wp_ajax_get_custom_post_data(do tej samej funkcji obsługi, nie ma problemu), ponieważ jeśli jesteś zalogowany na swojej stronie, nie uderzysz w noprivhak.

Konfiguracja po stronie serwera do Javascript

Sztuką jest wysyłanie danych konfiguracyjnych po stronie serwera (takich jak admin-ajax.phpadres URL) wp_localize_script(). Przekazujesz mu tablicę kluczy i wartości, które znajdą się na górze strony. Prawdopodobnie został on pierwotnie stworzony tylko dla ciągów lokalizowalnych, ale można go również użyć do przekazania danych konfiguracyjnych.

wp_localize_script('storm_json_config', 'storm_config', array(
    'ajaxurl' => admin_url('admin-ajax.php'),
));

storm_json_configto nazwa uchwytu (jeśli chcesz ją później usunąć z kolejki), storm_configto nazwa obiektu JavaScript, który będzie zawierał twoje dane. Twój statyczny plik JavaScript może zawierać wiersz podobny do tego jQuery.post(storm_config.ajaxurl, ...).

Zobacz także odpowiedź Bueltge na podobne pytanie .

Statyczny Javascript z wtyczki reż

Aby załadować statyczny plik JavaScript z własnego katalogu wtyczek, użyj wp_enqueue_script(). To by wyglądało mniej więcej tak:

wp_enqueue_script('storm_json', plugin_dir_url(__FILE__) . 'js/json.js', array('jquery'), '20101105');

Gdzie storm_jsonznowu jest nazwa uchwytu, wtedy podajesz link do pliku, następnie zależności (mogą być null), a następnie numer wersji, który zostanie dodany po żądaniu pobicia pamięci podręcznej przeglądarki przy aktualizacjach.

Jan Fabry
źródło
świetna odpowiedź. Zastanawiałem się nad tym i wydaje mi się, że to zadziałało. Teraz mogę uzyskać dostęp do /wp-admin/admin-ajax.php?action=[action] i uzyskać wynik JSON. Mój problem polega teraz na tym, gdzie umieścić JS, aby wykonać wywołanie ajax. Ponieważ muszę umieścić echo admin_url ('admin-ajax.php'); jako adres URL, nie mogę umieścić go w pliku js wtyczek. Jak więc mógłbym przystąpić do kolejkowania? Nie chcę po prostu wydrukować skryptu na środku strony.
Storm
@Storm: Rozszerzyłem swoją odpowiedź, za pomocą wp_localize_script()której możesz wysyłać dane konfiguracyjne ze strony serwera do przeglądarki. (Mała wskazówka: jeśli dodasz @do nazwy użytkownika, osoba ta otrzyma powiadomienie o Twojej odpowiedzi. @Mike: I updated the titleUpewnij się, że zobaczy Twój komentarz)
Jan Fabry,
Wielkie dzięki, styczeń. Myślę, że teraz rozumiem cały pakiet. Będę musiał trochę się tym zająć, aby w pełni to zrozumieć, ale bardzo mi pomogłeś! Odpowiedź zaakceptowana =) dzięki dzięki za notatkę @. Ale kiedy komentuję twoją odpowiedź, nadal będziesz otrzymywać ostrzeżenie, prawda?
Storm
@Storm: Tak, alert trafia do autora pytania lub odpowiedzi, którą komentujesz, a dodatkowo może zostać skierowany do innego uczestnika, o którym wspomniałeś w komentarzu @. Dostałem więc twoje powiadomienie „za darmo”, ale nie dostałbyś takiego dla tej wiadomości, gdybym Cię nie uwzględnił. Pełne wyjaśnienie znajduje się na ogólnej meta stronie sieci Stack Exchange.
Jan Fabry,