Come ottenere i meta dei post personalizzati utilizzando la REST API

23 mag 2016, 05:58:16
Visualizzazioni: 31.5K
Voti: 11

Sto cercando di creare delle REST API per il mio sito WordPress che viene utilizzato per l'elenco delle strutture usando il plugin WordPress Job Manager.

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

L'API qui sotto mi fornisce tutti gli elenchi con la risposta predefinita.

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

Volevo aggiungere i post meta nella risposta JSON utilizzando 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 riesco ad aggiungere "phone" come risposta REST ma ottengo sempre phone = false nella risposta. Non mostra i dati corretti dalla tabella wp_postmeta.

Ho seguito i link sotto menzionati come riferimento.

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

Dettagli dei plugin: 1. WP Job Manager 2. REST API

Qualsiasi aiuto sarà molto utile.

6
Commenti

dove vedi il "false"? Hai verificato cosa sta effettivamente succedendo sulla "linea" con gli strumenti di rete del browser?

Mark Kaplun Mark Kaplun
23 mag 2016 06:32:29

Ciao, sto ricevendo una risposta in formato JSON.

Hari Soni Hari Soni
23 mag 2016 06:33:31

Sto utilizzando il plugin Postman di Chrome per richiamare il servizio. Non sto usando alcun tipo di autenticazione. È una semplice richiesta API senza dati nel corpo della richiesta.

Hari Soni Hari Soni
23 mag 2016 06:52:00

allora come fai a sapere che stai effettivamente attivando il post corretto? riesci almeno a raggiungere quella callback?

Mark Kaplun Mark Kaplun
23 mag 2016 06:56:12

Sono nuovo in PHP e WordPress. Ho lavorato a lungo con JAVA. Potresti dirmi come posso verificare se la mia funzione viene chiamata o no? Ho provato a stampare l'oggetto post ma non riesco a vedere il valore...

Hari Soni Hari Soni
23 mag 2016 07:38:45

in modo grezzo ma come preferisco farlo io, è usare var_dump su una variabile e poi die dopo di essa. Strumenti migliori come phpstorm probabilmente ti permettono di impostare breakpoint. Forse anche eclipse.

Mark Kaplun Mark Kaplun
23 mag 2016 08:27:16
Mostra i restanti 1 commenti
Tutte le risposte alla domanda 5
2
20

L'API di WordPress ha un filtro rest_prepare_post (o rest_prepare_CPT se stai lavorando con post personalizzati) che puoi utilizzare per modificare la risposta JSON. Nel tuo caso 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 puoi anche rimuovere campi/dati dalla risposta e fare qualsiasi manipolazione dei dati.

23 mag 2016 09:59:04
Commenti

+1 perché probabilmente è un modo migliore rispetto al tentativo di ottenere ogni informazione in richieste separate come sembra fare l'OP.

Mark Kaplun Mark Kaplun
23 mag 2016 19:50:06

Questa soluzione ha funzionato perfettamente per me

Asif Asif
23 set 2017 21:40:17
0

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

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

Consiglio di cambiare _phone in phone_number o qualcos'altro senza il prefisso underscore. Perché _ è spesso usato con chiavi meta private. Prova ad aggiungere un campo personalizzato che ha una chiave meta con prefisso _ direttamente al tuo post, capirai cosa intendo.

23 mag 2016 09:23:39
0

Aggiungi questi metodi a function.php

add_action( 'rest_api_init', 'create_api_posts_meta_field' );

function create_api_posts_meta_field() {

 // register_rest_field ( 'nome-del-post-type', 'nome-del-campo-da-restituire', array-di-callbacks-e-schema() )
 register_rest_field( 'tour', 'metaval', array(
 'get_callback' => 'get_post_meta_for_api',
 'schema' => null,
 )
 );
}

function get_post_meta_for_api( $object ) {
 //ottieni l'id dell'array dell'oggetto post
 $post_id = $object['id'];

 //restituisci i post meta
 return get_post_meta( $post_id );
}
14 nov 2017 10:43:10
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'),

                //Dovresti avere un'autenticazione migliore, altrimenti questo endpoint sarà esposto
                'permission_callback'   => function(){return TRUE;}
            )
        );
    }

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

$MetaDetaFetcher = New MetaDataFetcher;
$MetaDetaFetcher->enableAPIroute();
3 dic 2019 21:48:07
0

Ho testato e utilizzato quello che mi sembra un modo più semplice, dopo aver registrato il custom post type puoi anche registrare i custom meta e renderli disponibili nell'API REST.

Vedi register_meta()

register_post_type( 'job_listing', $args ); // in $args puoi rendere il post type disponibile nell'API REST
register_meta(
    'post', '_phone', [
    'object_subtype' => 'job_listing',  // specifica il sottotipo di post
        'show_in_rest' => true  // rende il meta disponibile nell'API REST
    ]
   );
29 mag 2020 13:02:24