如何防止块编辑器在SAVE函数中为块标记添加ID?

时间:2021-11-23 作者:Brian

我正在扩展核心WP块(core/group), 因此,它添加了一些div\'s 使我能够在前端显示所需的块。

除了显示自定义(单独使用样式属性是不可能的,因此添加了标记),我用添加的标记扩展块的目的是为了在前端可以根据id 我正在添加到container div, 以及创建一个动态导航菜单,其中包含基于我的扩展块的存在而指向块的锚定链接。

首先,我要说的是,在前端,所有东西都已经按照我想要的方式工作了,在块编辑器中,所有东西似乎都工作得很好,除了一个验证问题,它似乎不是一个表演的障碍,但尽管如此,我想消除验证错误。

我注意到Wordpress会自动添加id 至核心/集团外部部门:<div class="wp-block-group" id="an-exercise-111"></div>. 这导致了验证错误,我不知道如何阻止它这样做。

在我的代码中,我看不到任何可以添加此id的地方。

以下是生成自定义块标记的代码:

const addContentTypeMarkup = ( element, blockType, attributes ) => {
    // Do nothing if it\'s another block than our defined ones.
    if ( ! enableBlockContentTypeAttribute.includes( blockType.name ) ) {
        return element;
    }
    if ( attributes.contenttitle) {
        var post_id = wp.data.select("core/editor").getCurrentPostId();
        var title_slug = attributes.contenttitle.trim().split(/\\s+/).join(\'-\');
        var anchorid = title_slug+\'-\'+attributes.contentid;
        var iconclassbase=\'contenticon \';
        var iconclass=\'\';
        switch(attributes.contenttype) {
            case \'exercise\':
                iconclass =  \'fas fa-guitar\';
                break;
            case \'concept\':
                iconclass = \'fas fa-atom\';
                break;
            default:
                iconclass = \'fas fa-atom\';
        }
        iconclass = iconclassbase + iconclass;

        return (
            <React.Fragment>
                <div id = {`${anchorid}`} className = {`contenttype-wrapper sometopictype-${attributes.contenttype} navanchor`} data-id = {`${attributes.blockId}`}>
                    <div className = "heading d-flex flex-row">
                        <i className={`${iconclass} fa-7x`}></i>
                        <div className = "col">
                            <div className = "row"><span className="content-name">{attributes.contentname}</span></div>
                            <div className = "row"><h3 className="topictype-title" dangerouslySetInnerHTML={ { __html: attributes.contenttitle } }></h3></div>
                        </div>
                    </div>
                    {element}
                </div>
            </React.Fragment>
        )
    } else {
        return element;
    }
};

addFilter( \'blocks.getSaveElement\', \'my-blockmods/add-content-type-markup\', addContentTypeMarkup);

如果我在开发人员工具中查看控制台,以下是我在管理面板中收到的消息:

<div id="an-exercise-111" class="contenttype-wrapper sometopictype-exercise navanchor" data-id="be3d05d6-a048-41c9-8dcf-5fcf121dd4a8"><div class="heading d-flex flex-row"><i class="contenticon fas fa-guitar fa-7x"></i><div class="col"><div class="row"><span class="content-name">Exercise</span></div><div class="row"><h3 class="topictype-title">an exercise</h3></div></div></div><div class="wp-block-group" id="an-exercise-111"></div></div>

Content retrieved from post body:

<div id="an-exercise-111" class="contenttype-wrapper sometopictype-exercise navanchor" data-id="be3d05d6-a048-41c9-8dcf-5fcf121dd4a8"><div class="heading d-flex flex-row"><i class="contenticon fas fa-guitar fa-7x"></i><div class="col"><div class="row"><span class="content-name">Exercise</span></div><div class="row"><h3 class="topictype-title">an exercise</h3></div></div></div><div class="wp-block-group"></div></div>

我看到了问题的本质-Wordpress块编辑器save, 正在创建此元素:

div class="wp-block-group" id="an-exercise-111"></div>
此元素在标记函数中显示为{element} 包含块的内容。我不需要它来id. 也许Wordpress要求其块具有id? So it seems the block editor is automatically setting it with an id that is the same as the id I set manually in the block markup function, 我在哪里<div id="an-exercise-111" class="contenttype-wrapper...

有什么想法吗?

谢谢

NOTE如果我不使用id 自定义中的属性div 然后一切都验证了。例如,如果我使用someid 那么一切都好了。但我需要使用id 就是让锚链按我想要的方式工作。所以这又回到了最初的问题——为什么WP还要添加id 至div<div class="wp-block-group" id="an-exercise-111">? 在块编辑器中,我不会向核心/组块添加id,在过滤器中,我也不会设置id。真的,这是个谜。即使我可以以不同的方式执行此操作(我可能会切换到render\\u block并执行服务器端渲染),我仍然希望了解WP为什么要执行它正在执行的操作。。。

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

事实并非如此,而是所采取的方法是错误的,而且这种特殊情况是无法解决的。

ID的group blocks anchor属性存储在标记本身中,而不是HTML注释中,因此通过在顶层引入ID,可以更改其值。完成此操作后,组块的save组件的输出将更改,这就是ID的来源。

从根本上讲,你所做的不是应该如何做,而这种方法是错误的。

相反,应该使用包含块并组成结构。与您可以将块组合在一个组块中并为其指定ID的方式大致相同,您最好创建一个具有ID的标题和图标选择的专用块。

如果容器块不合适,则阶梯式标题块也同样适用。

这样做的好处是,您可以在PHP中通过解析块来构建导航,无论是通过parse_blocks 然后循环查找这些“;“步骤”;块,或通过向the_content, 如果您想这样做,甚至可以使用模板函数。同样,任何关于为基于块的内容构建大纲视图的问题都会对您非常有用。

同样,可以在运行时使用块渲染过滤器来实现与PHP中现有过滤器类似的过滤器。

相关推荐