我正在构建一个Wordpress插件,该插件依赖于注册自定义帖子类型时启用的自定义字段。我想检查帖子类型对象中custom-fields
中的true
键是否存在(并且是supports
)。但是,当我调用wp.data.select('core').getPostType('post-type')
时,它将返回undefined
。如果直接从控制台调用它,则会得到期望的post类型对象,因此我不确定为什么它在我的代码中不起作用。
我尝试从几个地方打电话给这个。
例如注册插件面板时:
// Loading `wp.editPosts`, `wp.plugins`, etc. excluded for brevity.
const Component = () => {
const postType = wp.data.select('core/editor').getCurrentPostType();
const postTypeObj = wp.data.select('core').getPostType(postType);
if (postTypeObj.supports.hasOwnProperty('custom-fields')) {
return (
<PluginDocumentSettingPanel
name="my-plugin-name"
title={ __('My Plugin Title', 'pb') }
>
<MyPlugin/>
</PluginDocumentSettingPanel>
);
}
return;
};
registerPlugin('my-plugin-name', {
render: Component,
icon: '',
});
或通过withSelect
在插件本身中:
// Loading `wp.compose`, `wp.data`, etc. excluded for brevity.
class MyPlugin extends React.Component {
constructor(props) {
super(props);
this.state = {
// I'll do something with this later on
postTypeObj: props.postTypeObj,
};
}
render() {
return (
<div></div>
);
}
}
export default compose([
withSelect(select => {
const {
getCurrentPostType,
} = select('core/editor');
const {
getPostType,
} = select('core');
return {
postTypeObj: getPostType(getCurrentPostType()),
}
}),
])(MyPlugin);
无论我在哪里称呼,帖子类型对象都会返回undefined
。
我正在使用古腾堡插件6.5.0
和WordPress版本5.2.3
。
感谢您的帮助。
答案 0 :(得分:1)
这是wp.data.select('core')中的任何内容以及基于它的内容的特征。
问题在于react正在进行ajax调用以获取数据。而且,当响应返回时,将触发另一个渲染。因此,如果您牢记这一点,您的代码将再次运行(当响应到达时),并根据服务器的响应获得非空结果,届时将为您存储该结果。 / p>
区别在于:最初的东西是空白,这些空白将被填充。
(这是值得重复的,因此请教育其他人。)
答案 1 :(得分:0)
致电getCurrentPostType()
将返回例如post
。您可能也不需要将其包装在getPostType
中。另外,根据https://github.com/WordPress/gutenberg/issues/13555,由于这是异步调用,您将需要“订阅”(wp.data.subscribe
),因此在您第一次运行它时将返回null。
答案 2 :(得分:0)
对于需要在自定义帖子类型编辑窗口下使用此功能的用户,几乎没有要求。
1。。注册自定义帖子类型时,请确保将show_in_rest
设置为true
并支持包含editor
的数组。这将排队所需的脚本。
或者您可以按以下步骤手动将它们加入队列:
function enable_gutenberg_on_custom_post_types( $hook ) {
global $current_screen;
// Load on certain post type
if ( 'product' !== $current_screen->post_type ) {
return;
}
/**
* Make the WP Screen object aware that this is a block editor page.
* Since custom blocks check whether the screen is_block_editor,
* this is required for custom blocks to be loaded.
* See wp_enqueue_registered_block_scripts_and_styles in wp-includes/script-loader.php
*/
$current_screen->is_block_editor( true );
/**
* Fires after block assets have been enqueued for the editing interface.
*
* Call `add_action` on any hook before 'admin_enqueue_scripts'.
*
* In the function call you supply, simply use `wp_enqueue_script` and
* `wp_enqueue_style` to add your functionality to the block editor.
*
* @since 5.0.0
*/
do_action( 'enqueue_block_editor_assets' );
}
add_action( 'admin_enqueue_scripts', 'enable_gutenberg_on_custom_post_types' );
2。。您还需要加入其他脚本,例如wp-data
和wp-edit-posts
:
wp_enqueue_script(
'my-custom-script',
PLUGIN_URL . 'dist/admin.js',
array( 'react', 'react-dom', 'wp-data', 'wp-edit-post' ),
'1.0.0',
false
);
然后使用javascript:
window.wp.data.select('core').getEntityRecords( 'postType', 'post' )
或使用挂钩:
const posts = window.wp.data.useSelect((select) => {
return select('core').getEntityRecords('postType', 'product');
}, []);