Cum să obții datele meta ale unui articol personalizat folosind REST API
Încerc să creez API-uri REST pentru site-ul meu WordPress care este folosit pentru listarea facilităților folosind plugin-ul WordPress Job Manager.
Mi-am înregistrat articolul personalizat și taxonomiile în \plugins\rest-api\plugin.php.
API-ul de mai jos îmi oferă toate listările cu răspunsul implicit.
http://localhost/sports/wp-json/wp/v2/joblisting/
Am vrut să adaug meta date în răspunsul JSON folosind codul de mai jos.
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' );
}
}
Folosind codul de mai sus pot adăuga "phone" ca răspuns REST, dar primesc întotdeauna phone = false în răspuns. Nu afișează datele corecte din tabelul wp_postmeta.
Am urmat linkurile menționate mai jos pentru referință.
http://v2.wp-api.org/extending/modifying/
Detalii plugin-uri: 1. WP Job Manager 2. REST API
Orice ajutor va fi foarte util.

API-ul WP are un filtru rest_prepare_post
(sau rest_prepare_CPT
dacă lucrezi cu postări personalizate) pe care îl poți folosi pentru a modifica răspunsul JSON.
În cazul tău, acesta va fi 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 );
Folosind același filtru, poți elimina câmpuri/date din răspuns și poți face orice manipulare a datelor.

$post
în funcția callback este un array, nu un obiect. De aceea nu poți folosi $post->id
. Schimbă-l în $post['id']
și ar trebui să funcționeze:
function slug_get_phone_number($post, $field_name, $request)
{
return get_post_meta($post['id'], '_phone', true);
}
Recomand să schimbi _phone
în phone_number
sau altceva fără prefixul underscore. Pentru că _
este adesea folosit cu chei meta private. Încearcă să adaugi un câmp personalizat care are cheia meta cu prefixul _
direct la postarea ta și vei înțelege la ce mă refer.

Adaugă aceste metode în fișierul functions.php
add_action( 'rest_api_init', 'create_api_posts_meta_field' );
function create_api_posts_meta_field() {
// register_rest_field ( 'tipul-postului', 'numele-campului-de-retur', array-de-callbackuri-si-schema() )
register_rest_field( 'tour', 'metaval', array(
'get_callback' => 'get_post_meta_for_api',
'schema' => null,
)
);
}
function get_post_meta_for_api( $object ) {
//obține ID-ul din array-ul obiectului post
$post_id = $object['id'];
//returnează metadatele postului
return get_post_meta( $post_id );
}

Iată un exemplu de 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'),
//Ar trebui să ai o autorizare mai bună, altfel acest endpoint va fi expus
'permission_callback' => function(){return TRUE;}
)
);
}
public function returnMetaData(){
if (!(isset($_REQUEST['post-id']))){
return "EROARE: Lipseste ID-ul postării";
}
$postID = $_REQUEST['post-id'];
$meta = get_post_meta($postID);
$meta = json_encode($meta);
return $meta;
}
}
$MetaDetaFetcher = New MetaDataFetcher;
$MetaDetaFetcher->enableAPIroute();

Am testat și folosit ceea ce mi se pare o metodă mai ușoară, după ce înregistrezi tipul de postare personalizată, poți înregistra și metadatele personalizate și să le faci disponibile în API-ul REST.
Vezi register_meta()
register_post_type( 'job_listing', $args ); // în $args poți face tipul de postare disponibil în API-ul REST
register_meta(
'post', '_phone', [
'object_subtype' => 'job_listing',
'show_in_rest' => true
]
);
