WordPress过滤器来修改最终的HTML输出
WordPress过滤器来修改最终的HTML输出
WordPress拥有出色的过滤器支持,可以获取各种特定的内容,并在输出之前修改它。比如the_content
过滤器,它可以让你访问一个帖子的标记,在其被输出到屏幕之前。我正在尝试寻找一个全方位的过滤器,以便在输出最终标记之前对其进行修改。我已经浏览了过滤器列表多次,但并没有发现什么特别吸引我的东西:https://codex.wordpress.org/Plugin_API/Filter_Reference。有人知道一个吗?
这个问题可能已经老掉牙了,但我找到了更好的方法:
function callback($buffer) { // modify buffer here, and then return the updated code return $buffer; } function buffer_start() { ob_start("callback"); } function buffer_end() { ob_end_flush(); } add_action('wp_head', 'buffer_start'); add_action('wp_footer', 'buffer_end');
解释
这个插件代码注册了两个动作 - buffer_start
和buffer_end
。
buffer_start
在html头部的末尾执行。参数,即回调
函数,在输出缓冲区的末尾调用。这发生在页面的页脚,当第二个注册的动作buffer_end
执行时。
回调
函数是您添加代码来更改输出值($buffer
变量)的地方。然后您只需返回修改后的代码,页面就会显示。
注意
确保为buffer_start
,buffer_end
和callback
使用唯一的函数名称,以便它们不会与您在插件中可能拥有的其他函数发生冲突。
WordPress没有"最终输出"过滤器,但是你可以组合一个。下面的例子在我为一个项目创建的"必须使用"插件中。
注意:我还没有测试使用"关闭"动作的任何插件。
该插件通过迭代所有打开的缓存级别,关闭它们并捕获它们的输出来工作。然后它触发"final_output"过滤器,回显过滤后的内容。
遗憾的是,WordPress执行几乎完全相同的过程(关闭打开的缓存),但实际上不捕获缓存进行过滤(仅刷新它),因此额外的"关闭"动作无法访问它。因此,以下操作优先于WordPress的操作。
wp-content/mu-plugins/buffer.php
一个接入final_output过滤器的例子:
编辑:
这段代码使用匿名函数,在PHP 5.3及以上版本中才支持。如果你正在使用PHP 5.2或更早版本运行网站,你会自寻烦恼。PHP 5.2发布于2006年,尽管WordPress(编辑:在WP版本< 5.2)仍提供支持,但你不应该使用它。