Есть ли JavaScript API? Как получить доступ к публичным и частным данным в JS?

8

Согласно этому посту нет встроенного JavaScript API для Wordpress. Поэтому разработчики, которые хотят использовать AJAX, похоже, все придумали собственное решение, которое мне не кажется правильным.

Что мне действительно не хватает, кроме выборки постов или любых данных со встроенным API, так это небольшой набор функций JavaScript для работы с внутренним и внешним интерфейсом. Теперь что-нибудь запланировано относительно этой проблемы?

Например, я хотел бы знать, что

  • левое главное меню свернуто,
  • какой пользователь залогинен
  • к какой группе он относится,
  • даже данные клиента, такие как браузер

и так далее.

stackoverclan
источник
1
Только один запрос, это не ваш первый пост, пожалуйста, используйте разрывы строк и абзацы. Сделайте свои сообщения более читабельными для других. Написание всего в одном большом параграфе немного для многих, и вы склонны терять таким образом читателей и возможных помощников. Спасибо
Питер Гусен
спасибо, простите, немного поторопился, больше не повторится!
stackoverclan
2
Для тех, кто голосовал, чтобы закрыть это как основанное на мнении : Пожалуйста, прочитайте вопрос, прежде чем голосовать.
fuxia
1
Нет проблем. Это всего лишь совет, который поможет вам в будущем. Это факт, что хорошо написанные четкие вопросы получают хорошие ответы :-). К счастью, я не голосовал, на этот раз я невиновен, лол :-)
Питер Гусен
Существует github.com/Automattic/wpcom.js
xamiro

Ответы:

6

TL; DR

В ядре WordPress нет JavaScript API, и никто не планирует, но на самом деле в этом нет необходимости.

Backend

Прежде всего, скажем, что в отношении бэкэнда некоторая полезная информация может быть получена из уже существующих глобальных переменных JavaScript (WordPress любит все глобальные разновидности).

Например

  • ajaxurlдля admin-ajax.phpURL, который будет использоваться в вызовах ajax
  • pagenow для текущей страницы администрирования, например, «панель инструментов»
  • adminpage для текущего файла страницы администратора, например, «index-php» (точки заменяются на дефисы)
  • typenowдля текущего типа сообщения в то время как edit.php, post.phpилиpost-new.php
  • userSettings может использоваться для получения информации о текущем зарегистрированном пользователе

Эта информация дает вам некоторый «контекст» состояния приложения, пока вы находитесь в бэкэнде.

Для других вещей, упомянутых в этом вопросе, вам не нужен никакой «API», потому что очень простые функции jQuery могут сделать свое дело. Например, чтобы узнать, закрыто ли меню администратора, вы можете проверить наличие «свернутого» класса в теле:

if ( $(body).hasClass('folded') ) {
  alert( 'Admin left menu is closed!' );
} else {
  alert( 'Admin left menu is open!' );
}

Отсутствие документации

Для таких вещей, как предыдущие фрагменты, создавать функции не стоит. WP уже имеет слишком много функций в PHP. Я действительно надеюсь, что такие дополнительные функции не будут добавлены в ядро.

Что действительно нужно JavaScript в WordPress, так это больше документации для существующих функций: ни одна из вещей, которые я написал выше, не документирована ни в каких официальных документах, таких как Кодекс или в исходных файлах.

Внешний интерфейс?

Пока здесь я только говорил о бэкэнде.

Это потому, что почти все, что происходит на веб-интерфейсе, связано с используемой в данный момент темой. Давайте представим, что WordPress предоставляет файл JavaScript, содержащий функции для получения информации о текущем состоянии приложения; если тема не ставит этот JS-файл в очередь, эти функции недоступны, и заставить тему ставить в очередь такой скрипт было бы абсолютно неправильно.

Нет необходимости в (другом) API

Тем не менее, в WordPress любая информация, которую вы можете получить через PHP, может быть легко использована и в JavaScript без каких-либо запросов AJAX. Функция, которая делает это возможным, есть wp_localize_script().

Предположим, что вы хотите получить текущего пользователя и пользовательские данные, такие как его роль в вашем JavaScript, и вы также хотите знать переменные запроса, используемые на текущей странице, вы можете сделать следующее:

$data = array(
  'user'       => wp_get_current_user(),
  'query_vars' => $GLOBALS['wp']->query_vars
);

wp_localize_script( 'myscript', 'MyScriptData', $data );

При этом в вашем сценарии MyScriptData.userпеременная будет объектом JavaScript, где все пользователи будут получать информацию обо всех переменных запроса.

Это справедливо для скриптов бэкэнда и фронтэнда (другими словами: для обеих «сторон»). Нет необходимости в каком-либо дополнительном JavaScript API для получения этой информации. PHP достаточно, если вы используете правильные способы передачи информации из PHP в JS.

Backbone.js

Backbone.js - это инфраструктура JavaScript, которая позволяет (своего рода) шаблон разработки MVC с использованием JavaScript. Он был включен в ядро ​​с WP 3.5 - главным образом для обработки медиа галереи.

Эта библиотека не является API-интерфейсом WordPress JavaScript, потому что, безусловно, она позволяет более мощную разработку JavaScript, но в эту библиотеку не было добавлено ни одной специфичной для WordPress функции, и это единственное в настоящее время основное использование Backbone.js. Библиотека мультимедиа более или менее недокументирована и не имеет публичного API. И AFAIK не планируется заполнять этот пробел. (Более чем рад изменить / удалить это утверждение - если кто-то может доказать, что я не прав).

WP-API

Как указывают Rarst и Brian Fegter , WP API станет частью ядра (вероятно, начиная с WP 4.1).

Но я должен сказать, что это не API JavaScript. Он просто позволяет подключить HTTP-запрос к конечной точке приложения, которая контролируется WP-API. И API получает данные из базы данных и возвращает их в формате JSON. Пример из документов:

Хотите получать сообщения своего сайта? Просто отправьте GETзапрос на /wp-json/posts. Обновить пользователя с ID 4? Отправить POSTзапрос на /wp-json/users/4. Получить все сообщения с поисковым термином «круто»? GET /wp-json/posts?filter[s]=awesome,

Поскольку запросы HTTP и связанные с ними ответы JSON могут обрабатываться на любом языке, который поддерживает запросы HTTP и формат данных JSON (включая PHP, Ruby, Python, ASP и т. Д.), Основная цель WP API состоит в том, чтобы позволить получать и устанавливать данные WordPress. из не-WP приложений. Это означает, что внутри любого приложения , а не только WordPress.

Конечно, поскольку JavaScript - это язык, который может обрабатывать как HTTP-запросы, так и формат JSON, вы также можете использовать WP-API из JavaScript WordPress. Кто-то также работает над клиентом WP js для этого API, но

  • Используя wp_enqueue_script()+ функции Ajax API + WordPress PHP, можно получить всю необходимую информацию без каких-либо дополнительных API. А поскольку все три «ингредиента» являются стандартами, установленными WP, их использование не является «собственным решением». Он просто использует стандартные решения для выполнения пользовательских (и общих) задач, что и является целью разработки плагинов.

  • даже можно использовать JavaScript для использования WP API. То, что WP-API возвращает JSON, не делает его API-интерфейсом JavaScript. Функция JavaScript не задействована (отправляется HTTP-запрос и возвращается JSON-репозиторий. Практически так же, как и при использовании AJAX API). В противном случае любой сервис, который возвращает JSON, должен рассматриваться как API WordPress JS. WP-API следует рассматривать как API внешнего сервиса, который возвращает JSON, и может случиться так, что сайт, который использует этот сервис JSON, является тем же, который его предоставляет.

  • с WP API нельзя сделать ни единой вещи, которую нельзя сделать с помощью API AJAX. Но есть много вещей, которые можно сделать с помощью AJAX API. но не с WP-API.

Замечание о WP-API + Backbone.js

С помощью Backbone.js можно получать и сохранять информацию в приложениях, поддерживающих HTTP-запросы RESTful .

Проблема в том, что WordPress, как в «обычных», так и в AJAX-запросах, почти полностью поддерживает RESTful: он поддерживает $_GETи $_POSTзапрашивает только по умолчанию, и использование одного или другого с одинаковым URl заканчивается ... тем же результатом ,

Напротив, WP API является RESTful, поэтому приложения на базе Backbone могут использовать его для мощных приложений JavaScript, но я бы не стал определять Backbone или WP API или Backbone + WP API в качестве API JavaScript для WordPress. над.

Gmazzap
источник
хорошо сделано! спасибо за подробный ответ; это дает мне много идей и указаний, несмотря на то, что я не согласен с некоторыми аспектами, такими как «нет необходимости». однако, это ответ!
stackoverclan
Как сказано в ответе, WP API + Backbone, даже если IMHO не может рассматриваться как JS API, может дать вам много возможностей для создания очень сложных приложений на основе js. В вики Backbone на GitHub есть набор расширенных приложений, использующих его . WP API может предоставить RESTful- интерфейс для данных WordPress, который необходим для использования всех возможностей Backbone. Также посмотрите на эти слайды о Backbone + WordPress. @ mc007
gmazzap
точка входа AJAX занимает слишком много времени, чтобы создать быстрое приложение. его на самом деле нет!
stackoverclan
1
@stackoverclan AJAX точка входа медленная, потому что она загружает всю среду WordPress. Но как и WP API, так что вы не получите никакой выгоды от этого. На счету, SHORTINITвы можете сделать AJAX намного быстрее. Сделать то же самое с WP API будет гораздо сложнее. Btp, вы как реальные мгновенное приложение? Совет: не используйте WordPress.
gmazzap
4

Вокруг JSON REST API произошла небольшая разработка, которая должна быть включена в выпуск 4.1 . Я считаю, что он официально будет называться «WP API». Вы можете начать использовать кодовую базу сейчас и быть в курсе последних событий здесь, пока не дойдете до ядра. Райан МакКью и команда конкретизированы некоторые довольно хорошую документацию здесь .

Брайан Фегтер
источник
3

Хотя исторически WP был ориентирован на серверы, в течение многих лет было сделано заявление о переходе на интенсивное использование JS. Имея в виду обязательства обратной совместимости, сомнительно, что JS достигнет паритета или перехватит PHP в ближайшее время (на мой взгляд), но в этом был достигнут некоторый прогресс.

Администратор WordPress теперь поставляется с Backbone и Underscore, которые были большой частью последней итерации медиа-библиотеки. К сожалению, особенности реализации критически недокументированы, и использование третьей стороной было относительно непопулярным.

Плагин REST API разрабатывается как «функциональный плагин» с официальным намерением быть включенным в ядро ​​WordPress в будущем.

Rarst
источник
офигенно, ссылка «плагин функций» очень помогает мне понять, что на самом деле происходит, обязательно нужно прочитать, прежде чем идти на охоту ;-)
stackoverclan
3

Чтобы ответить на ваше утверждение:

[...] нет встроенного Javascript API для Wordpress. Поэтому разработчики, которые хотят использовать Ajax, похоже, все придумали собственное решение, которое мне не кажется правильным.

Нет «собственного решения», которое нужно сделать. Вы можете упростить процесс, используя ATP сajax_template_part() помощью @GM или аналогичные плагины, и сократить путь, но все же нет нестандартного способа использования AJAX в WordPress. Эти «собственные решения» / способы (в основном) делают это неправильно . AJAX-вызовы (примерно) выполняются так:

  1. Зарегистрируйте обратный вызов AJAX на зависимом от контекста хуке (общедоступном или частном / зарегистрированном)
  2. Регистрация, постановка в очередь и локализация скрипта
  3. Используйте jQuery $.ajax() и подобные функции, чтобы реагировать на взаимодействие с пользователем. Работа с глобальным (локализованным) объектом JS для передачи данных обратно в обратный вызов PHP.
  4. Внутри PHP cb вы проверяете, фильтруете и дезинфицируете данные, проверяете одноразовые номера и источники ссылок, выполняете работу с базой данных и возвращаете данные в формате JSONified wp_send_json_success()и аналогичные функции.

Если плагин или тема не делают этого таким образом, то автор не читал вещи или не смотрел на примеры. Для этого есть скелет, который следует использовать.

Более подробную информацию о том, как работать с AJAX в WP, можно найти в книге сообщества "WordPressTheRightWay" .

Что мне действительно не хватает, кроме выборки постов или любых данных со встроенным API, так это небольшой набор функций Javascript для работы с внутренним и внешним интерфейсом. [...] Например, я хотел бы знать, что левое главное меню свернуто, или какой пользователь вошел в систему или в какую группу он входит, или даже данные клиента, такие как браузер и так далее.

WordPress просто не конкретен в том, что вам нужно делать с AJAX. Вот почему вы можете поместить практически все в локализованный / глобализированный массив и сделать его доступным для ваших вызовов AJAX. И это прекрасно согласуется с тем, как работает Backbone: вы должны делать то, что вам нравится, вы хотите делать это.

Если вы хотите использовать какой-то самоуверенный JavaScript MVC-фреймворк, например AngularJs, то вы не в том месте. Существуют и другие CMS, такие как OctoberCMS, Drupal8 и т. Д., Которые гораздо лучше предоставляют основу для этого. WordPress потребует от вас создания пользовательского набора переписанных конечных точек, где вы сможете возвращать наборы данных для ваших контроллеров JS.

кайзер
источник
привет, спасибо за более подробный ответ. Мне это нравится, потому что вы уже придумали некоторые рекомендации и лучшие практики.
stackoverclan