将自定义帖子类型添加到主干集合

时间:2020-03-18 作者:Marc

我正在尝试获取自定义帖子类型(cpt)的帖子backbone js client.

我注册了cpt,并将show\\u in\\u rest参数设置为true。我将wp api脚本排入队列。

urlhttp://myweb.com/wp-json/wp/v2/custom 作品

在js中,这起作用:

wp.api.loadPromise.done( function() {

       var _posts = new wp.api.collections.Posts();

});
但这并不是:

wp.api.loadPromise.done( function() {

       var _custom = new wp.api.collections.Custom();

} );
说“wp.api.collections.Custom不是构造函数”

为什么?

ps:我是这样注册到cpt的:

register_post_type(\'custom\', array(
    \'label\' => \'Custom\',
    \'public\' => true,        
    \'show_in_rest\' => true,
    ...
));

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

摘自documentation: (向下滚动至该页上的“使用修订版”部分)

注意:由于模式存储在用户的会话缓存中以避免重新获取,因此您可能需要打开一个新选项卡以重新读取模式。

So it\'s probably just a caching issue and you only needed to open a new (browser) tab, 或者在另一个选项卡或窗口中测试代码。

但是,如果不想打开其他选项卡/窗口,则可以强制浏览器删除架构的会话缓存right after WordPress定义了wpApiSettings 变量,当wp-api-request 脚本(wp-includes/js/api-request.js) 已排队。

因此,您可以使用wp_add_inline_script():

// Enqueue the Backbone client library.
wp_enqueue_script( \'wp-api\' ); // this includes the wp-api-request (api-request.js) script

// And then delete the session cache. Note: Don\'t include the <script> and </script> tags!
wp_add_inline_script( \'wp-api-request\', "try { sessionStorage.removeItem( \'wp-api-schema-model\' + wpApiSettings.root + wpApiSettings.versionString ); } catch ( err ) {}" );
但是,我并不推荐上述内容;默认情况下,该模式已经非常多,浏览器可能需要一些时间来请求该模式,然后通过主干客户端进行处理。但是,如果每次加载页面时都必须重置缓存,那么我将该代码作为一个选项共享。其次,可以使用上面的代码确认存在缓存问题。

顺便说一下,除了骨干客户机之外,您还可以使用wp.apiRequest() 要向REST API端点发出请求,请执行以下操作:

PHP:wp_enqueue_script( \'wp-api-request\' );

贴子类型的JavaScript示例custom 作为slug:

// Fetch a collection (i.e. a list of posts).
wp.apiRequest( { path: \'wp/v2/custom\' } )
  .then( posts => console.log( posts ) );

// Create a model/post.
wp.apiRequest( {
  path: \'wp/v2/custom\',
  method: \'POST\',
  data: {
    title: \'New Custom Post\',
    content: \'Just testing\',
    // ..other data, if any..
  }
} ).then( post => console.log( post ) );

// Update a model/post.
wp.apiRequest( {
  path: \'wp/v2/custom/123\', // change 123 to the correct ID
  method: \'POST\',
  data: {
    title: \'New Title\',
    // ..other data you want to UPDATE
  }
} ).then( post => console.log( post ) );

// Destroy a model/post.
wp.apiRequest( {
  path: \'wp/v2/custom/123\', // change 123 to the correct ID
  method: \'DELETE\'
} ).then( post => console.log( post.status ) ); // \'trash\'