WordPress APIを使用してカスタム投稿データ(投稿メタデータ)を追加しようとしていますが、カスタム投稿データを更新または追加するときに問題が発生します。以下は使用しているコードです。
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ファイル
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");
}
}
}
});
}
このコードはデフォルトのフィールドで機能しているため、新しい投稿は作成されますが、タイトルとコンテンツのみが存在します。
編集: デバッグしようとすると、update_callbackコードは実行されていないがget_callbackが実行されていることがわかりました。
私はあなたのコードでテストを実行しました、そして私の意見では、あなたはget_callback
関数にエラーがあるのでこれはうまくいきません。
初めてsubtitle
(またはtiming_of_experience
)を取得しようとしますが、そもそもそれが存在しないためエラーを引き起こし、このエラーはupdate_callback
の登録をブロックします。
したがって、問題はget_callback
ではSubtitle
キーが大文字のS
を持ち、これが保存される方法ではないということです。
次に、データを検証するという一般規則を尊重し、データにアクセスする前に値が存在するかどうかを確認します。このような:
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;
}
私が言ったように、私はあなたのexperience
投稿タイプをpost
に置き換えてテストを実行しました、そしてそれは働いています。
おまけのコツ、このインデントと関数の順序で読むのは難しいので、あなたはあなたのコードをより良く整理するように試みるべきです。また、update_callback
には単純な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;
}
以下のコードを使ってカスタム投稿データを書くことができます。以下のコードを使用して、WordPress APIでカスタム投稿タイプ「ad_portfolio」カテゴリと特集画像を書き込みます。それが役に立てば幸い。ありがとう
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"