Cum să actualizezi/introduci date în câmpuri personalizate (post meta) folosind WordPress REST API?
Încerc să adaug date personalizate pentru postări (post meta data) prin intermediul WordPress API dar întâmpin dificultăți la actualizarea/adăugarea datelor personalizate. Mai jos este codul pe care îl folosesc.
Cod scris în functions.php
add_action( 'rest_api_init', 'create_api_posts_meta_field' );
function create_api_posts_meta_field() {
// register_rest_field ( 'numele-tipului-de-postare', 'numele-campului-de-returnat', array-de-callback-uri-si-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 ) {
//obține id-ul din array-ul obiectului postării
$post_id = $object['id'];
//returnează post meta
return get_post_meta( $post_id )["Subtitle"][0];
}
function create_api_posts_meta_field_time() {
// register_rest_field ( 'numele-tipului-de-postare', 'numele-campului-de-returnat', array-de-callback-uri-si-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 ) {
//obține id-ul din array-ul obiectului postării
$post_id = $object['id'];
//returnează post meta
return get_post_meta( $post_id )["timing_of_experience"][0];
}
Fișierul JS inclus în pagina la care lucrez
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("Eroare - încearcă din nou");
}
}
}
});
}
Acest cod funcționează pentru câmpurile implicite, adică se creează o postare nouă dar conține doar titlu și conținut.
Editare: Când am încercat să depanez, am descoperit că update_callback nu se execută, dar get_callback se execută.
Tocmai am rulat un test cu codul tău și, în opinia mea, acesta nu funcționează pentru că ai o eroare în funcția get_callback
.
Prima dată va încerca să obțină subtitle
(sau timing_of_experience
), dar va declanșa o eroare pentru că nu există de la început, iar această eroare va bloca înregistrarea update_callback
.
Deci, problema este că în get_callback
cheia Subtitle
are un S
majuscul, iar acesta nu este modul în care este salvată.
În al doilea rând, ar trebui să respecți regula generală de validare a datelor și să verifici dacă valoarea există înainte de a încerca să o accesezi. Astfel:
function get_post_meta_for_api( $object ) {
//obține id-ul din array-ul obiectului post
$post_id = $object['id'];
$meta = get_post_meta( $post_id );
if ( isset( $meta['subtitle' ] ) && isset( $meta['subtitle' ][0] ) ) {
//returnează meta postului
return $meta['subtitle' ][0];
}
// meta negăsită
return false;
}
Cum am spus, am rulat un test, înlocuind tipul tău de post experience
cu post
și funcționează.
Bonus, ar trebui să încerci să îți organizezi codul mai bine, deoarece este greu de citit cu această indentare și ordine a funcțiilor. De asemenea, pentru update_callback
un simplu return true
este suficient.
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;
}

Puteți scrie date personalizate pentru articole folosind codul de mai jos. Am scris categorii pentru tipul de articol personalizat "ad_portfolio" și imaginea reprezentativă în API-ul WordPress folosind codul de mai jos. Sper să vă fie de ajutor. Mulțumesc
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);
//tipul de articol este "ad_portfolio"
