API WP Rest: dettagli dell'ultimo post incluso l'URL multimediale in evidenza in una richiesta?


15

Sto usando API wp-rest per ottenere informazioni sui post. Uso anche gli elementi del filtro API di wp rest per filtrare i campi e riassumere il risultato:

Quando chiamo http://example.com/wp-json/wp/v2/posts?items=id,title,featured_mediarestituisce risultati come questo:

[

    {
        "id": 407,
        "title": {
            "rendered": "Title 1"
        },
        "featured_media": 399
    },
    {
        "id": 403,
        "title": {
            "rendered": "Title 2"
        },
        "featured_media": 401
    }

]

La domanda è: come posso generare l'URL multimediale in primo piano usando questo ID? Per impostazione predefinita, la chiamata http://example.com/wp-json/wp/v2/media/401restituisce un nuovo json che ha tutti i dettagli sull'URL di diverse dimensioni dell'immagine sorgente:

{

    "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"
            }
        ]
    }

}

Ma considera il caso quando voglio ottenere un elenco di post e le loro anteprime. Una volta che dovrei chiamare, http://example.com/wp-json/wp/v2/posts?items=id,title,featured_mediadovrei chiamare http://example.com/wp-json/wp/v2/media/id10 volte per ogni ID media, quindi analizzare i risultati e ottenere l'URL finale della miniatura multimediale. Quindi ha bisogno di 11 richieste per ottenere i dettagli di 10 post (uno per l'elenco, 10 per le miniature). È possibile ottenere questi risultati in una richiesta?


1
Hai registrato un nuovo campo per la tua risposta con register_rest_field?
Benoti,

@Benoti Controllerò la sua documentazione. Se ci fossero altre cose da chiedere, tornerò da te :)
VSB

È giusto, non hai la data dell'immagine nella richiesta di post, solo l'ID del supporto in primo piano e una nuova richiesta è necessaria sul valore predefinito dell'API WP.
Fusione

Se si aggiunge il _embedparametro, l'oggetto post restituito include tutti i dettagli sul supporto in primo piano e tutte le sue dimensioni disponibili. Controlla la mia risposta per un esempio.
Jesús Franco,

Risposte:


18

Ah, ho appena avuto questo problema da solo! E mentre _embedè fantastico, nella mia esperienza è molto lento, e il punto di JSON è di essere veloce: D

Ho il seguente codice in un plugin (usato per aggiungere tipi di post personalizzati), ma immagino che potresti inserirlo nel function.phpfile del tuo tema .

php

add_action( 'rest_api_init', 'add_thumbnail_to_JSON' );
function add_thumbnail_to_JSON() {
//Add featured image
register_rest_field( 
    'post', // Where to add the field (Here, blog posts. Could be an array)
    'featured_image_src', // Name of new field (You can call this anything)
    array(
        'get_callback'    => 'get_image_src',
        'update_callback' => null,
        'schema'          => null,
         )
    );
}

function get_image_src( $object, $field_name, $request ) {
  $feat_img_array = wp_get_attachment_image_src(
    $object['featured_media'], // Image attachment ID
    'thumbnail',  // Size.  Ex. "thumbnail", "large", "full", etc..
    true // Whether the image should be treated as an icon.
  );
  return $feat_img_array[0];
}

Ora nella tua risposta JSON dovresti vedere un nuovo campo chiamato "featured_image_src":contenente un URL alla miniatura.

Maggiori informazioni sulla modifica delle risposte qui:
http://v2.wp-api.org/extending/modifying/

Ed ecco ulteriori informazioni su register_rest_fielde wp_get_attachment_image_src()funzioni:
1.) https://developer.wordpress.org/reference/functions/register_rest_field/
2.) https://developer.wordpress.org/reference/functions/wp_get_attachment_image_src/

** Nota: non dimenticare i <?php ?>tag se si tratta di un nuovo file php!


2
Funziona benissimo e aiuta a non utilizzare _embed poiché voglio solo l'immagine in primo piano. Ho dovuto cambiarlo in: ($object['featured_media'], 'fullsize', false);per non darmi l'url in miniatura, ma funziona perfettamente tramite funzioni.php - Grazie!
Giordania,

1
Tutto questo destreggiarsi con l'endpoint dell'API RES mi ricorda perché mi piace GraphQL e che dovrei finire i wrapper dell'API REST e dei nuovi resolver personalizzati ;-) Comunque, è una soluzione intelligente e in realtà utilizzo endpoint personalizzati in produzione per ottenere i dati Ho bisogno (e solo quello).
Jesús Franco,

Il nuovo plugin ha http://mahditajik.ir/wp-json/wp/v2/media/<id>ma ha molti dati extra che rendono la risposta lenta, quindi come posso personalizzare REST api rispondere dto?
Mahdi,

1
Grazie mille, mi ha aiutato a completare la mia funzione di contenuto in primo piano! : D
Atem18

1
Volevo solo farti sapere che questo ha tagliato 2 secondi dal mio tempo di caricamento! Grazie mille e per la tua bibliografia accuratamente curata!
GuiHarrison,

7

Basta aggiungere l' _embedargomento query al tuo URL chiedendo i post e ogni oggetto post includerà l' _embedded.[wp:featuredmedia]oggetto, che include tutte le immagini, proprio come la /media/$idrisorsa. Se si desidera una dimensione specifica, basta accedervi con il nome della sua proprietà, ovvero: _embedded[wp:featuredmedia][0].media_details.sizes.full.source_urlo per la sua anteprima:_embedded[wp:featuredmedia][0].media_details.sizes.thumbnail.source_url

Cioè, l'oggetto incorporato wp: optionalmedia include tutti gli URL e i dettagli per ogni dimensione disponibile per il tuo post, ma se vuoi solo l'immagine in primo piano originale, puoi usare il valore in questa chiave: post._embedded["wp:featuredmedia"][0].source_url

Lo uso in un sito con qualcosa del genere (usa il tuo dominio, ovviamente):

$.get('https://example.com/wp-json/wp/v2/posts/?categories=3&_embed', 
    function(posts) { 
        var elems = '';
        posts.forEach(function(post){ 
            var link = post.link;
            var title = post.title.rendered;
            var pic = post._embedded["wp:featuredmedia"][0].source_url);
            elems += '<div class="this_week"><a href="' + link + '" target="_blank">';
            elems += '<img src="' + pic + '" title="' + title + '"/><span class="title">';
            elems += title + '</span></a></div>';
        });
        $('#blockbusters').html(elems);
    });
});

Vedere? Non sono necessarie due query, basta aggiungerle _embedcome argomento di query e disporre di tutte le informazioni necessarie per utilizzare la dimensione migliore per la visualizzazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.