About Hooks and Filters

时间:2012-08-18 作者:vajrasar

嗯,我很难理解动作和过滤器之间的区别。我确实在代码中使用动作,但我是一个新手,甚至连一点过滤器都不知道。

我去过codex,以及NickTheGeek、BillErickson、GaryJones等的多个网站,但没有去过vein。

如果你能用简单的话告诉我,并举例说明动作、过滤器和挂钩的基本内容和区别。

非常感谢。

2 个回复
最合适的回答,由SO网友:Brad Dalton 整理而成

鉴于您已经引用了3位Genesis开发人员,我想用2段Genesis代码片段以及2个WordPress动作挂钩和过滤器示例来回答这个问题。

Hooks

Genesis中的不同模板文件包括挂钩,它使您能够在模板的那个位置执行PHP代码。

这里有一个visual guide 显示了《创世纪》中的所有钩子。

如果您查看genesis>lib>framework。php文件,您将找到所有在循环加载时加载的特定于主题的操作挂钩。

do_action( \'genesis_after_loop\' );
上面的钩子在名为loop\\u end的WordPress钩子之后执行。你可以使用Genesis中WordPress中包含的任何钩子,以及所有Genesis主题特定的钩子。

下面是一个非常基本的示例,说明如何在子主题中使用WordPress和Genesis动作挂钩,在主题中的特定位置添加内容。

add_action( \'genesis_after_loop\', \'add_text_after_loop\' );
function add_text_after_loop() {
echo \'Hello World - Genesis After Loop Hook\';
}
这里有一个非常类似的WordPress挂钩,你可以在Genesis或任何其他主题中使用它来显示循环后的内容。

add_action( \'loop_end\', \'add_text_after_loop_end\' );
function add_text_after_loop_end() {
echo \'Hello World - WordPress Loop End Hook\';
}
要测试这些挂钩,可以将这两个代码段添加到子主题函数文件中,以查看文本“Hello World”的确切显示位置。然后,您可以使用可视挂钩向导将挂钩更改为任何其他挂钩,以确定要输出文本的位置。

enter image description here

从上面可以看到,在同一位置的两个挂钩的注释表单之后都会显示Hello World文本。

Filters

Genesis中的不同文件包括过滤器,可用于修改父主题函数的默认输出。

Genesis中过滤器的代码如下所示:

$post_info = apply_filters( \'genesis_post_info\', \'[post_date] \' . __( \'by\', \'genesis\' ) . \' [post_author_posts_link] [post_comments] [post_edit]\' );
以上代码行可以在genesis>lib>structure>post中找到。php文件。

这是包含名为genesis\\u post\\u info的过滤器的代码,您可以在子主题函数文件中使用该过滤器来修改作者、日期、评论等的帖子信息:

add_filter( \'genesis_post_info\', \'sp_post_info_filter\' );
function sp_post_info_filter($post_info) {
$post_info = \'[post_date] by [post_author_posts_link] [post_edit]\';
return $post_info;
}
在上面的示例中,我删除了注释链接的快捷码,因此只有日期、作者和编辑链接将返回并显示在条目标题之后。

这是一个经典示例,说明了如何使用过滤器通过子主题更改原始函数,而无需编辑父主题中的默认函数代码。

此过滤器仅适用于Genesis,在WordPress中不可用。

下面是一个自定义函数的示例,它可以与Genesis和任何其他主题一起使用,因为它包含在核心WordPress文件中,因此可以在任何主题中使用。

add_filter( \'excerpt_length\', \'sp_excerpt_length\' );
function sp_excerpt_length( $length ) {
return 50; // pull first 50 words
}
上面的代码允许您修改任何主题中帖子摘录的长度。

来源http://my.studiopress.com/snippets/

SO网友:Chip Bennett

过滤器过滤内容。动作执行动作。

例如,帖子内容通过过滤器传递,例如:

echo apply_filters( \'the_content\', $content );
这意味着,如果添加了任何过滤器,即通过add_filter( \'the_content\', \'callback_name\' ), 默认值$content 由指定的回调修改并返回。

另一方面,操作只是一个执行指定代码的位置。例如,wp_head 是一个动作:模板中执行代码的位置(例如wp_enqueue_script(), 等等)。

像往常一样,Otto has a great write-up that goes more in-depth.

结束

相关推荐

Add_Filters()和Apply_Filter()有什么作用?

我有点困惑,为什么这不起作用-尽管必须说,我不太确定是什么apply_filters() 和add_filter 正在做,所以任何一般性的提示都会很好!我想要一个查询,在一个帖子页面上显示之前的五篇帖子。我正在发送当前帖子的日期,并希望应用一个过滤器,过滤出早于此的帖子。function sw_filter_posts_before( $where = \'\', $date) { $where .= \" AND post_date < \'\" . $date . \"