WordPress 插件 Filter 滤镜

优质
小牛编辑
139浏览
2023-12-01

Filter 是一组使得你的插件可以插入来修改文字的函数。被修改的文字通常是要插入到数据库或者显示给终端用户看的。WordPress Filter 允许你修改几乎任何类型的显示文字,而且其功能十分强劲。

通过Filter 你可以修改文章、Feed、怎么样在评论中的作者等,还有很多很多。

为了说明WordPress Filter 的用处,我们会继续在已经存在的Devlounge Plugin Series 代码上工作。

添加内容 Filter

有一个你可以使用的很Cool 的Filter 是 ‘the_content’。这个filter 在文章内容被显示在浏览器之前执行。我们将要添加一行文字到文章内容的末尾。

根据WordPress 插件API ,添加一个filter 的格式为:

add_filter('hook_name','your_filter',[priority],[accepted_args]);

我们只需要往DevloungePluginSeries类中添加一个函数。让我叫它addContent。

function addContent($content=''){
    $content.="<p>Devlounge Was Here</p>";
    return $content;
}

在上面的代码中,发生了以下的事件:

  • 上述函数会接受一个参数叫做content
  • 如果没有参数传递尽力,那么会设定默认值(空串)
  • 参数content被附加了一行我们自定义的文本
  • 然后重新返回了content

在向类添加了上述函数后,下一步要做的就是将它插入到’the_content’中,使得这个函数被调用。

//Actions and Filters
if(isset($dl_pluginSeries)){
    //Actions
    add_action('wp_head',array(&$dl_pluginSeries,'addHeaderCode'),1);
    //Filters
    add_filter('the_content',array(&$dl_pluginSeries,'addContent'));
}

在这段代码的第6 行你可以看到,添加了一个叫做’the_content’的filter,通过这个filter,我们的函数’addContent’会被调用。

如果插件启用,当一篇文章被显示的时候,文本“Devlounge Was Here”将会被显示到文章的末尾。

添加作者 Filter

我在这里要展示另一个使用Filter 的例子,我要展示一下怎么操纵显示一个评论的作者。我这里只是简单地让所有的作者名字都用大写显示。

我们只需要往DevloungePluginSeries类中添加一个函数。我们叫它authorUpperCase。

function authorUpperCase($author=''){
    return strtoupper($author);
}

在上述代码中,做了这些事情,上述函数会接受一个参数,叫做author如果没有参数,会被设定成默认值author
字符串会以大写的形式返回在函数被添加到类后,下一步是将它插入到’get_comment_author’中使它被调用。

//Actions and Filters
if(isset($dl_pluginSeries)){
    //Actions
    add_action('wp_head',array(&$dl_pluginSeries,'addHeaderCode'),1);
    //Filters
    add_filter('the_content',array(&$dl_pluginSeries,'addContent'));
    add_filter('get_comment_author',array(&$dl_pluginSeries,'authorUpperCase'));
}

像你在第7 行看到的,我们添加了一个’get_comment-author’ filter,然后,我们的函数’authorUpperCase’会被调用。如果插件已经启用,并且一篇日志的评论是可见的,那么评论的作者名字会以大写显示。

应用 Filter

使用Filter 可以做的更强大的是,你可以动态地调用他们。没有必要每次运行都添加一次filter。你可以在任何时候在你的代码里面调用filter。

apply_filters的格式是:apply_filter('filter name','you text');你会在这个系列的后续文章中看到apply_filters的例子。