¿Hay una API de JavaScript? ¿Cómo acceder a datos públicos y privados en JS?

8

Según esta publicación, no hay una API JavaScript incorporada para Wordpress. Por lo tanto, los desarrolladores que quieren construir en AJAX parecen tener su propia solución que no me parece correcta.

Lo que realmente extraño, aparte de buscar publicaciones o cualquier dato con una API incorporada, es un pequeño conjunto de funciones de JavaScript para lidiar con la interfaz de back-end y front-end. Ahora, ¿hay algo planeado con respecto a este problema?

Por ejemplo, me encantaría saber que

  • el menú principal izquierdo está colapsado,
  • qué usuario ha iniciado sesión
  • de qué grupo es,
  • incluso datos del cliente como navegador

Etcétera.

stackoverclan
fuente
1
Solo una solicitud, esta no es su primera publicación, utilice saltos de línea y párrafos. Haga que sus publicaciones sean más legibles para los demás. Escribir todo en una gran paragrahp es demasiado y tiende a perder lectores y posibles ayudantes de esta manera. Gracias
Pieter Goosen
gracias, lo siento, estaba un poco apurado, no volverá a suceder!
stackoverclan
2
Quien haya votado para cerrar esto como basado principalmente en opiniones : lea la pregunta antes de emitir un voto.
fuxia
1
No hay problema. Es sólo un consejo para ayudar a usted en el futuro. Es un hecho que las preguntas claras bien escritas obtienen buenas respuestas :-). Por suerte no voté, esta vez soy inocente, jajaja :-)
Pieter Goosen el

Respuestas:

6

TL; DR

No hay una API de JavaScript en el núcleo de WordPress y nadie está planeado, pero en realidad, no es necesario.

Backend

En primer lugar, digamos que, con respecto al backend, se puede obtener información útil de las variables globales de JavaScript ya presentes (WordPress ama todos los sabores globales).

P.ej

  • ajaxurlpara que la admin-ajax.phpurl se use en llamadas ajax
  • pagenow para el slug de la página de administración actual, por ejemplo, 'tablero'
  • adminpage para el archivo de la página de administración actual, por ejemplo, 'index-php' (los puntos se reemplazan con guiones)
  • typenowpara el tipo de publicación actual mientras está en edit.php, post.phpopost-new.php
  • userSettings se puede utilizar para obtener información sobre el usuario registrado actual

Esa información le brinda un "contexto" del estado de la aplicación mientras está en el back-end.

Para otras cosas mencionadas en la pregunta, no necesita ninguna "API", porque las funciones súper simples de jQuery pueden hacer el truco. Por ejemplo, para saber si el menú de administración está cerrado, puede verificar la clase "doblada" en el cuerpo:

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

Falta de documentación

Para cosas como los fragmentos anteriores, no vale la pena crear funciones. WP ya tiene demasiadas funciones en PHP. Realmente espero que funciones adicionales como esas no se agreguen al núcleo.

Lo que realmente necesita JavaScript en WordPress es más documentación para las funciones existentes: ninguna de las cosas que he escrito anteriormente está documentada en ningún documento oficial como el Codex o en los archivos fuente.

¿Interfaz?

Hasta aquí solo he hablado del backend.

Esto se debe a que casi todas las cosas que suceden en la interfaz están relacionadas con el tema actualmente en uso. Imaginemos que hay un archivo JavaScript proporcionado por WordPress que contiene funciones para obtener información sobre el estado actual de la aplicación; si un tema no pone en cola ese archivo JS, esas funciones no están disponibles y forzar a un tema a poner en cola tal script sería absolutamente incorrecto.

Sin necesidad de (otra) API

Sin embargo, en WordPress, toda la información que puede obtener a través de PHP también se puede usar fácilmente en JavaScript y sin ninguna solicitud de AJAX. Esa función que hace esto posible es wp_localize_script().

Supongamos que desea obtener los datos actuales del usuario y del usuario, como su rol de usuario en su JavaScript, y también desea conocer las variables de consulta utilizadas en la página actual, puede hacer lo siguiente:

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

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

Al hacerlo en su script, la MyScriptData.uservariable será un objeto JavaScript con toda la información de los usuarios y todas las variables de consulta.

Esto es válido para los scripts de backend y frontend (en otras palabras: para ambos "lados"). No hay necesidad de ninguna API JavaScript adicional solo para obtener esa información. PHP es suficiente si utiliza las formas adecuadas para pasar información de PHP a JS.

Backbone.js

Backbone.js , es un marco de JavaScript que permite un (más o menos) patrón de desarrollo MVC con JavaScript. Se incluyó en el núcleo con WP 3.5, principalmente para manejar la galería de medios.

Esta biblioteca no es una API de JavaScript de WordPress, porque seguramente permite un desarrollo de JavaScript más potente, pero no se ha agregado ninguna función específica de WordPress a esa biblioteca y es el único uso central actual de Backbone.js. La biblioteca de medios está más o menos indocumentada y no tiene API pública. Y AFAIK no está planeado para llenar ese vacío. (Más que feliz de cambiar / eliminar esa declaración, si alguien puede demostrar que estoy equivocado).

WP-API

Como señalaron Rarst y Brian Fegter , la API de WP será parte del núcleo (probablemente comenzando con WP 4.1).

Pero tengo que decir que es no una API de JavaScript. Simplemente permite conectar una solicitud HTTP a un punto final de la aplicación que es controlada por la WP-API. Y la API obtiene datos de la base de datos y los devuelve JSON formateados allí. Ejemplo de los documentos:

¿Quieres obtener las publicaciones de tu sitio? Simplemente envíe una GETsolicitud a /wp-json/posts. ¿Actualizar usuario con ID 4? Enviar una POSTsolicitud a /wp-json/users/4. Obtener todas las publicaciones con el término de búsqueda "impresionante"? GET /wp-json/posts?filter[s]=awesome.

Como las solicitudes HTTP y las respuestas JSON relacionadas se pueden manejar con cualquier lenguaje que admita solicitudes HTTP y formato de datos JSON (entre ellos PHP, Ruby, Python, ASP, etc.), el objetivo principal de la API de WP es permitir obtener y establecer datos de WordPress de aplicaciones no WP. Eso significa desde cualquier aplicación , no solo WordPress.

Claro, dado que JavaScript es un lenguaje que puede manejar tanto las solicitudes HTTP como el formato JSON, también puede usar la API de WP desde JavaScript de WordPress. Alguien también está trabajando en un cliente WP js para esa API, pero

  • usando wp_enqueue_script()+ las funciones Ajax API + WordPress PHP es posible recuperar toda la información que necesita sin ninguna API adicional. Y dado que los tres "ingredientes" son estándares establecidos por WP, usarlos no es una "solución propia". Simplemente utiliza soluciones estándar para realizar tareas personalizadas (y comunes), que es de lo que se trata este desarrollo de complementos.

  • Incluso es posible utilizar JavaScript para utilizar la API de WP. Solo porque WP-API devuelve JSON, no lo convierte en una API de JavaScript. No hay ninguna función de JavaScript involucrada (se envía una solicitud HTTP y se devuelve un repositorio JSON. Más o menos lo mismo que sucede al usar la API AJAX). De lo contrario, cualquier servicio que devuelva JSON debe considerarse una API JS de WordPress. La WP-API debe considerarse una API de servicio externo que devuelve JSON, y puede darse el caso de que el sitio que consume este servicio JSON sea el mismo que lo proporciona.

  • No hay una sola cosa que se pueda hacer con la API de WP que no se pueda hacer también usando la API de AJAX. Pero hay muchas cosas que se pueden hacer con la API AJAX. pero no con la WP-API.

Una nota sobre WP-API + Backbone.js

Con Backbone.js, es posible obtener y guardar información en aplicaciones que admiten solicitudes HTTP RESTful .

El problema es que WordPress, tanto en solicitudes "regulares" como en AJAX, es RESTful: solo admite $_GETy $_POSTsolicita por defecto, y usar uno u otro con la misma URL termina en ... el mismo resultado .

Por el contrario, la API de WP es RESTful, por lo que las aplicaciones basadas en Backbone pueden aprovecharla para poderosas aplicaciones de JavaScript, pero me mantendría alejado de definir Backbone o WP API o Backbone + WP API como una API de JavaScript para WordPress por cosas que dicen encima.

gmazzap
fuente
¡Buen trabajo! Gracias por la respuesta detallada; eso me da muchas ideas e instrucciones, a pesar de que no estoy de acuerdo en algunas partes como "no es necesario". sin embargo, esa es LA respuesta!
stackoverclan
Como se dijo en la respuesta WP API + Backbone, incluso si IMHO no puede considerarse una API JS, puede darle mucha potencia para crear aplicaciones muy complejas basadas en js. En Backbone wiki en GitHub hay una colección de aplicaciones avanzadas que lo usan . WP API puede proporcionar una interfaz RESTful a los datos de WordPress que es necesaria para usar toda la potencia de Backbone. También eche un vistazo a estas diapositivas sobre Backbone + WordPress. @ mc007
gmazzap
El punto de entrada AJAX tarda demasiado en crear una aplicación ágil. en realidad es un no ir!
stackoverclan
1
@stackoverclan El punto de entrada AJAX es lento porque carga todo el entorno de WordPress. Pero también lo hace la API de WP, por lo que no obtienes beneficios de rendimiento con eso. Por el contrario, usarlo SHORTINITpuede hacer que ajax sea mucho más rápido. Hacer lo mismo con WP API sería mucho más difícil. Btp, ¿qué es una aplicación realmente ágil? Consejo: no uses WordPress.
gmazzap
4

Ha habido bastante desarrollo en torno a la API JSON REST que se supone que se fusionará con la versión 4.1 . Creo que oficialmente se llamará 'WP API'. Puede comenzar a usar la base de código ahora y mantenerse al día con los últimos desarrollos aquí hasta que llegue al núcleo. Ryan McCue y su equipo han desarrollado una documentación bastante buena aquí .

Brian Fegter
fuente
3

Si bien históricamente WP ha estado centrado en el back-end, hace años que se ha hecho una declaración sobre avanzar hacia el uso intensivo de JS. Teniendo en cuenta los compromisos de compatibilidad con versiones anteriores, es cuestionable que JS logre la paridad o se haga cargo de PHP en el corto plazo (en mi opinión), pero ha habido algún progreso al respecto.

El administrador de WordPress ahora viene con Backbone y Underscore, que había sido una gran parte de la última iteración de la biblioteca de medios. Desafortunadamente, los detalles específicos de la implementación están críticamente indocumentados y el uso de terceros ha sido relativamente impopular.

El complemento REST API se está desarrollando como "complemento de características" con la intención oficial de ser incluido en el núcleo de WordPress en el futuro.

Rarst
fuente
increíble, el enlace 'plugin de características' me ayuda mucho a comprender lo que realmente está sucediendo, definitivamente es una lectura obligatoria antes de ir a la caza ;-)
stackoverclan
3

Para responder a su declaración:

[...] no hay una API Javascript incorporada para Wordpress. Por lo tanto, los desarrolladores que desean construir en Ajax parecen tener su propia solución que no me parece correcta.

No hay una "solución propia" para hacer. Puede facilitar las cosas mediante el uso de ATP conajax_template_part() por @GM o plugins similares y tomar un atajo, pero todavía no hay manera no estándar para ir con AJAX en WordPress. Esas "soluciones propias" / formas (en su mayoría) lo están haciendo mal . Las llamadas AJAX se hacen (aproximadamente) así:

  1. Registre la devolución de llamada AJAX en el enlace contextual (público o privado / conectado)
  2. Registrar, poner en cola y localizar guiones
  3. Use jQuery $.ajax()y funciones similares para reaccionar ante la interacción del usuario. Trabaje con el objeto JS global (localizado) para devolver datos a la devolución de llamada PHP.
  4. Dentro de PHP cb, usted valida, filtra y desinfecta datos, verifica Nonces y referencias, hace sus cosas de base de datos y devuelve datos JSONifies usando wp_send_json_success()y funciones similares.

Si un complemento o tema no lo está haciendo de esa manera, entonces el autor no leyó las cosas o no miró los ejemplos. No es un esqueleto para la que debe utilizarse.

Puede encontrar información más detallada sobre cómo manejar AJAX en WP en el libro de la comunidad "WordPressTheRightWay" .

Lo que realmente extraño, aparte de buscar publicaciones o cualquier dato con una API incorporada, es un pequeño conjunto de funciones de Javascript para lidiar con la interfaz de fondo y de front-end. [...] Por ejemplo, me encantaría saber que el menú principal izquierdo está colapsado, o qué usuario ha iniciado sesión o qué grupo es, o incluso datos del cliente como el navegador, etc.

WordPress simplemente no es específico en lo que necesita hacer con AJAX. Es por eso que puede incluir casi todo en una matriz localizada / globalizada y tenerlo disponible para sus llamadas AJAX. Y eso va perfectamente en línea con la forma en que funciona Backbone: tienes que hacer las cosas que te gustan que quieras hacer.

Si desea utilizar un marco MVC JavaScript de opinión como AngularJs, entonces está en el lugar equivocado. Hay otros CMS como OctoberCMS, Drupal8, etc. que son mucho mejores para proporcionar una base para eso. WordPress requeriría que cree un conjunto personalizado de puntos finales de reescritura donde pueda devolver conjuntos de datos para sus controladores JS.

emperador
fuente
hola, gracias por la respuesta más detallada. Me gusta porque ya tienes algo de orientación y mejores prácticas.
stackoverclan