创建动态块

动态块是指在前端渲染块时动态构建其结构和内容的块。

动态块有两个主要用途:

  1. 即使帖子尚未更新,内容也应更改的块。WordPress本身的一个例子是LatestPosts块。发布新帖子时,此块将在使用它的任何位置进行更新。
  2. 代码更新块(HTML、CSS、JS)应立即显示在网站前端。例如,如果通过添加新类、添加HTML元素或以任何其他方式更改布局来更新块的结构,则使用动态块可确保这些更改立即应用于站点中该块的所有引用。(如果未使用动态块,则在更新块代码时Gutenberg证实过程通常适用,导致用户看到验证消息“此块似乎已从外部修改”)。

对于许多动态块节约回调函数应返回为无效的,它告诉编辑器只保存块属性到数据库。然后,这些属性被传递到服务器端渲染回调中,这样您就可以决定如何在站点前端显示块。当你回来的时候无效的,编辑器将跳过块标记验证过程,避免频繁更改标记的问题。

如果您正在使用内部块在动态块中,您需要保存内部块在中节约回调函数使用<内部块。内容/>

您还可以保存块的HTML表示。如果提供服务器端渲染回调,则此HTML将替换为回调的输出,但如果块被停用或渲染回调被删除,则会进行渲染。

块属性可用于要为该块保存的任何内容或设置。在上面的第一个示例中,使用最新的帖子块,可以将要显示的最新帖子的数量保存为属性。或者在第二个示例中,属性可以用于要在前端显示的每一条内容,例如标题文本、段落文本、图像、URL等。

下面的代码示例演示了如何创建一个动态块,该块只显示最后一个帖子作为链接。

从“@wordpress/blocks”导入{registerBlockType};从“@wordpress/data”导入{useSelect};从“@wordpress/block-editor”导入{useBlockProps};registerBlockType('gutenberg-examples/example-dynamic'{api版本:3,title:'示例:最后一篇文章',icon:'扩音器',类别:“小部件”,编辑:()=>{const blockProps=使用块属性();const posts=useSelect((select)=>{return select('core').getEntityRecords('postType','post');}, [] );返回(<div{…blockProps}>{!帖子&&“正在加载”}{posts&&posts.length===0&&“无帖子”}{posts&&posts.length>0&&(<a href={posts[0].link}>{帖子[0].title.rendered}</a>) }</div>);},} );

因为它是一个动态块,所以不需要覆盖默认值节约在客户端上实现。相反,它需要一个服务器组件。站点前面的内容取决于渲染器回调的属性寄存器块类型.

<?php(电话)/***插件名称:Gutenberg examples dynamic*/函数gutenberg_examples_dynamic_render_callback($block_attributes,$content){$recent_posts=wp_get_recent_phosts(数组(“numberposts”=>1,“post_status”=>“发布”,) );如果(count($recent_posts)===0){return'无帖子';}$post=$recent_posts[0];$post_id=$post['id'];回程冲刺('<a class=“wp-block-my-plugin-latest-post”href=“%1$s”>%2$s</a>',esc_url(获取permalink($post_id)),esc_html(获取标题($post_id)));}函数gutenberg_examples_dynamic(){//自动加载依赖项和版本$asset_file=包含(plugin_dir_path(__file_)。'build/index.asset.php');wp_注册_脚本(“gutenberg-examples-dynamic”,插件url('build/block.js',__FILE__),$asset_file[“依赖关系”],$asset_file[“版本”]);register_block_type('gutenberg-examples/example-dynamic',数组(“api版本”=>3,“editor_script”=>“gutenberg-examples-dynamic”,“render_callback”=>“gutenberg_examples_dynamic_render_calback”) );}add_action('init','gutenberg_examples_dynamic');

有几件事需要注意:

  • 这个编辑函数仍然在编辑器上下文中显示块的表示(这可能与渲染版本有很大不同,这取决于块的作者)
  • 内置节约函数只返回无效的因为渲染是在服务器端执行的。
  • 服务器端呈现是一个函数,它将块和块内部内容作为参数,并返回标记(非常类似于短代码)

注:对于常见的自定义设置,包括颜色、边框、间距自定义等,我们将在下一章如何依靠块支持以有效的方式提供此类功能。

块编辑器中的实时渲染

古腾堡2.8增加了<服务器端渲染>块,该块允许使用PHP而不是JavaScript在服务器上进行渲染。

服务器端呈现意味着一种回退;最好使用JavaScript进行客户端渲染(客户端渲染速度更快,允许更好的编辑器操作)。

从“@wordpress/blocks”导入{registerBlockType};从“@wordpress/server-side-render”导入ServerSideRender;从“@wordpress/block-editor”导入{useBlockProps};registerBlockType('gutenberg examples/example-dynamic'{api版本:3,title:'示例:最后一篇文章',icon:'扩音器',类别:“小部件”,编辑:函数(道具){const blockProps=使用块属性();返回(<div{…blockProps}><服务器端渲染block=“gutenberg-examples/example-dynamic”attributes={props.attributes}/></div>);},} );

请注意,此代码使用wp-服务器端渲染包,但不是wp-数据。请确保更新PHP代码中的依赖项。您可以使用wp-scripts自动构建依赖项(请参阅区块开发示例回购用于PHP代码设置)。