Cara mendapatkan meta pos khusus menggunakan REST API

9

Saya mencoba membuat REST API untuk situs web wordpress saya yang digunakan untuk daftar fasilitas menggunakan plugin wordpress job manager.

Saya telah mendaftarkan pos kustom saya, taksonomi di \ plugins \ rest-api \ plugin.php.

API di bawah ini memberi saya semua listing dengan respons default.

http: // localhost / sports / wp-json / wp / v2 / joblisting /

Saya ingin menambahkan posting meta di respons JSON menggunakan kode di bawah ini.

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' );
    }
}

Dengan menggunakan kode di atas saya dapat menambahkan "telepon" sebagai respons REST tetapi saya selalu menerima telepon = false sebagai respons. Itu tidak menunjukkan data yang benar dari tabel wp_postmeta.

Saya telah mengikuti tautan yang disebutkan di bawah ini untuk referensi.

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

Masukkan detail. 1. WP Job manager 2. rest-api

Bantuan apa pun akan sangat membantu.

Hari Soni
sumber
di mana Anda melihat "false"? Sudahkah Anda memeriksa apa yang sebenarnya terjadi pada "kawat" dengan alat jaringan browser?
Mark Kaplun
Hai saya masuk di JSON sebagai tanggapan.
Hari Soni
Saya menggunakan tukang pos plugin chrome untuk menekan layanan. Saya tidak menggunakan otentikasi apa pun. Ini permintaan API sederhana tanpa data di badan permintaan.
Hari Soni
lalu bagaimana Anda tahu bahwa Anda sebenarnya memicu posting yang tepat? apakah Anda bahkan mendapatkan panggilan balik itu?
Mark Kaplun
Saya baru mengenal PHP dan wordpress. Saya bekerja dengan JAWA untuk waktu yang lama. Bisakah Anda memberi tahu saya bagaimana saya dapat memeriksa apakah fungsi saya dipanggil atau tidak? Saya mencoba untuk mencetak objek posting tetapi tidak dapat melihat nilainya ..
Hari Soni

Jawaban:

5

$postdalam fungsi callback adalah array, bukan objek. Jadi kamu tidak bisa menggunakan $post->id. Ubah $post['id']dan harus berfungsi:

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

Saya merekomendasikan untuk mengubah _phoneke phone_numberatau sesuatu yang lain tanpa awalan garis bawah. Karena _sering digunakan dengan kunci meta pribadi. Cobalah untuk menambahkan bidang khusus yang memiliki kunci meta dengan _awalan langsung ke posting Anda, Anda akan melihat apa yang saya maksud.

SarahCoding
sumber
16

WP API memiliki rest_prepare_postfilter (atau rest_prepare_CPTjika Anda bekerja dengan posting khusus) yang dapat Anda gunakan untuk mengubah respons JSON. Dalam kasus Anda itu akan terjadi 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 );

Menggunakan filter yang sama Anda juga dapat menghapus bidang / data dari respons dan melakukan manipulasi data apa pun.

Boris Kuzmanov
sumber
Memberi +1 karena ini mungkin cara yang lebih baik daripada mencoba untuk mendapatkan setiap info dalam permintaan yang berbeda seperti yang dilakukan OP.
Mark Kaplun
Solusi ini sangat cocok untuk saya
Asif
2

Tambahkan saja metode ini ke 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 );
}
Nuwan
sumber
0

Berikut ini adalah contoh 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();
John Dee
sumber