
在wordpress区块编辑器中,开发者有时需要根据主题或特定需求,动态调整编辑器的默认设置,例如允许的区块类型。一种常见的尝试是使用客户端javascript来监听编辑器状态变化,并在适当的时机修改设置。然而,这种方法往往面临时序问题,尤其是在编辑器加载过程中。
考虑以下使用JavaScript尝试修改allowedBlockTypes的示例:
async function blockEditorSubHandler() {
console.log("callback fired")
if (!select(blockEditor).getBlocks().length) return
if (!wp.data.select("core/block-editor").getSettings().allowedBlockTypes.includes("foo")) {
await dispatch(blockEditor).updateSettings({ allowedBlockTypes: ["foo"] })
console.log("passed")
}
}
subscribe(blockEditorSubHandler, "core/block-editor")上述代码尝试通过订阅core/block-editor的状态变化,在设置尚未包含“foo”区块类型时,将其添加到允许列表中。然而,实际操作中会发现,在编辑器完全加载并稳定之前,subscribe回调可能会被多次触发。这意味着设置可能在不完全加载的状态下被多次检查和修改,导致:
这种客户端修改的根本问题在于,JavaScript在浏览器中执行,而区块编辑器的初始设置是在服务器端生成并发送到客户端的。在编辑器初始化和渲染过程中,其状态会经历多次变化,导致监听器被频繁触发。
为了避免客户端JavaScript修改可能带来的时序和效率问题,最可靠且推荐的方法是在服务器端,通过PHP过滤器来预先配置区块编辑器的设置。WordPress提供了一个强大的过滤器block_editor_settings_all,允许开发者在编辑器设置被发送到浏览器之前对其进行修改。
立即学习“PHP免费学习笔记(深入)”;
block_editor_settings_all过滤器在区块编辑器初始化时执行,它接收两个参数:$editor_settings(当前编辑器设置数组)和$editor_context(编辑器上下文,包含例如文章类型等信息)。通过这个过滤器,我们可以直接修改allowedBlockTypes或其他任何编辑器设置,确保这些修改在编辑器加载到客户端时即刻生效。
以下是使用block_editor_settings_all过滤器来允许“foo”区块类型的PHP代码示例:
/**
* 允许在区块编辑器中使用 'foo' 区块类型。
*
* @param array $editor_settings 区块编辑器的所有设置。
* @param WP_Block_Editor_Context $editor_context 编辑器上下文。
* @return array 修改后的区块编辑器设置。
*/
function so_76324559_allow_foo( $editor_settings, $editor_context ) {
// 可以在此处添加额外的检查,例如根据 $editor_context 来判断是否应用此设置
// 例如:if ( 'post' === $editor_context->post_type ) { ... }
// 直接设置允许的区块类型数组,如果 'foo' 是唯一允许的,则替换整个数组。
// 如果需要保留现有允许的区块并添加 'foo',则应合并数组。
$editor_settings['allowedBlockTypes'] = ['foo'];
return $editor_settings;
}
add_filter( 'block_editor_settings_all', 'so_76324559_allow_foo', 10, 2 );将上述PHP代码添加到主题的functions.php文件或自定义插件中,即可实现:
if ( is_array( $editor_settings['allowedBlockTypes'] ) ) {
$editor_settings['allowedBlockTypes'][] = 'foo';
$editor_settings['allowedBlockTypes'] = array_unique( $editor_settings['allowedBlockTypes'] ); // 避免重复
} else {
$editor_settings['allowedBlockTypes'] = ['foo'];
}在WordPress区块编辑器中修改主题提供的设置时,优先考虑使用PHP的block_editor_settings_all过滤器。这种服务器端的方法能够确保设置在编辑器加载时即刻生效,有效避免了客户端JavaScript异步操作可能带来的时序问题和复杂性。它提供了一种更稳定、高效且易于维护的解决方案,是配置区块编辑器初始行为的最佳实践。
以上就是优化WordPress区块编辑器设置加载时机:PHP过滤器的高效实践的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号