Как управлять вызовами ajax и JSON в WordPress

13

У меня есть пользовательский тип сообщения, к которому я хочу получить доступ через jQuery - предпочтительно с использованием JSON.

Итак обо всем по порядку. Создать функцию, которая возвращает / echos json, довольно легко, но как бы я получил к ней доступ через jquery.

как пишет в этом вопросе Майк , он, насколько я понимаю, помещает его в корень WordPress. что сделало бы его доступным с помощью имени файла php - но рекомендуется ли это? Я бы предпочел положить его в папку плагинов.

Я пытался прочитать кодекс WordPress, но способ обработки вызовов ajax просто смущает меня, поскольку вы публикуете каждый вызов ajax в admin-ajax.php, даже если это не страница администратора?

Может кто-нибудь, пожалуйста, исправьте мои проблемы?

/Гроза

редактировать

У меня была проблема с пониманием того, как должны выполняться вызовы ajax в WordPress, а также с тем, где разместить код php и js для выполнения / обработки вызовов.

В другом вопросе, на который я ссылался, вы создали функцию, помещающую файл в корень wp - я не хочу этого делать. Но теперь я научился использовать wp_ajax_ (nopriv_) [action] и могу эффективно получить доступ к json, который я создаю. Проблема остается в том, где я должен разместить JS, чтобы сделать звонок. Я хочу поместить его в js-файл плагинов, но так как это должно быть представлено на странице, а не на сайте администратора, ajaxurl не определен, поэтому я должен повторить, используя php.

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

Таким образом, возникает вопрос, как мне объединить этот php с javascript и как мне затем поставить его в очередь, видя, что это не файл или скрипт.

Гроза
источник
Я хотел бы отредактировать заголовок вашего вопроса, чтобы дать более описательный заголовок, но после прочтения я все еще не уверен на 100%, какой у вас вопрос. Вы просто спрашиваете, как получить доступ к каналу JSON, не связанному с пользовательскими типами записей (разве CPT на самом деле не импортирует ваш вопрос?) И важно ли, чтобы он не был в корне? Это для функциональности администратора? Может быть, это поможет, если вы объясните, что вы на самом деле пытаетесь достичь с точки зрения конечного пользователя, в дополнение к техническому подходу, с которым вы боретесь?
MikeSchinkel
Да, я могу согласиться, что название не самое описательное когда-либо. Я просто что-то положил туда, потому что сначала я написал еще хуже. Отредактированный пост с дополнительной информацией.
Шторм
Пользовательский тип записи, который я только что вставил, потому что плагин json-api, который кажется популярным, на самом деле не охватывает пользовательские типы записей.
Шторм

Ответы:

17

Ajax Handler

Это действительно немного сбивает с толку, что обработчик Ajax находится в wp-admin/каталоге, но да, вы можете и должны использовать его также для запросов без прав администратора. Затем вы регистрируете обработчик для wp_ajax_nopriv_[action]ловушки вместо обычного wp_ajax_[action]. В этом случае вам нужно только следовать первым строкамadmin-ajax.php , поскольку запрос, выполненный пользователем, который не вошел в систему, уже покинет страницу около строки 50.

Поэтому зарегистрируйте функцию для ловушки wp_ajax_nopriv_get_custom_post_data, и она будет вызвана, если вы запросите admin-ajax.phpс actionпараметром, установленным в get_custom_post_data. Обязательно позвоните die()в конце вашего обработчика самостоятельно, в противном случае die(-1)будет возвращено значение по умолчанию . А также зарегистрируйте зарегистрированную версию wp_ajax_get_custom_post_data(с той же функцией-обработчиком, без проблем), поскольку, если вы вошли на свой сайт, вы не попадете на noprivкрючок.

Конфигурация на стороне сервера для Javascript

Хитрость в отправке данных конфигурации на стороне сервера (например, admin-ajax.phpURL) wp_localize_script(). Вы передаете ему массив ключей и значений, которые будут включены в верхнюю часть страницы. Вероятно, изначально он был создан только для локализуемых строк, но вы также можете использовать его для передачи данных конфигурации.

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

storm_json_configэто имя дескриптора (если вы хотите удалить его из очереди позже), storm_configэто имя объекта Javascript, который будет содержать ваши данные. Таким образом, ваш статический файл Javascript может содержать строку вроде jQuery.post(storm_config.ajaxurl, ...).

Смотрите также ответ Бюльтге на аналогичный вопрос .

Статический Javascript из плагина dir

Чтобы загрузить статический файл Javascript из собственного каталога плагинов, вы используете wp_enqueue_script(). Это будет выглядеть примерно так:

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

Где storm_jsonснова имя дескриптора, затем вы даете ссылку на файл, затем зависимости (могут быть null), а затем номер версии, который будет добавлен после запроса об обновлении кэша браузера.

Ян Фабри
источник
отличный ответ. Это было то, что мне было интересно, и я, кажется, заставил его работать. Теперь я могу получить доступ к /wp-admin/admin-ajax.php?action=[action] и получить результат json. Моя проблема сейчас в том, где поставить js для вызова ajax. Так как мне нужно поставить echo admin_url ('admin-ajax.php'); как URL, я не могу поместить его в JS-файл моих плагинов. Так как бы мне поставить это в очередь? Я не просто хочу напечатать сценарий в середине страницы.
Шторм
@Storm: я расширил свой ответ с помощью wp_localize_script(), который вы можете использовать для отправки данных конфигурации со стороны сервера в браузер. (Небольшой совет: если вы добавите @имя пользователя, этот человек получит уведомление о вашем ответе. Поэтому @Mike: I updated the titleубедитесь, что он видит ваш комментарий)
Ян Фабри
Спасибо большое Январь. Теперь я думаю, что понимаю весь пакет. Мне придется немного повозиться со всем этим, чтобы понять это полностью, но вы мне очень помогли! Ответ принят =) Кстати спасибо за @ заметку. Но так как я сейчас комментирую ваш ответ, вы все равно получите предупреждение, верно?
Шторм
@Storm: Да, предупреждение отправляется автору вопроса или ответа, который вы комментируете, и дополнительно оно может перейти к другому участнику, которого вы упомянули в @ -комментарии. Поэтому я получил ваше уведомление "бесплатно", но вы не получили бы его за это сообщение, если бы я не включил вас. На основном мета-сайте сети Stack Exchange есть полное объяснение .
Ян Фабри