Estoy usando wp-rest api para obtener información de publicaciones. También uso los elementos del filtro wp rest api para filtrar campos y resumir el resultado:
Cuando lo llamo http://example.com/wp-json/wp/v2/posts?items=id,title,featured_media
devuelve resultados como este:
[
{
"id": 407,
"title": {
"rendered": "Title 1"
},
"featured_media": 399
},
{
"id": 403,
"title": {
"rendered": "Title 2"
},
"featured_media": 401
}
]
La pregunta es ¿cómo puedo generar una URL de medios destacados usando esta identificación? Por defecto, la llamada http://example.com/wp-json/wp/v2/media/401
devuelve un nuevo json que tiene todos los detalles sobre la URL de diferentes tamaños de imagen de origen:
{
"id": 401,
"date": "2016-06-03T17:29:09",
"date_gmt": "2016-06-03T17:29:09",
"guid": {
"rendered": "http://example.com/wp-content/uploads/my-image-name.png"
},
"modified": "2016-06-03T17:29:09",
"modified_gmt": "2016-06-03T17:29:09",
"slug": "my-image-name",
"type": "attachment",
"link": "http://example.com/my-post-url",
"title": {
"rendered": "my-image-name"
},
"author": 1,
"comment_status": "open",
"ping_status": "closed",
"alt_text": "",
"caption": "",
"description": "",
"media_type": "image",
"mime_type": "image/png",
"media_details": {
"width": 550,
"height": 250,
"file": "my-image-name.png",
"sizes": {
"thumbnail": {
"file": "my-image-name-150x150.png",
"width": 150,
"height": 150,
"mime_type": "image/png",
"source_url": "http://example.com/wp-content/uploads/my-image-name-150x150.png"
},
"medium": {
"file": "my-image-name-300x136.png",
"width": 300,
"height": 136,
"mime_type": "image/png",
"source_url": "http://example.com/wp-content/uploads/my-image-name-300x136.png"
},
"one-paze-port-thumb": {
"file": "my-image-name-363x250.png",
"width": 363,
"height": 250,
"mime_type": "image/png",
"source_url": "http://example.com/wp-content/uploads/my-image-name-363x250.png"
},
"one-paze-blog-thumb": {
"file": "my-image-name-270x127.png",
"width": 270,
"height": 127,
"mime_type": "image/png",
"source_url": "http://example.com/wp-content/uploads/my-image-name-270x127.png"
},
"one-paze-team-thumb": {
"file": "my-image-name-175x175.png",
"width": 175,
"height": 175,
"mime_type": "image/png",
"source_url": "http://example.com/wp-content/uploads/my-image-name-175x175.png"
},
"one-paze-testimonial-thumb": {
"file": "my-image-name-79x79.png",
"width": 79,
"height": 79,
"mime_type": "image/png",
"source_url": "http://example.com/wp-content/uploads/my-image-name-79x79.png"
},
"one-paze-blog-medium-image": {
"file": "my-image-name-380x250.png",
"width": 380,
"height": 250,
"mime_type": "image/png",
"source_url": "http://example.com/wp-content/uploads/my-image-name-380x250.png"
},
"full": {
"file": "my-image-name.png",
"width": 550,
"height": 250,
"mime_type": "image/png",
"source_url": "http://example.com/wp-content/uploads/my-image-name.png"
}
},
"image_meta": {
"aperture": "0",
"credit": "",
"camera": "",
"caption": "",
"created_timestamp": "0",
"copyright": "",
"focal_length": "0",
"iso": "0",
"shutter_speed": "0",
"title": "",
"orientation": "0",
"keywords": [ ]
}
},
"post": 284,
"source_url": "http://example.com/wp-content/uploads/my-image-name.png",
"_links": {
"self": [
{
"href": "http://example.com/wp-json/wp/v2/media/401"
}
],
"collection": [
{
"href": "http://example.com/wp-json/wp/v2/media"
}
],
"about": [
{
"href": "http://example.com/wp-json/wp/v2/types/attachment"
}
],
"author": [
{
"embeddable": true,
"href": "http://example.com/wp-json/wp/v2/users/1"
}
],
"replies": [
{
"embeddable": true,
"href": "http://example.com/wp-json/wp/v2/comments?post=401"
}
]
}
}
Pero considere el caso cuando quiero obtener una lista de publicaciones y sus miniaturas. Una vez que debería llamar http://example.com/wp-json/wp/v2/posts?items=id,title,featured_media
, debería llamar http://example.com/wp-json/wp/v2/media/id
10 veces por cada identificación de medios y luego analizar los resultados y obtener la url final de la miniatura de los medios. Por lo tanto, necesita 11 solicitudes para obtener detalles de 10 publicaciones (una para la lista, 10 para las miniaturas). ¿Es posible obtener estos resultados en una sola solicitud?
_embed
parámetro, el objeto de publicación devuelto incluye todos los detalles sobre los medios destacados y todos sus tamaños disponibles. Comprueba mi respuesta para ver un ejemplo.Respuestas:
¡Ah, yo mismo tuve este problema! Y aunque
_embed
es genial, en mi experiencia es muy lento, y el objetivo de JSON es ser rápido: DTengo el siguiente código en un complemento (utilizado para agregar tipos de publicaciones personalizadas), pero imagino que podría ponerlo en el
function.php
archivo de su tema .php
Ahora en su respuesta JSON debería ver un nuevo campo llamado que
"featured_image_src":
contiene una url a la miniatura.Lea más sobre cómo modificar las respuestas aquí:
http://v2.wp-api.org/extending/modifying/
Y aquí hay más información sobre las funciones
register_rest_field
ywp_get_attachment_image_src()
:1.) https://developer.wordpress.org/reference/functions/register_rest_field/
2.) https://developer.wordpress.org/reference/functions/wp_get_attachment_image_src/
** Nota: ¡No olvide las
<?php ?>
etiquetas si se trata de un nuevo archivo php!fuente
($object['featured_media'], 'fullsize', false);
para no darme la URL en miniatura, pero funciona perfectamente a través de functions.php - ¡Gracias!http://mahditajik.ir/wp-json/wp/v2/media/<id>
pero tiene muchos datos adicionales que hacen que la respuesta sea lenta, ¿cómo puedo personalizar REST api responder dto?Simplemente agregue el
_embed
argumento de consulta a su URL solicitando las publicaciones, y cada objeto de publicación incluirá el_embedded.[wp:featuredmedia]
objeto, que incluye todas las imágenes, al igual que el/media/$id
recurso. Si desea un tamaño específico, simplemente acceda a él por su nombre de propiedad, es decir:_embedded[wp:featuredmedia][0].media_details.sizes.full.source_url
o por su miniatura:_embedded[wp:featuredmedia][0].media_details.sizes.thumbnail.source_url
Es decir, el objeto incrustado wp: Featuredmedia incluye todas las URL y detalles para cada tamaño disponible para su publicación, pero si desea solo la imagen destacada original, puede usar el valor en esta clave:
post._embedded["wp:featuredmedia"][0].source_url
Lo uso en un sitio con algo como esto (use su propio dominio, por supuesto):
¿Ver? No es necesario realizar dos consultas, solo agregue
_embed
como argumento de consulta, y luego tendrá toda la información que necesita para usar el mejor tamaño para su vista.fuente