我正在尝试按照本教程创建古腾堡 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' );
}
我验证了所有文件路径
和你有同样的错误,并且也在完全相同的例子上工作。我注意到的是,错误不断显示不是因为 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 文件中,它开始工作。希望这有帮助。
该错误表明您的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' );
}
block.json
,因此无需指定它。 ACF 文档使用 register_acf_blocks
作为函数名称,但如果您的项目中有多个块,那么您将覆盖同一个函数。如果 block.json
的命名空间和路径正确,则重复的函数名称可能是您的块未加载的另一个原因。
传递给
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();
}
当我以这种方式注册块时,就会发生这种情况:
function create_block_init() {
register_block_type( __DIR__ . '/build' );
}
但我忘记了实际构建项目
npm run build