问题描述
WordPress 有很好的过滤器支持,可以获得各种特定的内容,并在输出之前对其进行修改。像”the_content” 过滤器,它允许您在输出到屏幕之前访问一个帖子的标记。
我试图找到一个 catch-all 过滤器,给我最后一个破解,在输出之前修改完整的标记。有人知道吗
我已经浏览过滤器列表了很多次,但没有任何东西跳出来:http://adambrown.info/p/wp_hooks/hook/filters
(我已经点了一些 Wordpress-specific 社区的这个问题,但没有收到一个答复,以为我会转向着名的 SO 。)
最佳解决办法
AFAIK,没有钩子,因为主题使用 HTML 不会被 WordPress 处理。
但是,您可以使用 use output buffering 来捕获最终的 HTML:
<?php
// example from php.net
function callback($buffer) {
// replace all the apples with oranges
return (str_replace("apples", "oranges", $buffer));
}
ob_start("callback");
?>
<html><body>
<p>It's like comparing apples to oranges.</p>
</body></html>
<?php ob_end_flush(); ?>
/* output:
<html><body>
<p>It's like comparing oranges to oranges.</p>
</body></html>
*/
次佳解决办法
WordPress 没有”final output” 过滤器,但您可以一起入侵。以下示例位于为项目创建的“Must Use” 插件中。
注意:我没有使用任何可能使用”shutdown” 操作的插件进行测试。
该插件通过遍历所有打开的缓冲区级别,关闭它们并捕获其输出。然后它触发”final_output” 过滤器,回应过滤的内容。
可悲的是,WordPress 几乎完全相同的过程 (关闭打开的缓冲区),但实际上并不捕获缓冲区进行过滤 (只是刷新它),所以其他”shutdown” 操作将无法访问它。因此,WordPress 的以上动作是优先的。
wp-content /mu-plugins /buffer.php
<?php
/**
* Output Buffering
*
* Buffers the entire WP process, capturing the final output for manipulation.
*/
ob_start();
add_action('shutdown', function() {
$final = '';
// We'll need to get the number of ob levels we're in, so that we can iterate over each, collecting
// that buffer's output into the final output.
$levels = ob_get_level();
for ($i = 0; $i < $levels; $i++)
{
$final .= ob_get_clean();
}
// Apply any filters to the final output
echo apply_filters('final_output', $final);
}, 0);
挂接到 final_output 过滤器的示例:
<?php
add_filter('final_output', function($output) {
return str_replace('foo', 'bar', $output);
});
第三种解决办法
问题可能是老了,但是我找到了一个更好的方式来做到这一点。
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 的头部分的末尾执行。在输出缓冲结束时调用参数 callback
函数。这发生在页面的页脚,当第二个注册的操作 (buffer_end
) 执行时。
callback
函数是您添加代码以更改输出值 ($buffer
变量) 的位置。然后,您只需返回修改后的代码,页面就会显示。
注意确保为 buffer_start
,buffer_end
和 callback
使用独特的功能名称,因此它们不会与您可能在插件中使用的其他功能冲突。
第四种办法
@jacer,如果你使用下面的钩子,header.php 也被包含。
function callback($buffer) {
$buffer = str_replace('replacing','width',$buffer);
return $buffer;
}
function buffer_start() { ob_start("callback"); }
function buffer_end() { ob_end_flush(); }
add_action('after_setup_theme', 'buffer_start');
add_action('shutdown', 'buffer_end');
第五种办法
您可以尝试查看 wp-includes /formatting.php 文件。例如,wpautop 函数。如果您正在寻找在整个页面上做某事,请查看超级缓存插件。这将最终的网页写入缓存的文件。看看 plug-in 如何工作可能会给你一些想法。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。