web-dev-qa-db-ja.com

ワードプレスでカスタムフィールド(ポストメタ)データを更新/挿入する方法 REST API?

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が実行されていることがわかりました。

2
Varun Naharia

私はあなたのコードでテストを実行しました、そして私の意見では、あなたは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;
}
2
Andrei

以下のコードを使ってカスタム投稿データを書くことができます。以下のコードを使用して、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"
1
Muddasir