Come ottenere i meta dei post personalizzati utilizzando la REST API
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.

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.

$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.

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

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();

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
]
);
