Come ottenere meta post personalizzate utilizzando l'API REST


9

Sto cercando di creare un'API REST per il mio sito Web wordpress che viene utilizzato per l'elenco delle strutture utilizzando il plugin per la gestione dei lavori di wordpress.

Ho registrato il mio post personalizzato, le tassonomie in \ plugins \ rest-api \ plugin.php.

l'API di seguito mi fornisce tutti gli elenchi con risposta predefinita.

http: // localhost / sport / wp-JSON / wp / v2 / joblisting /

Volevo aggiungere post meta nella risposta JSON usando il codice seguente.

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

Usando il codice sopra sono in grado di aggiungere "phone" come risposta REST ma ricevo sempre phone = false in risposta. Non mostra i dati corretti dalla tabella wp_postmeta.

Ho seguito i link sotto indicati per riferimento.

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

Dettagli del plug-in. 1. WP Job Manager 2. rest-api

Qualsiasi aiuto sarà davvero utile.


dove vedi il "falso"? Hai controllato cosa sta realmente succedendo sul "filo" con gli strumenti di rete del browser?
Mark Kaplun

Ciao, sto ricevendo JSON come risposta.
Hari Soni,

Sto usando Chrome Postman Plugin per colpire il servizio. Non sto usando alcun tipo di autenticazione. È una semplice richiesta API senza dati nel corpo della richiesta.
Hari Soni,

allora come fai a sapere che in realtà attivi il post giusto? hai mai avuto quella richiamata?
Mark Kaplun

Sono nuovo di PHP e wordpress. Lavoro a lungo con JAVA. Potete per favore fatemi sapere come posso verificare se la mia funzione è chiamata o no? Ho provato a stampare l'oggetto postale ma non sono riuscito a vedere il valore ..
Hari Soni,

Risposte:


5

$postnella funzione di callback è un array, non un oggetto. Quindi non puoi usare $post->id. Modificalo in $post['id']e dovrebbe funzionare:

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

Vi consiglio di cambiamento _phoneper phone_numbero qualcosa d'altro, senza il prefisso di sottolineatura. Perché _è spesso usato con meta chiavi private. Prova ad aggiungere un campo personalizzato che ha la meta-chiave con _prefisso direttamente al tuo post, vedrai cosa intendevo dire.


16

L'API WP ha un rest_prepare_postfiltro (o rest_prepare_CPTse lavori con post personalizzati) che puoi usare per modificare la risposta JSON. Nel tuo caso lo sarà 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 );

Utilizzando lo stesso filtro è inoltre possibile rimuovere campi / dati dalla risposta ed eseguire qualsiasi manipolazione dei dati.


+1 in quanto è probabilmente un modo migliore rispetto al tentativo di ottenere ogni informazione in diverse richieste come sembra fare l'OP.
Mark Kaplun,

Questa soluzione ha funzionato perfettamente per me
Asif,

2

Basta aggiungere questo metodo a 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

Ecco un esempio di 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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.