wp.​​data.select('core')。getPostType('post-type')在古腾堡返回未定义

时间:2019-09-27 15:25:20

标签: wordpress wordpress-gutenberg

我正在构建一个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

感谢您的帮助。

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-datawp-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');
  }, []);