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.


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.


ś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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.