注意:WP_Block_Type_Registry::register 被错误调用。块类型名称必须包含命名空间前缀

问题描述 投票:0回答:4

我正在尝试按照本教程创建古腾堡 ACF 块

https://www.advancedcustomfields.com/resources/blocks/

我收到上面的错误

Notice: WP_Block_Type_Registry::register was called incorrectly. Block type names must contain a namespace prefix.

我在 ACF 论坛上找到了这个,并尝试了所有解决方案,但没有成功 https://support.advancedcustomfields.com/forums/topic/new-block-json-method-yields-no-block-types-exist/#post-157203

我当前在functions.php中的代码

add_action( 'init', 'register_acf_blocks' );
function register_acf_blocks() {
    register_block_type( get_template_directory_uri(). '/blocks/testimonial' );
}

I also tried this

add_action( 'init', 'register_acf_blocks' );
function register_acf_blocks() {
    register_block_type( get_template_directory_uri(). '/blocks/testimonial/block.json' );

and this

add_action( 'init', 'register_acf_blocks' );
function register_acf_blocks() {
    register_block_type( __DIR__ . '/blocks/testimonial' );
}

还有这个

add_action( 'init', 'register_acf_blocks' );
function register_acf_blocks() {
    register_block_type( __DIR__ . '/blocks/testimonial/block.json' );
}

我验证了所有文件路径

advanced-custom-fields wordpress-gutenberg
4个回答
1
投票

和你有同样的错误,并且也在完全相同的例子上工作。我注意到的是,错误不断显示不是因为 JSON 文件中的“名称”缺少前缀,而是因为它将 json 文件的文件路径视为名称(在 register_block_type() 函数中,通常第一个参数是名称)-当我将函数更改为:

add_action( 'init', 'register_blocks' );
function register_blocks() {
    register_block_type( dirname(__FILE__) . '/blocks/testimonial/block.json' );
}

错误已更改为关于名称不应包含大写字母的错误。

所以,就我而言,问题毕竟是错误的文件路径 - 我试图从另一个文件夹运行这个函数(我的functions.php只是收集其他php文件,并尝试使用 get_template_directory_uri() 作为运行它首先也是路径助手)。最后,我将上面的代码片段放入我的基本functions.php 文件中,它开始工作。希望这有帮助。


0
投票

该错误表明您的block.json中的

块名称
缺少命名空间前缀,例如:添加“项目名称/”与您唯一的插件/项目名称:

block.json

{
    "apiVersion": 2,
    "name": "project-name/testimonial",
...
}

使用唯一的前缀更新

name
后,使用唯一的函数名称在 PHP 中注册您的块:

add_action( 'init', 'register_project_name_testimonial_block' );

function register_project_name_testimonial_block() {
    register_block_type( __DIR__ . '/blocks/testimonial' );
}

register_block_type()函数会查找

block.json
,因此无需指定它。 ACF 文档使用
register_acf_blocks
作为函数名称,但如果您的项目中有多个块,那么您将覆盖同一个函数。如果
block.json
的命名空间和路径正确,则重复的函数名称可能是您的块未加载的另一个原因。


0
投票

传递给

register_block_type
的路径需要是包含 block.json 文件的目录的有效服务器路径,而不是网址,因此带有
get_template_directory_uri
的示例肯定不起作用。

调试此问题的最佳方法是回显您传递给函数的值,然后验证它是否存在于服务器上。例如:

add_action( 'init', 'register_acf_blocks' );
function register_acf_blocks() {
    $myblock =  __DIR__ . '/blocks/testimonial';
    var_dump($myblock);
    exit();
}

0
投票

当我以这种方式注册块时,就会发生这种情况:

function create_block_init() {
    register_block_type( __DIR__ . '/build' );
}

但我忘记了实际构建项目

npm run build
© www.soinside.com 2019 - 2024. All rights reserved.