在上一节中,虽然可以在主题中渲染了,然而搜索引擎并不能使用js来自定义web-component。因此需要考虑服务器端渲染。
主题的约定:
- 主题使用了“渲染助手”进行路由控制和渲染
- 主题在文章内容路由地址使用了
async_get_the_content
来获取文章SSR渲染结果
只要主题是使用了上述方式进行内容显示的,那么插件可以直接通过钩子进行block内容SSR渲染:
block-example/function.js
// 编辑器服务器端渲染(为搜索引擎SSR)
add_filter(`async:render_block:block-example`,async (next, last_filtered, {data}, post)=>{
var {
title,
contents,
color,
align
} = data;
// 处理内嵌的其它block
var innerBlockText = await async_render_blocks(contents.blocks, post);
next(`<div class="block-example" style="color: ${color}; text-align: ${align}">
富文本:
<div>${title}</div>
嵌入的其它内容:
<div>${innerBlockText}</div>
</div>`)
})
// 由于有内嵌的其它block,因此需要写一个方法来依次渲染内嵌的其它block
var async_render_blocks = (blocks, post)=>{
async function fn() {
var result_content = "";
for (var i = 0; i < blocks.length; i++) {
var block = blocks[i];
var block_data = await apply_async_filters(`async:render_block:${block.type}`,"", block, post);
result_content += block_data;
}
return result_content;
}
return fn();
}