วิธีรับเมตาโพสต์ที่กำหนดเองโดยใช้ REST API


9

ฉันกำลังพยายามสร้าง REST API สำหรับเว็บไซต์ wordpress ของฉันซึ่งใช้สำหรับรายการสิ่งอำนวยความสะดวกโดยใช้ปลั๊กอินตัวจัดการงาน wordpress

ฉันลงทะเบียนโพสต์ที่กำหนดเอง taxonomies ใน \ plugins \ rest-api \ plugin.php

API ด้านล่างให้รายชื่อทั้งหมดพร้อมการตอบกลับที่เป็นค่าเริ่มต้น

http: // localhost / กีฬา / WP-JSON / WP / v2 / joblisting /

ฉันต้องการเพิ่มเมตาโพสต์ในการตอบสนอง JSON โดยใช้รหัสด้านล่าง

function slug_register_phone_number() {
            register_rest_field( 'job_listing',
                'phone',
            array(
                'get_callback' => 'slug_get_phone_number',
                'update_callback' => null,
                'schema' => null,
            )
        );
    }

    function slug_get_phone_number($post, $field_name, $request) {
        return get_post_meta($post->id, '_phone' );
    }
}

การใช้โค้ดด้านบนฉันสามารถเพิ่ม "phone" เป็นการตอบกลับ REST แต่ฉันได้รับ phone = false ในการตอบกลับ มันไม่ได้แสดงข้อมูลที่ถูกต้องจากตาราง wp_postmeta

ฉันได้ปฏิบัติตามลิงค์ด้านล่างเพื่อการอ้างอิง

http://v2.wp-api.org/extending/modifying/

เสียบรายละเอียด 1. WP Job manager 2. rest-api

ความช่วยเหลือใด ๆ จะเป็นประโยชน์จริงๆ


คุณเห็น "เท็จ" ที่ไหน คุณได้ตรวจสอบสิ่งที่เกิดขึ้นจริง "สาย" กับเครื่องมือเครือข่ายของเบราว์เซอร์?
Mark Kaplun

สวัสดีฉันได้รับใน JSON เป็นการตอบสนอง
Hari Soni

ฉันใช้บุรุษไปรษณีย์ปลั๊กอินของ Chrome เพื่อเข้าถึงบริการ ฉันไม่ได้ใช้การตรวจสอบใด ๆ มันเป็นคำขอ API ที่เรียบง่ายโดยไม่มีข้อมูลใด ๆ ในเนื้อหาคำขอ
Hari Soni

แล้วคุณจะรู้ได้อย่างไรว่าคุณเรียกโพสต์ที่ถูกต้อง? คุณได้รับการติดต่อกลับหรือไม่
Mark Kaplun

ฉันยังใหม่กับ PHP และเวิร์ดเพรส ฉันทำงานกับ JAVA มาเป็นเวลานาน คุณช่วยบอกให้ฉันรู้ได้อย่างไรว่าฉันจะตรวจสอบว่าฟังก์ชันของฉันถูกเรียกหรือไม่ ผมพยายามที่จะพิมพ์วัตถุโพสต์ แต่ไม่สามารถที่จะเห็นค่า ..
Hari Soni

คำตอบ:


6

$postในฟังก์ชั่นการโทรกลับเป็นอาร์เรย์ไม่ใช่วัตถุ $post->idดังนั้นคุณจึงไม่สามารถใช้ เปลี่ยนเป็น$post['id']และควรทำงาน:

function slug_get_phone_number($post, $field_name, $request)
{
    return get_post_meta($post['id'], '_phone', true);
}

ฉันแนะนำให้เปลี่ยน_phoneเป็นphone_numberอย่างอื่นโดยไม่ใส่คำนำหน้าขีดล่าง เพราะ_มักใช้กับเมตาคีย์ส่วนตัว ลองเพิ่มฟิลด์ที่กำหนดเองซึ่งมีเมตาคีย์พร้อม_คำนำหน้าโดยตรงไปยังโพสต์ของคุณคุณจะเห็นว่าฉันหมายถึงอะไร


16

WP API มีrest_prepare_postตัวกรอง (หรือrest_prepare_CPTถ้าคุณกำลังทำงานกับโพสต์ที่กำหนดเอง) ซึ่งคุณสามารถใช้เพื่อแก้ไขการตอบสนอง JSON rest_prepare_joblistingในกรณีของคุณก็จะเป็น

function filter_joblisting_json( $data, $post, $context ) {
$phone = get_post_meta( $post->ID, '_phone', true );

if( $phone ) {
    $data->data['phone'] = $phone;
}

return $data;
}
add_filter( 'rest_prepare_joblisting', 'filter_joblisting_json', 10, 3 );

การใช้ตัวกรองเดียวกันคุณสามารถลบฟิลด์ / ข้อมูลออกจากการตอบสนองและทำการจัดการข้อมูลใด ๆ


+1 เนื่องจากอาจเป็นวิธีที่ดีกว่าการพยายามรับข้อมูลแต่ละรายการในคำขอที่แตกต่างกันเนื่องจาก OP ดูเหมือนว่าจะทำ
Mark Kaplun

วิธีนี้ใช้ได้ผลดีสำหรับฉัน
Asif

2

เพียงเพิ่มวิธีนี้ใน function.php

add_action( 'rest_api_init', 'create_api_posts_meta_field' );

function create_api_posts_meta_field() {

 // register_rest_field ( 'name-of-post-type', 'name-of-field-to-return', array-of-callbacks-and-schema() )
 register_rest_field( 'tour', 'metaval', array(
 'get_callback' => 'get_post_meta_for_api',
 'schema' => null,
 )
 );
}

function get_post_meta_for_api( $object ) {
 //get the id of the post object array
 $post_id = $object['id'];

 //return the post meta
 return get_post_meta( $post_id );
}

0

นี่คือตัวอย่าง OOP:

class MetaDataFetcher{

    public function enableAPIroute(){
        add_action ('rest_api_init', array($this, 'doRegisterRoutes'));
    }

    public function doRegisterRoutes(){
        register_rest_route(
            'yournamespace/vXX',
            'fetch-post-meta',
            array(
                'methods'               => array('GET','POST'),
                'callback'              => array($this, 'returnMetaData'),

                //You should have a better auth, or this endpoint will be exposed
                permission_callback'   => function(){return TRUE;}
        );
    }

    public function returnMetaData(){
        if (!(isset($_REQUEST['post-id']))){
            return "ERROR: No post ID";
        }
        $postID = $_REQUEST['post-id'];
        $meta = get_post_meta($postID);
        $meta = json_encode($meta);
        return $meta;
    }
}

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