WordPress 改现有函数的输出,别动主题文件,用 filter 挂上去

· wordpress · 阅读 5
摘要

上周有人问我,主题输出的文章摘要末尾带了个「…」,想换成「阅读全文」。他改的是主题里的 functions.php,改完是生效了,主题一更新全没了。这活儿本来就该用 filter 干。 先找有没有现成的 filter WordPress 的

上周有人问我,主题输出的文章摘要末尾带了个「…」,想换成「阅读全文」。他改的是主题里的 functions.php,改完是生效了,主题一更新全没了。这活儿本来就该用 filter 干。

先找有没有现成的 filter

WordPress 的好处是核心和主题都留了钩子。摘要这块通常是 excerpt_length 和 excerpt_more 两个,翻一下 wp-includes/formatting.php 里 wp_trim_excerpt 附近能对上台。

add_filter('excerpt_more', function () {
    return ' ... 阅读全文';
});

注意 get_permalink() 不传参数时取的是当前文章,在循环里能用,跳出循环就取到别的了。我一开始在头部模板里调,结果所有摘要都链到同一篇。

优先级参数别乱填

add_filter 第四个参数是优先级,默认 10。数字越小越先跑。有的人看别人写 99 就跟着抄,其实 99 是最后执行,如果你的函数依赖前面某个 filter 的结果,跑到最后反而拿不到。

我的习惯是能不传就不传,默认 10 够用。真撞车了再调,别提前猜。

改不动的就换思路

也有函数压根没留 filter。这种情况两个选择:一是用 str_replace 在外层包一道 the_content 之类的钩子,做字符替换;二是干脆弃用它,自己写个等价的。

第一种能跑但不优雅,遇到多语言或者 HTML 属性里刚好有同名字符串就会误伤。我一般优先选第二种。

说到底一句话:能挂钩子的地方就别动文件。主题更新是常态,改过的文件活不过三个月。