我已经设置了一个基本块,需要将帖子的上下文传递到其内部块,类似于查询块的做法,以便标题、特色图像和摘录块在新帖子而不是当前页面上工作。我这样做是为了在查询块和网站其他地方使用相同的模式进行“逗弄”。
我已经使用基本的
useSelect
进行了设置,以获取我想要的类型的所有帖子,并存储 postType
和 postId
属性。我的 block.json 有 providesContext
设置,这可以正确地将上下文传递到前端和后端的测试块。在后端,除了未加载摘录之外,这一切似乎都可以正常工作,但我在前端遇到了一些奇怪的问题,我无法解决。
如果我添加特色图像、摘录块或发布日期块,上下文将正确传递并加载正确的图像和内容。但如果我添加后标题块,这不起作用。
如果我制作包含同一组块的同步模式,则它们都不起作用。
我最初认为由于 post-title 使用的是
get_the_title()
并且没有利用它的上下文,我还需要在 render.php 中设置 postdata,所以我添加了这个,但即使这样似乎也不起作用完全设置帖子数据。
<?php
$newPost = get_post($attributes['postId']);
setup_postdata( $newPost );
?>
<div <?php echo get_block_wrapper_attributes(); ?>>
<?php echo get_the_title(); ?>
<?php echo $content; ?>
</div>
<?php wp_reset_postdata(); ?>
我的做法错了吗?我似乎在网上找不到太多关于这个主题的信息,而且文档确实没有帮助。
我一直在尝试调试它,并设置了一个使用 postId 和 postType 上下文的基本测试块,这在前端和后端工作得很好。但是,当处于放置在该提供程序块内的同步模式时,它仅获取其所在页面的 postId 和 postType,而不是来自上下文的 postId 和 postType。
在您的
render.php
中,get_post() 函数传递“null”,因此它会检索默认的帖子对象标题。要解决您的问题,请将 $newPost
传递给 get_post()
以获得特定的帖子标题,例如:
渲染.php
<?php
$newPost = get_post($attributes['postId']);
setup_postdata( $newPost );
?>
<div <?php echo get_block_wrapper_attributes(); ?>>
<?php echo get_the_title($newPost); ?>
<?php echo $content; ?>
</div>
<?php wp_reset_postdata(); ?>
作为旁注,我之前已将“特色帖子”短代码转换为块,接近您描述的“预告片”概念(不久前,在块模式之前)。我的方法与
edit.js
中的 SelectControl 类似,用于选择 postId 并将其存储为块属性。在 render.php
(或 render_callback 函数)中,我使用了一个新的 WP_Query 来检索帖子,并使用 do_blocks() 将帖子元馈送到块中以渲染块内容。
从那时起,很多事情都发生了变化,并且很可能有一种更好的“尚未记录”的方法来更轻松地做到这一点 - 如果您找到它,请发布答案/示例..