You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress Gutenberg自定义块编辑时验证失败(属性不匹配)

解决Gutenberg Testimonial块的验证错误问题

从错误信息来看,核心问题是编辑器解析块时预期的属性结构和save函数输出的HTML属性不匹配——你预期图片元素只有class="testimonial-image",但实际输出的图片还带了src属性,导致属性数组长度不一致,触发验证失败。以下是具体解决步骤:

1. 规范block.json的图片属性定义

确保图片属性存储的是完整的媒体对象,而非单独的src值,这样编辑器能正确识别属性结构:

{
  "apiVersion": 3,
  "name": "create-block/testimonial",
  "title": "Testimonial",
  "category": "widgets",
  "attributes": {
    "testimonialImage": {
      "type": "object",
      "default": null
    },
    "name": {
      "type": "string",
      "default": ""
    },
    "position": {
      "type": "string",
      "default": ""
    },
    "testimonialText": {
      "type": "string",
      "default": "",
      "source": "html",
      "selector": "blockquote.testimonial-text"
    }
  },
  "editorScript": "file:./index.js",
  "style": "file:./style-index.css"
}

2. 修正编辑组件的图片处理逻辑

在edit.js中使用MediaUpload时,要完整存储选中的媒体对象,不要只提取src:

import { __ } from '@wordpress/i18n';
import { useBlockProps, MediaUpload, Button } from '@wordpress/block-editor';

export default function Edit( { attributes, setAttributes } ) {
  const blockProps = useBlockProps();

  return (
    <div { ...blockProps }>
      <MediaUpload
        onSelect={ ( media ) => {
          // 存储完整的媒体对象,包含url、alt、id等
          setAttributes( { testimonialImage: media } );
        } }
        allowedTypes={ [ 'image' ] }
        value={ attributes.testimonialImage?.id }
        render={ ( { open } ) => (
          <Button onClick={ open } variant="secondary">
            { attributes.testimonialImage ? (
              <img 
                src={ attributes.testimonialImage.url } 
                alt={ attributes.testimonialImage.alt || '' } 
                className="testimonial-image" 
              />
            ) : (
              __( '添加头像', 'testimonial' )
            ) }
          </Button>
        ) }
      />
      <input
        type="text"
        value={ attributes.name }
        onChange={ ( e ) => setAttributes( { name: e.target.value } ) }
        placeholder={ __( '姓名', 'testimonial' ) }
      />
      <input
        type="text"
        value={ attributes.position }
        onChange={ ( e ) => setAttributes( { position: e.target.value } ) }
        placeholder={ __( '职位', 'testimonial' ) }
      />
      <textarea
        value={ attributes.testimonialText }
        onChange={ ( e ) => setAttributes( { testimonialText: e.target.value } ) }
        placeholder={ __( 'Testimonial 内容', 'testimonial' ) }
      />
    </div>
  );
}

3. 对齐save函数的HTML输出

确保save函数输出的图片元素结构和编辑时完全一致,不要额外添加或遗漏属性:

import { useBlockProps } from '@wordpress/block-editor';

export default function save( { attributes } ) {
  const blockProps = useBlockProps.save();

  return (
    <div { ...blockProps }>
      { attributes.testimonialImage && (
        <img
          src={ attributes.testimonialImage.url }
          alt={ attributes.testimonialImage.alt || '' }
          className="testimonial-image"
        />
      ) }
      { attributes.name && <h3>{ attributes.name }</h3> }
      { attributes.position && <p className="position">{ attributes.position }</p> }
      { attributes.testimonialText && <blockquote className="testimonial-text">{ attributes.testimonialText }</blockquote> }
    </div>
  );
}

4. 清理旧数据并测试

如果之前已在编辑器中添加过错误的块实例,需要删除旧块并重新添加——因为数据库中已存储的错误属性结构会持续触发验证失败,重置后才能验证修复效果。

关键注意点

  • 始终保证block.json的属性定义、edit组件的属性处理、save组件的HTML输出三者完全一致,任何一处不匹配都会触发验证错误。
  • 不要将图片的src、alt拆分为单独属性存储,统一使用完整的媒体对象,这是Gutenberg块处理媒体的标准方式。

内容的提问来源于stack exchange,提问作者kawa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:05:08