WP Rest API: รายละเอียดของโพสต์ล่าสุดรวมถึง url ของสื่อที่โดดเด่นในคำขอเดียว?


15

ฉันใช้wp-rest apiเพื่อรับข้อมูลโพสต์ ฉันยังใช้รายการตัวกรอง ap ส่วนที่เหลือ WPเพื่อกรองเขตข้อมูลและสรุปผล:

เมื่อฉันเรียกhttp://example.com/wp-json/wp/v2/posts?items=id,title,featured_mediaมันจะให้ผลลัพธ์เช่นนี้

[

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

]

คำถามคือฉันจะสร้าง URL สื่อที่แนะนำโดยใช้รหัสนี้ได้อย่างไร ตามค่าเริ่มต้นการโทรhttp://example.com/wp-json/wp/v2/media/401จะส่งคืน json ใหม่ซึ่งมีรายละเอียดทั้งหมดเกี่ยวกับ url ที่มีขนาดต่างกันของอิมเมจ:

{

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

}

แต่ให้พิจารณากรณีเมื่อฉันต้องการรับรายการโพสต์และรูปขนาดย่อของพวกเขา มีอยู่ครั้งหนึ่งที่ฉันควรโทรhttp://example.com/wp-json/wp/v2/posts?items=id,title,featured_mediaแล้วฉันควรจะโทรhttp://example.com/wp-json/wp/v2/media/id10 ครั้งสำหรับแต่ละรหัสสื่อแล้วแยกวิเคราะห์ผลลัพธ์และรับ URL สุดท้ายของภาพขนาดย่อของสื่อ ดังนั้นจึงต้องการ 11 คำขอเพื่อรับรายละเอียด 10 โพสต์ (หนึ่งรายการ, 10 สำหรับรูปขนาดย่อ) เป็นไปได้ไหมที่จะได้ผลลัพธ์นี้ในคำขอเดียว?


1
คุณได้ลงทะเบียนฟิลด์ใหม่สำหรับการตอบกลับของคุณด้วย register_rest_field หรือไม่
Benoti

@Benoti ฉันจะตรวจสอบเอกสารของมัน หากมีสิ่งที่ต้องถามเพิ่มเติมฉันจะกลับมาหาคุณ :)
VSB

ถูกต้องคุณยังไม่มีวันที่รูปในคำขอโพสต์เฉพาะ ID ของสื่อที่โดดเด่นและคำขอใหม่เป็นสิ่งจำเป็นในการเริ่มต้นของ WP API
bueltge

หากคุณเพิ่ม_embedพารามิเตอร์วัตถุโพสต์ที่ส่งคืนจะมีรายละเอียดทั้งหมดเกี่ยวกับสื่อแนะนำและขนาดทั้งหมดที่มี ตรวจสอบคำตอบของฉันสำหรับตัวอย่าง
Jesús Franco

คำตอบ:


18

อาฉันเพิ่งมีปัญหานี้ด้วยตัวเอง! และในขณะที่_embedดีในประสบการณ์ของฉันมันช้ามากและจุดของ JSON จะเร็ว: D

ฉันมีรหัสต่อไปนี้ในปลั๊กอิน (ใช้สำหรับเพิ่มประเภทโพสต์ที่กำหนดเอง) แต่ฉันคิดว่าคุณสามารถใส่ไว้ในfunction.phpไฟล์ธีมของคุณได้

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

ในการตอบสนอง JSON ของคุณคุณควรเห็นเขตข้อมูลใหม่ที่เรียกว่า"featured_image_src":มี URL ไปยังภาพขนาดย่อ

อ่านเพิ่มเติมเกี่ยวกับการแก้ไขคำตอบได้ที่นี่:
http://v2.wp-api.org/extending/modifying/

และนี่คือข้อมูลเพิ่มเติมเกี่ยวกับregister_rest_fieldและwp_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/

** หมายเหตุ: อย่าลืม<?php ?>แท็กหากนี่เป็นไฟล์ php ใหม่!


2
วิธีนี้ใช้งานได้ดีและช่วยให้ไม่ต้องใช้ _embed เนื่องจากฉันต้องการเฉพาะภาพที่มีขนาดเต็ม ฉันต้องเปลี่ยนเป็น: ($object['featured_media'], 'fullsize', false);เพื่อไม่ให้ URL ภาพขนาดย่อ แต่ทำงานได้อย่างสมบูรณ์ผ่านฟังก์ชั่น php - ขอบคุณ!
Jordan

1
การเล่นกลกับจุดสิ้นสุด RES API ทั้งหมดนี้ทำให้ฉันนึกถึงว่าทำไมฉันถึงชอบ GraphQL และฉันควรทำ wrapper ของ REST API และตัวแก้ไขแบบกำหนดเองใหม่ให้เสร็จ ;-) อย่างไรก็ตามมันเป็นโซลูชันที่ฉลาดและจริง ๆ แล้วฉันใช้จุดปลายทางที่กำหนดเองในการผลิตเพื่อรับข้อมูล ฉันต้องการ (และแค่นั้น)
Jesús Franco

ปลั๊กอินใหม่มีhttp://mahditajik.ir/wp-json/wp/v2/media/<id>แต่มีข้อมูลเพิ่มเติมมากมายที่ทำให้การตอบสนองช้าดังนั้นฉันจะกำหนด REST api ตอบสนอง dto ได้อย่างไร
มาห์ดี

1
ขอบคุณมากมันช่วยให้ฉันเสร็จคุณลักษณะเนื้อหาที่มีคุณลักษณะของฉัน! : D
Atem18

1
ฉันแค่อยากบอกให้คุณรู้ว่าสิ่งนี้ช่วยลดเวลาในการโหลดของฉันลง 2 วินาที! ขอบคุณมากและบรรณานุกรมที่ได้รับการดูแลอย่างระมัดระวัง!
GuiHarrison

7

เพียงเพิ่ม_embedอาร์กิวเมนต์การสืบค้นลงใน URL ของคุณเพื่อขอโพสต์และทุก ๆ ออบเจกต์โพสต์จะรวม_embedded.[wp:featuredmedia]ออบเจกต์ซึ่งรวมถึงรูปภาพทั้งหมดเช่นเดียวกับ/media/$idทรัพยากร หากคุณต้องการขนาดเฉพาะให้เข้าถึงโดยใช้ชื่อคุณสมบัติของมันเช่น: _embedded[wp:featuredmedia][0].media_details.sizes.full.source_urlหรือภาพขนาดย่อ:_embedded[wp:featuredmedia][0].media_details.sizes.thumbnail.source_url

นั่นคือวัตถุฝังตัว wp: featuredmedia รวมถึง URL และรายละเอียดทั้งหมดสำหรับทุกขนาดที่มีให้สำหรับโพสต์ของคุณ แต่ถ้าคุณต้องการเพียงภาพที่เป็นต้นฉบับคุณสามารถใช้ค่าในคีย์นี้: post._embedded["wp:featuredmedia"][0].source_url

ฉันใช้มันในเว็บไซต์ที่มีลักษณะดังนี้ (ใช้โดเมนของคุณเอง):

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

ดู? ไม่จำเป็นต้องมีสองคำค้นหาเพียงเพิ่ม_embedเป็นอาร์กิวเมนต์แบบสอบถามแล้วคุณมีข้อมูลทั้งหมดที่คุณต้องใช้ขนาดที่ดีที่สุดสำหรับมุมมองของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.