Jak uzyskać niestandardowy meta post za pomocą interfejsu API REST

9

Próbuję utworzyć interfejsy API REST dla mojej witryny Wordpress, która jest używana do wyświetlania listy obiektów za pomocą wtyczki Wordpress Job Manager.

Zarejestrowałem swój niestandardowy post, taksonomie w \ plugins \ rest-api \ plugin.php.

poniżej API daje mi wszystkie oferty z domyślną odpowiedzią.

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

Chciałem dodać meta post do odpowiedzi JSON przy użyciu poniższego kodu.

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

Korzystając z powyższego kodu, mogę dodać „telefon” jako odpowiedź REST, ale zawsze otrzymuję telefon = false w odpowiedzi. Nie wyświetla poprawnych danych z tabeli wp_postmeta.

Skorzystałem z poniższych linków w celach informacyjnych.

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

Podłącz szczegóły. 1. WP Job manager 2. rest-api

Każda pomoc będzie naprawdę pomocna.

Hari Soni
źródło
gdzie widzisz „fałsz”? Czy sprawdziłeś, co się właściwie dzieje z „drutem” za pomocą narzędzi sieciowych przeglądarki?
Mark Kaplun
Cześć, dostaję JSON jako odpowiedź.
Hari Soni
Korzystam z listonosza wtyczki chrome, aby przejść do usługi. Nie używam żadnego rodzaju uwierzytelnienia. Jest to proste żądanie API bez żadnych danych w treści żądania.
Hari Soni
to skąd wiesz, że faktycznie uruchamiasz właściwy post? czy zdarza ci się nawet zadzwonić?
Mark Kaplun
Jestem nowy w PHP i Wordpress. Od dłuższego czasu współpracuję z JAVA. Czy możesz dać mi znać, jak mogę sprawdzić, czy moja funkcja jest wywoływana, czy nie? Próbowałem wydrukować obiekt postu, ale nie mogłem zobaczyć wartości.
Hari Soni

Odpowiedzi:

6

$postw funkcji zwrotnej jest tablica, a nie obiekt. Więc nie możesz użyć $post->id. Zmień to na $post['id']i powinno działać:

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

Polecam zmienić _phonena phone_numberlub coś innego bez prefiksu podkreślenia. Ponieważ _jest często używany z prywatnymi kluczami meta. Spróbuj dodać niestandardowe pole, które ma meta-klucz z _prefiksem bezpośrednio do swojego posta, zobaczysz, co miałem na myśli.

SarahCoding
źródło
16

WP API ma rest_prepare_postfiltr (lub rest_prepare_CPTjeśli pracujesz z niestandardowymi postami), którego możesz użyć do zmodyfikowania odpowiedzi JSON. W twoim przypadku tak będzie 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 );

Za pomocą tego samego filtra można także usunąć pola / dane z odpowiedzi i dowolnie manipulować danymi.

Boris Kuzmanov
źródło
+1, ponieważ jest to prawdopodobnie lepszy sposób niż próba uzyskania każdej informacji w różnych żądaniach, jak się wydaje PO.
Mark Kaplun
To rozwiązanie działało dla mnie idealnie
Asif
2

Wystarczy dodać te metody do 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
źródło
0

Oto przykład 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
źródło