使用AJAX和WordPress REST API创建带有元字段的定制帖子

时间:2019-06-27 作者:GuitarExtended

我创建了一个自定义的post类型,并将其显示在RESTAPI中。我还使用以下代码注册了一个自定义字段:

function slug_get_post_meta_cb( $object, $field_name, $request ) {
    return get_post_meta( $object[ \'id\' ], $field_name );
}

function slug_update_post_meta_cb( $value, $object, $field_name ) {
    return update_post_meta( $object[ \'id\' ], $field_name, $value );
}

add_action( \'rest_api_init\', function() {
 register_rest_field( \'custom_type\',
    \'myfield\',
    array(
       \'get_callback\'    => \'slug_get_post_meta_cb\',
       \'update_callback\' => \'slug_update_post_meta_cb\',
       \'schema\'          => array(
           \'type\' => \'string\',
           \'context\' => array( \'view\', \'edit\' )
       ),
    )
 );
我使用jQuery创建一个ajax POST请求,以便使用以下javascript代码创建一个新的自定义POST:

jQuery.ajax( {
                    url: requete.api,
                    method: \'POST\',
                    beforeSend: function ( xhr ) {
                        xhr.setRequestHeader( \'X-WP-Nonce\', questionnaireScript.nonce );
                    },
                    data:{
                        title : myData.title,
                        content: myData.content,
                        status: "publish",
                        myfield: "Stop flying"
                    }
                } ).done( function ( response ) {
                    console.log( response );
                } );
帖子是由创建的,没有自定义字段myfield . 它在对GET请求的响应中显示为自定义post对象的一部分,但显示为空数组。我还尝试将其设置为myfield : ["Stop flying"], 和asmeta : {myfield: "Stop flying"}, 无济于事。我知道另一个注册元字段的WP函数(register_meta). 然而,由于文档显示它不能仅应用于自定义post类型,因此我选择使用register\\u rest\\u字段。知道我做错了什么吗?

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

我还没有测试你的代码,但这里$object 是对象而不是数组:

// Here, $object is a WP_Post object.
function slug_update_post_meta_cb( $value, $object, $field_name ) {
    return update_post_meta( $object->ID, $field_name, $value );
}
你可以使用register_meta() 使用自定义帖子类型:

register_meta( \'post\', \'myfield\', [
    \'object_subtype\' => \'custom_type\', // Limit to a post type.
    \'type\'           => \'string\',
    \'description\'    => \'My Field\',
    \'single\'         => true,
    \'show_in_rest\'   => true,
] );
检查我的答案here 了解更多详细信息。

SO网友:ChristopherJones

尝试使用JSON。stringify()在传递数据时对其进行字符串化,并将其作为该类型发送:

// Data to pass over
obj_to_pass = {
  title : myData.title,
  content: myData.content,
  status: "publish",
  myfield: "Stop flying"
};
// Updated AJAX call
jQuery.ajax( {
  url: requete.api,
  method: \'POST\',
  beforeSend: function ( xhr ) {
    xhr.setRequestHeader( \'X-WP-Nonce\', questionnaireScript.nonce );
  },
  dataType : \'json\',
  data: JSON.stringify(obj_to_pass)
} ).done( function ( response ) {
  console.log( response );
} );
我觉得我过去对它有过一些问题。我没有一个好的测试环境来测试它,所以祈祷吧!