关于WordPress Twenty Seventeen主题twentyseventeen_starter_content过滤器的疑问
关于Twenty Seventeen主题中
twentyseventeen_starter_content过滤器的疑问 嘿,这个问题其实挺常见的,刚接触WordPress过滤器机制的时候很容易搞混apply_filters和add_filter的关系,我来给你理清楚:
首先得明确两个核心概念:
add_filter($hook, $callback)是给某个钩子注册回调函数,告诉WordPress“当这个钩子触发时,执行我的函数来修改数据”;apply_filters($hook, $data)是触发这个钩子,把$data传给所有注册到该钩子的回调函数,最后返回修改后的结果。
回到Twenty Seventeen主题的情况:
主题里写$starter_content = apply_filters( 'twentyseventeen_starter_content', $starter_content );,本质是开放一个可定制的入口,而不是说主题自己必须给这个钩子注册回调。
具体流程是这样的:
- 主题先定义了一套默认的初始内容(starter content)数组,比如包含默认页面、菜单、小工具等配置;
- 通过
apply_filters('twentyseventeen_starter_content', $starter_content),把这套默认内容“交出去”,允许任何外部代码(比如子主题、插件)修改它; - 最后把修改后的内容传给
register_theme_support('starter-content', $starter_content),完成初始内容的注册。
主题本身没有给这个钩子加add_filter,是因为它不需要自己修改自己定义的默认内容——这个钩子是专门留给你(或者其他开发者)来定制的。比如你想修改默认的首页内容,完全可以在子主题的functions.php里写:
add_filter( 'twentyseventeen_starter_content', 'my_custom_twentyseventeen_starter' ); function my_custom_twentyseventeen_starter( $content ) { // 替换默认首页的内容 if ( isset( $content['posts'][0] ) ) { $content['posts'][0]['post_content'] = '这是我自定义的首页内容!'; } return $content; }
这样当主题触发apply_filters时,你的回调函数就会被执行,修改后的初始内容就会生效。
总结一下:不是每个apply_filters都必须有对应的add_filter在同一个文件里,apply_filters的核心价值是提供可扩展性,让外部代码能够介入和修改主题/核心的默认数据。
内容的提问来源于stack exchange,提问作者peter Schiza
相关产品推荐
相关产品推荐

