WP Rest API: tek bir istekte öne çıkan medya URL'si dahil en son gönderinin ayrıntıları?


15

Gönderiler hakkında bilgi almak için wp-rest api kullanıyorum . Ayrıca alanları filtrelemek ve sonucu özetlemek için wp rest api filtre öğelerini kullanıyorum:

Ben çağırdığınızda http://example.com/wp-json/wp/v2/posts?items=id,title,featured_mediaböyle sonuçları döndürür:

[

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

]

Soru, bu kimliği kullanarak öne çıkan medya URL'sini nasıl oluşturabilirim? Varsayılan olarak çağrı http://example.com/wp-json/wp/v2/media/401, farklı kaynak görüntü boyutlarındaki URL'lerle ilgili tüm ayrıntılara sahip yeni bir json döndürür:

{

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

}

Ancak yayınların ve küçük resimlerinin listesini almak istediğim zaman durumu düşünün. Bir kez aramalıyım http://example.com/wp-json/wp/v2/posts?items=id,title,featured_mediasonra aramalıyımhttp://example.com/wp-json/wp/v2/media/id her medya kimliği için 10 kez ve ardından sonuçları ayrıştırmalı ve medya küçük resminin nihai URL'sini almalıyım. Bu nedenle 10 gönderinin ayrıntılarını almak için 11 istek gerekiyor (bir liste için, 10 küçük resim için). Bu sonuçları tek bir talepte almak mümkün müdür?


1
Register_rest_field ile olan yanıtınız için yeni bir alan kaydettiniz mi?
Benoti

@Benoti Belgelerini kontrol edeceğim. Sormak için daha fazla şey olsaydı sana geri döneceğim :)
VSB

Doğru, gönderi isteğinde görüntü tarihiniz yok, yalnızca öne çıkan medyanın kimliği ve WP API'sının varsayılanı için yeni bir istek gerekiyor.
16'da

_embedParametreyi eklerseniz, döndürülen post nesnesi öne çıkan ortam ve mevcut tüm boyutları hakkında tüm ayrıntıları içerir. Bir örnek için yanıtımı kontrol et.
Jesús Franco

Yanıtlar:


18

Ah bu problemi kendim yaşadım! Ve süre_embed harika olsa da, tecrübelerime göre çok yavaş ve JSON'un amacı hızlı olmaktır: D

Bir eklenti (özel yazı türleri eklemek için kullanılan) aşağıdaki kodu var, ama temanızın function.phpdosyasında koyabilirsiniz düşünün .

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

Şimdi JSON yanıtınızda şu adla yeni bir alan görmelisiniz: "featured_image_src": , küçük resme bir URL içeren .

Yanıtları değiştirmeyle ilgili daha fazla bilgiyi buradan edinebilirsiniz:
http://v2.wp-api.org/extending/modifying/

Ve işlevleri register_rest_fieldve wp_get_attachment_image_src()işlevleri hakkında daha fazla bilgi :
1.) https://developer.wordpress.org/reference/functions/register_rest_field/
2.) https://developer.wordpress.org/reference/functions/wp_get_attachment_image_src/

** Not: <?php ?>Bu yeni bir php dosyası ise etiketleri unutmayın !


2
Bu harika çalışıyor ve sadece tam boyutlu özellikli görüntüyü istediğimden _embed'in kullanılmasına gerek yok. Bunu değiştirmek zorunda kaldım: ($object['featured_media'], 'fullsize', false);bana küçük resim url'si vermemek, ancak function.php - teşekkürler!
Ürdün

1
RES API uç noktası ile tüm bu hokkabazlık, neden GraphQL'i sevdiğimi ve REST API ve yeni özel çözümleyicilerin paketleyicilerini bitirmem gerektiğini hatırlatıyor ;-) Her neyse, akıllı bir çözüm ve aslında verileri almak için üretimde özel uç noktaları kullanıyorum İhtiyacım var (ve sadece).
Jesús Franco

Yeni eklenti var http://mahditajik.ir/wp-json/wp/v2/media/<id>ama REST api yanıt dto nasıl özelleştirebilirsiniz, böylece yavaş yanıt veren birçok ekstra veri var?
Mehdi

1
Çok teşekkürler, öne çıkan içeriklerimi tamamlamama yardımcı oldu! : D
Atem18

1
Sadece bunun yükleme süremden 2 saniye kesildiğini bildirmek istedim! Özenle seçilmiş bibliyografyanız için çok teşekkür ederim!
GuiHarrison

7

_embedURL'lerinize mesajlar soran sorgu bağımsız değişkenini eklemeniz yeterlidir; her yazı nesnesi de _embedded.[wp:featuredmedia]tıpkı /media/$idkaynak gibi tüm resimleri içeren nesneyi içerir . Belirli bir boyut istiyorsanız, yalnızca özellik adına göre erişin, yani: _embedded[wp:featuredmedia][0].media_details.sizes.full.source_urlveya küçük resmi için:_embedded[wp:featuredmedia][0].media_details.sizes.thumbnail.source_url

Yani, wp: featuredmedia katıştırılmış nesnesi, yayınınız için kullanılabilir her boyut için tüm URL'leri ve ayrıntıları içerir, ancak yalnızca orijinal özellikli resmi istiyorsanız, bu anahtardaki değeri kullanabilirsiniz: post._embedded["wp:featuredmedia"][0].source_url

Ben böyle bir sitede (elbette kendi etki alanınızı kullanın) bir sitede kullanın:

$.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);
    });
});

Görmek? İki _embedsorguya gerek yok, sadece sorgu bağımsız değişkeni olarak ekleyin ve sonra görünümünüz için en iyi boyutu kullanmak için ihtiyacınız olan tüm bilgilere sahipsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.