跳到内容
新问题

有关于这个项目的问题吗?注册一个免费的GitHub帐户以打开一个问题,并联系其维护者和社区。

单击“注册GitHub”,表示您同意我们的服务条款隐私声明。我们偶尔会向您发送与帐户相关的电子邮件。

已经在GitHub上了?登录到您的帐户

使用输出缓冲区和HTML标记处理器在BODY标记上注入指令以进行全页面客户端导航 #61212

已合并

对话

威斯顿鲁特
复制链接
成员

@威斯顿鲁特 威斯顿鲁特 评论2024年4月29日

什么?

这实现了来自的此任务的解决方案#60951:

  • 探索如何在不受黑客攻击的情况下修改body标签:链接.

为什么?

作为讨论,代码当前正在注入另一个<body>在BODY已经打开后标记,如下所示:

<!DOCTYPE html>
<html格式 ="英语">
  <>
    < 字符集="utf-8型">
  </>
  <身体>
    <小时1>你好,世界!</小时1>
    <身体 数据-wp-context="{}"数据wp交互="堆芯/实验">
  </身体>
</html格式>

令人惊讶的是(至少对我来说),这实际上作品:

形象

考虑到HTML的松散解析规则,也许我不应该感到惊讶。但我可以想象,其他试图解析HTML以应用各种优化的插件在遇到多个BODY标记时可能会感到困惑。

属性可以被注入到现有的BODY标签上,而不是使用HTML标签处理器。我认为这目前是不可能的,因为BODY标签是硬编码的模板canvas.php。这再次提出了对整个模板进行输出缓冲的问题(芯-43258). 这是我在绩效团队的背景下一直在努力的事情优化侦探该插件输出缓冲整个模板,然后使用HTML标记处理器进行优化。

怎么用?

本请购单复制了相同的输出缓冲方法取自Optimization Detective插件。由于没有用于渲染模板输出的现有过滤器,因此它会在模板开始渲染之前立即启动输出缓冲区模板_包含 滤波器.

测试说明

  1. 启用“使用交互API启用完整页面客户端导航”实验。
  2. 转到前端。
  3. 确保数据wp交互数据-wp-context属性显示在BODY上。(应该只有一个<body>在查看HTML源代码时启动标记。)
  4. 确保客户端导航按预期工作。

@dmsnell公司
复制链接
成员

dmsnell公司 评论2024年4月29日

令人惊讶的是,这确实有效

事实上,这并不奇怪,因为这正是HTML5指定BODY和HTML标记的工作方式。

对于令牌上的每个属性,检查该属性是否已经存在于身体元素(第二个元素)开放元素堆栈如果不是,则将属性及其相应的值添加到该元素。

虽然您强调了下游解析器可能无法为BODY标记获取正确的属性集,但每个浏览器应该这并不是“HTML的松散解析规则”,而是HTML的极端确定性正在分析规则😉. 通过附加多个BODY标记向BODY元素添加属性是完全可靠的。这可能不太理想,但也有可能(这是HTML API中“追溯更改”的挑战之一,因为我们可能会错过BODY具有给定的类名直到我们正在深入研究文档)。

复制链接

github-操作 机器人程序 评论2024年4月29日

以下账户与本公关和/或相关问题进行了互动。当活动发生时,我将继续更新这些列表。您还可以通过添加支柱支架标签。

如果您通过GitHub上的拉请求合并代码,请将以下内容复制并粘贴到合并提交消息的底部。

合著者:韦斯顿鲁特<westonruter@git.wordpress.org>合著者:dmsnell<dmsnell@git.wordpress.org>合著者:cbravobernal<cbravobernal@git.wordpress.org>

为了理解WordPress项目对贡献者的期望,请查看核心手册中的贡献者归因页面.

复制链接
成员

@dmsnell公司 dmsnell公司 留下了评论

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

我喜欢这一点,但我也想指出,我们可以通过游乐场在Core中与Gutenberg PR相结合,轻松测试这一点。

从探索Core中的解决方案开始是否可行?无论如何,我想建立这条新管道,我们可能会通过这种需求来开拓这条管道。

想得更少古腾堡模板输出缓冲区更像是WordPress的最后一关,其中包括一些钩子在标签主体上on_attribute__href。我不知道这些是怎么实现的,但在这种情况下,代码可能更像以下…

添加操作(_A)('模板_包含',静止的 功能() {添加操作(_A)('在标签主体上',静止的 功能($处理器) {//检查这些是否已设置。。。
		$处理器->设置属性(_A)('数据-wp-…', … );$处理器->设置属性(_A)('数据-wp-…', … );},1,10);},0,PHP_INT_最大值);

我不太喜欢这样的性能敏感代码中的动作和过滤器;也许还有另一个选择可以探索。尽管如此,其想法是与HTML事件挂钩,而不是创建面向内容的过滤器和操作。

库/实验/全文-客户端-导航.php 过时的 显示已解决 隐藏已解决
);
返回$passthrough;
}
add_filter('模板_包含','_gutenberg_buffer_template_output',PHP_INT_MAX);
复制链接
成员

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

动作不是一个返回值被忽略的过滤器吗?我们可以消除$直通如果我们做到了添加操作()我们不能吗?

复制链接
成员 作者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

不幸的是,添加操作()定义为别名:

功能 添加操作(_A)($挂钩_名称,$回调,$优先=10,$接受_参数=1) {返回 添加筛选器($挂钩_名称,$回调,$优先,$接受_参数);}

因此,如果回调没有返回值,那么过滤器就会中断。我刚刚测试了:

diff—git a/lib/terimental/fullpage-client-side-navigation.php b/lib/teritial/fullPage-clients-side-navigation.php索引259517cfc84..452abee6c63 100644---a/lib/实验/全页客户端-侧导航.php
+++b/lib/experimental/fullpage-client-side-navigation.php
@@ -68,12 +68,8 @@add_filter(“gutenberg_template_output_buffer”,“gutenberg_add_client_side_navi”*}elseif(current_user_can('switch_themes')){**@链接https://core.trac.wordpress.org/ticket/43258-*
-*传递的template_include筛选器的@param string$passthrough值。
-*
-*@return string$passthrough的未修改值。*/-函数_gutenberg_buffer_template_output(字符串$passthrough):字符串{
+函数_gutenberg_buffer_template_output(){ob_启动(静态函数(string$output):string{/**@@ -85,6 +81,5 @@函数_gutenberg_buffer_template_output(字符串$passthrough):字符串{return(string)apply_filters('gutenberg_template_output_buffer',$output);});-返回$passthrough;}-add_filter('模板_包含','_gutenberg_buffer_template_output',PHP_INT_MAX);
+add_action('template_include','_gutenberg_buffer_template_output',PHP_INT_MAX);

结果是一个空页面,因为if($template)此处未输入条件:https://github.com/WordPress/WordPress-develop/blob/204a1bbf4e5f22b07a93c1f4a0b12bdd65d6483f/src/wp-includes/template-loader.php#L105-L112级

复制链接
成员

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

该死。你打破了我对这件事的理解。我猜do_action()只忽略返回值,但应用过滤器()不关心是否添加了某些内容作为筛选器或操作。

合著者:dmsnell<dmsnell@git.wordpress.org>
@威斯顿鲁特
复制链接
成员 作者

威斯顿鲁特 评论2024年4月29日

从探索Core中的解决方案开始是否可行?无论如何,我想建立这条新管道,我们可能会通过这种需求来开拓这条管道。

@dmsnell公司对于核心,我认为这将以如下方式降落:

diff—git a/wp-includes/template-loader.php b/wp-includes/ttemplate-loader-php索引0fd08545..119df0f3 100644---a/wp-includes/template-loader.php
+++b/wp-includes/template-loader.php
@@ -102,6 +102,9 @@if(wp_using_themes()){*@param string$template要包含的模板的路径。*/$template=应用过滤器('template_include',$tempte);+
+ob_start('wp_template_output_buffer_callback');
+if($template){包括$template;}elseif(current_user_can('switch_themes')){

在哪里?wp_template_output_buffer_callback()将被定义为:

功能 wp_模板_输出_缓冲区_回调(一串 $输出):一串{/**
*在发送到客户端之前过滤模板输出缓冲区。
*
*@param string$output输出缓冲区。
*@return string已筛选输出缓冲区。
*/
	返回(一串)应用程序筛选器('wp_模板_输出_缓冲区',$输出);}

(旁白:这还需要考虑非HTML响应。完成于300d9e3型.)

但您是说原始HTML输出根本不应该是可过滤的,而应该只能通过HTML标记处理器访问?我会注意到,还有其他能够访问原始响应的用例,例如通过中所述的过滤器芯-43258例如缓存插件和优化插件。目前,所有这些插件都必须重新发明轮子,对整个响应进行自己的输出缓冲。

return(字符串)$p.'<body-data-wp-interactive=“core/experimental”data-wp-context=“{}”>';
函数gutenberg_add_client_side_navigation_directives($response_body){
$is_html_content_type=假;
foreach(headers_list()作为$header){
复制链接
成员 作者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

WordPress/性能#1189我通过预置改进了它的可测试性'内容类型:'。ini_get('default_mimetype')添加到此列表中。

复制链接
贡献者

@卡布拉沃伯纳尔 卡布拉沃伯纳尔 留下了评论

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

这段代码对我来说很好。它是实验性的,不会包含在版本6.6中,但最好不要让它停留太久。

@卡布拉沃伯纳尔 卡布拉沃伯纳尔合并提交58亿454亿进入之内 大旅行箱 2024年5月27日
63项检查通过
@卡布拉沃伯纳尔 卡布拉沃伯纳尔删除了 更新/客户端导航定向添加 分支 2024年5月27日12:01
@github-操作 github-操作 机器人程序将此添加到古腾堡18.5里程碑2024年5月27日
@dmsnell公司
复制链接
成员

但您是说原始HTML输出根本不应该是可过滤的,而应该只能通过HTML标记处理器访问?我会注意到,还有其他能够访问原始响应的用例,例如通过中所述的过滤器芯-43258例如缓存插件和优化插件。目前,所有这些插件都必须重新发明轮子,对整个响应进行自己的输出缓冲。

不,不是这样。我想说的是,我想找到一个能够满足人们需求的界面,它比每个人都进行自己的过滤时更容易、更可靠、更具性能。

具体来说,如果我们能够将所有内容的20x+次迭代转化为一次迭代,并为该“区块”或“事物”提供20x+个过滤器,那么我们就有可能赢得巨大的性能改进。例如,如果Core公开了一种过滤属性值的方法,而不是过滤原始HTML,并且给定了它所在的标签和内容,那么可能会有很多插件自愿删除自己的过滤代码。

功能 添加blank_opener($标记名,$属性_名称,$价值) {返回`{$价值}_空白`;}添加筛选器('html属性目标','添加blank_opener',10,);

@齐奥罗
复制链接
成员

具体来说,如果我们可以将所有内容的20次以上迭代转换为一次迭代,并为该“块”或“东西”使用20次以上的过滤器,那么我们就有可能获得巨大的性能改进

衡量跑步的影响会很好应用过滤器()在每个HTML标记上,因为对于较大的文档,即使最终只检查是否定义了过滤器,这些数字也会很快累加起来。同时,我理解其中的原因,因为今天这些操作中的一些操作在相同的HTML部分甚至整个主体上的执行方式有所不同。

@dmsnell公司
复制链接
成员

@齐奥罗它将被广泛测量😉

尽管我预测,出于性能原因,我们可能不会直接使用过滤器。

然而,据我所知,现有的情况可能更糟,因为每个过滤器都会将整个文档分割开来,并迭代每个标记。在最坏的情况下,我们可能会跳过很多工作

卡斯廷轴子推送提交致carstingaxion/gutenberg引用的这个拉请求 2024年6月4日
…标记用于全页客户端导航(WordPress#61212)*通过标记处理器和输出缓冲注入客户端导航指令*修复render_block phpdoc的类型*消除使用render_block过滤器*删除copy-past since标记合著者:dmsnell<dmsnell@git.wordpress.org>*确保客户端指令仅添加到HTML响应正文---------合著者:韦斯顿鲁特<westonruter@git.wordpress.org>合著者:dmsnell<dmsnell@git.wordpress.org>合著者:cbravobernal<cbravobernal@git.wordpress.org>
@下一个端
复制链接

下一个端 评论2024年6月5日

@威斯顿鲁特我们在900k+插件中使用输出缓冲,根据我的经验,我建议进行以下更改:

<?php(电话)
功能 _古腾堡缓冲区模板输出(一串 $直通(passthrough)):一串{对象启动(_S)(静止的 功能(一串 $输出, ?整数 $阶段):一串{如果($阶段&PHP_输出_处理器_最终) {/**
*在发送到客户端之前过滤模板输出缓冲区。
*
*@param string$output输出缓冲区。
*@return string已筛选输出缓冲区。
*/
				返回(一串)应用程序筛选器('古腾堡模板输出缓冲区',$输出);}返回 $输出;});返回 $直通(passthrough);}

我记得当ob_清洁对象刷新(_F)在输出缓冲区打开时调用。它在丢弃输出时跳过对输出的处理。

柏油vipul推送提交帕蒂尔·维普尔/古腾堡引用的这个拉请求 2024年6月17日
…标记用于全页客户端导航(WordPress#61212)*通过标记处理器和输出缓冲注入客户端导航指令*修复render_block phpdoc的类型*消除使用render_block过滤器*删除copy-past since标记合著者:dmsnell<dmsnell@git.wordpress.org>*确保客户端指令仅添加到HTML响应正文---------合著者:韦斯顿鲁特<westonruter@git.wordpress.org>合著者:dmsnell<dmsnell@git.wordpress.org>合著者:cbravobernal<cbravobernal@git.wordpress.org>
@威斯顿鲁特
复制链接
成员 作者

@下一个端谢谢您。我已经打开了#62770实现这一点。

@威斯顿鲁特
复制链接
成员 作者

@下一个端我做了相当多的研究,我发现没有检查它是否在PHP_输出_处理器_最终阶段,它应该打开输出缓冲区,而不使用PHP_输出_处理器_可润滑标记,然后短路,如果$阶段PHP_输出_拾取器_清洁。请参阅WordPress/performance#1317(评论)。这允许模板调用对象清理(_clean)如预期对象刷新(_flush)没有效果,因此不会导致片段通过预期为整个文档的筛选器发送。

线条上的注释+88+98
ob_启动(
静态函数(string$output):string{
/**
*在发送到客户端之前过滤模板输出缓冲区。
*
*@param string$output输出缓冲区。
*@return string已筛选输出缓冲区。
*/
return(string)apply_filters('gutenberg_template_output_buffer',$output);
}
);
复制链接
成员 作者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

基于WordPress/性能#1317,我认为现在应该改进如下:

建议的更改
ob_启动(
静止的 功能(一串 $输出):一串{
/**
*过滤器发送到客户端之前的模板输出缓冲区。
*
*@param字符串$输出输出缓冲器.
*@return字符串已筛选输出缓冲区。
*/
返回(一串)应用程序筛选器('古腾堡模板输出缓冲区',$输出);
}
);
ob_启动(
静止的 功能(一串 $输出):一串{
//清除输出时(例如,挂起的模板被错误页面替换),不要通过过滤器发送。
如果( ($阶段&PHP_输出_拾取器_清洁) !==0) {
返回 $输出;
}
/**
*过滤器发送到客户端之前的模板输出缓冲区。
*
*@param字符串$输出输出缓冲器.
*@return字符串已筛选输出缓冲区。
*/
返回(一串)应用程序筛选器('古腾堡模板输出缓冲区',$输出);
},
0,
PHP_输出_手柄_STDFLAGS^PHP_输出_处理器_可润滑
);

免费注册 在GitHub上加入此对话.已经有帐户了吗?登录以发表评论
标签
[功能]交互API 用于向块添加前端交互的API。 [软件包]交互性 /包/交互性 [类型]实验 实验功能或API。
项目
还没有
开发

成功合并此请求可能会解决这些问题。

5名参与者