不使用编辑器进行CPT的最佳实践

时间:2021-08-04 作者:Robert Wolski

我真的很感激你的帮助。我正在构建一个简单的播客插件,将播客剧集添加到网站。我有两个CPT用于这集的“播客”和“嘉宾”。

任务将不会启用存档和单个模板。它将仅用于存储客人信息并使用自定义块将其显示在插曲(播客CPT)页面上。

我想有几种方法可以解决这个问题,但我需要一些帮助。

选项1-将使用旧方法为来宾的所有设置和内容创建自定义元数据库。

选项2-使用Gutenberg,所有选项都在CPT插件侧栏中。我还想在编辑来宾时创建一个自定义块用于预览。我需要隐藏该CPT的所有其他块,并使用模板仅显示预览块,不允许删除该块或添加其他块。

选项3-我应该以其他方式解决这个问题吗?

此CPT需要自定义元(名称、描述、电子邮件、社交链接、自定义链接)

感谢您的时间和帮助。

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

我已经非常广泛地使用了自定义块选项。我为自定义帖子类型启用编辑器,但使用自定义模板template_lock 设置为true:

\'template\' => array(
    array(\'pb/custom-block-name\'),
),
\'template_lock\' => true
然后我使用allowed_block_types_all 筛选以仅允许post类型的自定义块:

function pb_allowed_block_types($allowed_block_types, $block_editor_context) {
    if (!$block_editor_context->post || $block_editor_context->post->post_type !== \'custom_post_type\') {
        return $allowed_block_types;
    }

    return array(
        \'pb/custom-block-name\',
    );
}
add_filter(\'allowed_block_types_all\', \'pb_allowed_block_types\', 10, 2);
最后,我使用useEntityProp 要获取和设置元,请执行以下操作:

import { __ } from \'@wordpress/i18n\';
import { useSelect } from \'@wordpress/data\';
import { useEntityProp } from \'@wordpress/core-data\';

const Edit = (props) => {
    const postType = useSelect((select) => (
        select(\'core/editor\').getCurrentPostType()
    ));

    const [meta, setMeta] = useEntityProp(\'postType\', postType, \'meta\');

    return (
        <TextControl
            label={ __(\'Label\', \'pb\') }
            value={ meta._pb_meta_slug }
            onChange={ (value) => setMeta({_pb_meta_slug: value}) }
        />
    );
};
确保您使用register_post_meta 要为自定义帖子类型注册所有帖子元,否则将无法保存:

register_post_meta(\'custom_post_type\', \'_pb_meta_slug\', array(
    \'type\' => \'string\',
    \'single\' => true,
    \'auth_callback\' => function() {
        return current_user_can(\'edit_posts\');
    },
    \'show_in_rest\' => true,
));

相关推荐