Come aggiornare/inserire dati di campi personalizzati (post meta) con l'API REST di WordPress?
Sto cercando di aggiungere dati personalizzati dei post (post meta data) attraverso l'API di WordPress ma sto riscontrando difficoltà nell'aggiornare/aggiungere i dati personalizzati. Questo è il codice che sto utilizzando.
Codice scritto in functions.php
add_action( 'rest_api_init', 'create_api_posts_meta_field' );
function create_api_posts_meta_field() {
// register_rest_field ( 'nome-del-tipo-di-post', 'nome-del-campo-da-restituire', array-di-callback-e-schema() )
register_rest_field( 'experience', 'subtitle', array(
'get_callback' => 'get_post_meta_for_api',
'update_callback' => 'update_post_meta_for_exp',
'schema' => null,
));
}
function update_post_meta_for_exp($object, $meta_value ) {
$havemetafield = get_post_meta($object['id'], 'experience', false);
if ($havemetafield) {
$ret = update_post_meta($object['id'], 'subtitle', $meta_value );
return true;
} else {
$ret = add_post_meta( $object['id'], 'subtitle', $meta_value ,true );
return true;
}
}
function get_post_meta_for_api( $object ) {
//ottiene l'id dall'array dell'oggetto post
$post_id = $object['id'];
//restituisce il post meta
return get_post_meta( $post_id )["Subtitle"][0];
}
function create_api_posts_meta_field_time() {
// register_rest_field ( 'nome-del-tipo-di-post', 'nome-del-campo-da-restituire', array-di-callback-e-schema() )
register_rest_field( 'experience', 'timing_of_experience', array(
'get_callback' => 'get_post_meta_for_api_time',
'update_callback' => function($meta_value ) {
$havemetafield = get_post_meta(1, 'experience', false);
if ($havemetafield) {
$ret = update_post_meta(1, 'timing_of_experience', $meta_value );
return true;
} else {
$ret = add_post_meta( 1, 'timing_of_experience', $meta_value ,true );
return true;
}
},
'schema' => null,
));
}
function get_post_meta_for_api_time( $object ) {
//ottiene l'id dall'array dell'oggetto post
$post_id = $object['id'];
//restituisce il post meta
return get_post_meta( $post_id )["timing_of_experience"][0];
}
File JS incluso nella pagina su cui sto lavorando
var quickAddExperience = document.querySelector("#quick-add-experience");
if (quickAddExperience) {
quickAddExperience.addEventListener("click",function() {
var ourPostData = {
'title' : document.getElementById('title').value,
'content' : document.getElementById('content').value,
'subtitle' : document.getElementById('company_name').value,
'timing_of_experience' : document.getElementById('time_period').value,
'status' : 'publish'
}
console.log(ourPostData);
var createPost = new XMLHttpRequest();
createPost.open("POST", magicalData.siteURL + "/wp-json/wp/v2/experience-api");
createPost.setRequestHeader("X-WP-Nonce", magicalData.nonce);
createPost.setRequestHeader("Content-Type","application/json;charset=UTF-8");
createPost.send(JSON.stringify(ourPostData));
createPost.onreadystatechange = function(){
if (createPost.readystate == 4) {
if (createPost.status == 201) {
document.querySelector('.data-api-post-1 [name="title"]').value ='';
document.querySelector('.data-api-post-1 [name="content"]').value ='';
document.querySelector('.data-api-post-1 [name="company_name"]').value ='';
document.querySelector('.data-api-post-1 [name="time_period"]').value ='';
}else{
alert("Errore - riprova");
}
}
}
});
}
Questo codice funziona per i campi predefiniti, significa che il nuovo post viene creato ma ci sono solo titolo e contenuto.
Modifica: Quando ho provato a fare il debug ho scoperto che il codice update_callback non viene eseguito mentre get_callback viene eseguito.
Ho appena eseguito un test con il tuo codice e secondo me non funziona perché hai un errore nella funzione get_callback
.
La prima volta proverà a ottenere il subtitle
(o il timing_of_experience
) ma genererà un errore perché non esiste ancora e questo errore bloccherà la registrazione del update_callback
.
Quindi, il problema è che nel get_callback
la chiave Subtitle
ha una S
maiuscola e non è così che viene salvata.
In secondo luogo, dovresti rispettare la regola generale di validare i dati e verificare se il valore esiste prima di tentare di accedervi. In questo modo:
function get_post_meta_for_api( $object ) {
// Ottieni l'id dell'array dell'oggetto post
$post_id = $object['id'];
$meta = get_post_meta( $post_id );
if ( isset( $meta['subtitle'] ) && isset( $meta['subtitle'][0] ) ) {
// Restituisci il post meta
return $meta['subtitle'][0];
}
// Meta non trovato
return false;
}
Come ho detto, ho eseguito un test, sostituendo il tuo post type experience
con post
e funziona.
Come suggerimento bonus, dovresti cercare di organizzare meglio il tuo codice perché è difficile da leggere con questa indentazione e ordine delle funzioni. Inoltre, per il update_callback
è sufficiente un semplice return true
.
function update_post_meta_for_exp($object, $meta_value ) {
$havemetafield = get_post_meta($object['id'], 'experience', false);
if ($havemetafield) {
$ret = update_post_meta($object['id'], 'subtitle', $meta_value );
} else {
$ret = add_post_meta( $object['id'], 'subtitle', $meta_value ,true );
}
return true;
}

Puoi scrivere dati personalizzati per i post utilizzando il codice qui sotto. Ho scritto un custom post type "ad_portfolio" con categorie e immagine in evidenza nell'API di WordPress usando questo codice. Spero sia utile. Grazie
function prepare_rest($data, $post, $request){
$_data = $data->data;
$thumbnail_id = get_post_thumbnail_id( $post->ID );
$featured_media_url = wp_get_attachment_image_src( $thumbnail_id, 'large' );
$post_categories = wp_get_post_terms( $post->ID, 'ad_portfolios' , array("fields" => "all") );
$cats = array();
foreach($post_categories as $cat){
$cats[] = ['slug' => $cat->slug, 'name' => $cat->name ];
}
$_data['featured_media_url'] = $featured_media_url[0];
$_data['portfolio_cats'] = $cats;
$data->data = $_data;
return $data;
}
add_filter('rest_prepare_ad_portfolio', 'prepare_rest', 10, 3);
//il post type è "ad_portfolio"
