Wie kann ich benutzerdefinierte Felder (Post-Metadaten) mit der WordPress REST API aktualisieren / einfügen?

Ich versuche, benutzerdefinierte Post-Daten (Post-Metadaten) über WordPress-API hinzuzufügen, aber ich bekomme Schwierigkeiten beim Aktualisieren / Hinzufügen von benutzerdefinierten Post-Daten. Unten ist der Code, der verwendet wird.

Code geschrieben in function.php

add_action( 'rest_api_init', 'create_api_posts_meta_field' ); function create_api_posts_meta_field() { // register_rest_field ( 'name-of-post-type', 'name-of-field-to-return', array-of-callbacks-and-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 ) { //get the id of the post object array $post_id = $object['id']; //return the post meta return get_post_meta( $post_id )["Subtitle"][0]; } function create_api_posts_meta_field_time() { // register_rest_field ( 'name-of-post-type', 'name-of-field-to-return', array-of-callbacks-and-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 ) { //get the id of the post object array $post_id = $object['id']; //return the post meta return get_post_meta( $post_id )["timing_of_experience"][0]; } 

JS-Datei in der Seite, an der ich gerade arbeite

 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("Error - try again"); } } } }); } 

Dieser Code funktioniert für das Standardfeld bedeutet, dass ein neuer Beitrag erstellt wird, aber nur Titel und Inhalt vorhanden sind.

Edit: Als ich versucht habe zu debuggen, habe ich dann erfahren, dass der update_callback-Code nicht ausgeführt wird, aber get_callback ausgeführt wird.

Solutions Collecting From Web of "Wie kann ich benutzerdefinierte Felder (Post-Metadaten) mit der WordPress REST API aktualisieren / einfügen?"

Ich habe gerade einen Test mit deinem Code durchgeführt und meiner Meinung nach funktioniert das nicht, weil du einen Fehler in der function get_callback .

Beim ersten Mal wird versucht, den subtitle (oder das timing_of_experience ) zu erhalten, aber es wird einen Fehler auslösen, weil es nicht an erster Stelle existiert und dieser Fehler die Registrierung von update_callback .

Das Problem ist, dass der Subtitle in get_callback S und nicht so, wie er gespeichert wird.

Zweitens sollten Sie die allgemeine Regel der validation von Daten beachten und prüfen, ob der Wert existiert, bevor Sie versuchen, darauf zuzugreifen. So was:

 function get_post_meta_for_api( $object ) { //get the id of the post object array $post_id = $object['id']; $meta = get_post_meta( $post_id ); if ( isset( $meta['subtitle' ] ) && isset( $meta['subtitle' ][0] ) ) { //return the post meta return $meta['subtitle' ][0]; } // meta not found return false; } 

Wie ich schon sagte, ich habe einen Test durchgeführt und den Post-Typ Ihrer experience mit post und es funktioniert.

Bonus Tipps, sollten Sie versuchen, Ihren Code besser zu organisieren, da es schwierig ist, mit dieser Einrückung und functionen Reihenfolge zu lesen. Auch für den update_callback eine einfache 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; } 

Sie können benutzerdefinierte Postdaten mit dem folgenden Code schreiben. Ich schreibe benutzerdefinierte Post-Typ “ad_portfolio” -Kategorien und vorgestellten Bild in WordPress API mit Code unter. ich hoffe es hilft. Vielen Dank

  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); //post type is "ad_portfolio"