wordpress如何替换最终输出的内容

作者

网站升级的时候,有个需求,需要把wordpress生成的内容,部分关键词进行替换。找了一下wordpress的过滤器,没找到。估计这个很少用。wordpress过滤器没有这个东西,可以用wordpres的动作加上php中的ob_*函数来完成这样的修改需求。

wordrepss 对输出的内容进行替换
wordrepss 对输出的内容进行替换

首先要理解php中的ob-* 函数。这类函数是用来进行输出控制的。可以看一下php官方是如何解释的。

当PHP脚本有输出时,输出控制函数可以用这些来控制输出。这在多种不同情况中非常有用,尤其是用来在脚本开始输出 数据后,发送http头信息到浏览器。输出控制函数不影响由 header() 或 setcookie()发送的文件头信息,仅影响象 echo这样的函数和PHP代码块间的数据。

worpdress替换输出内容的工作的原理

wordpress 执行到加载网站模板之前时候,通过 ob_start 打开一个缓冲区,这样以后输出的内容,都会被保存在这个缓冲区中。当最终wordpress执行要结束的时候。获取这个缓冲区的内容,然后进行替换,替换后输出。

worpdress替换输出内容 需要用的函数和wordpress的相关动作

php 函数 ob_start

bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )

看一个php手册的解释

此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。内部缓冲区的内容可以用 ob_get_contents() 函数复制到一个字符串变量中。 想要输出存储在内部缓冲区中的内容,可以使用 ob_end_flush() 函数。另外, 使用 ob_end_clean() 函数会静默丢弃掉缓冲区的内容。

非常有用的一个参数 output_callback

可选参数 output_callback 函数可以被指定。 此函数把一个字符串当作参数并返回一个字符串。 当输出缓冲区被( ob_flush(), ob_clean() 或者相似的函数)冲刷(送出)或者被清洗的时候;或者在请求结束之际输出缓冲区内容被冲刷到浏览器的时候该函数将会被调用。 当调用 output_callback 时,它将收到输出缓冲区的内容作为参数 并预期返回一个新的输出缓冲区作为结果,这个新返回的输出缓冲区内容将被送到浏览器。 如果这个 output_callback 不是一个可以调用的函数,此函数 会返回 FALSE 。

wordpress的动作列表 https://codex.wordpress.org/Plugin_API/Action_Reference

只要在加载模板模板之前的动作都可以,这里选择 wp_loaded

最终的代码

function senlin_wp_replace($html) {
   $hmlt = str_replace("old_string", "new_string", $html);
    return $html;
}

add_action('wp_loaded', function () {
    ob_start('senlin_wp_replace');
});

前面说的了一大堆的东西,就是记录一下笔记。最终输出的代码,只用几行就可以搞定。可以看到代码里并没有,获取缓冲区的内容。因为php文档里写的很清楚或者在请求结束之际输出缓冲区内容被冲刷到浏览器的时候该函数将会被调用。反正发送给浏览器之前,函数会被自动调用。

一条评论

回复

电子邮件地址不会被公开。