V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
McContax
V2EX  ›  问与答

WORDPRESS 网上看了很多次还是不懂 apply_filters 和 add_filter

  •  
  •   McContax · 2018-03-22 23:36:20 +08:00 · 3800 次点击
    这是一个创建于 2438 天前的主题,其中的信息可能已经有所发展或是发生改变。

    都 8102 年了,从 WORDPRESS 入手了解程序结构会很迟吗?在线等挺急的。

    apply_filters 和 add_filter 究竟是怎么样的一种关系?

    下面先说说我的理解

    通过以下一下方式加入了一个 filter

    function example_callback( $example ) {
        // Maybe modify $example in some way.
        return $example;
    }
    add_filter( 'example_filter', 'example_callback' );
    

    这种情况下,代码执行到某一步遇到某个触发点,就会有执行函数 example_callback,而 apply_filters 则是主动执行。

    apply_filters( 'example_filter', $value );
    

    在页面的某处加入这个函数,则会连到 add_filter( 'example_filter', 'example_callback' );主动执行 example_callback

    不知道我的理解有没有错误。

    如果上面的理论成立,现在来问另外一个问题。现在我从 wordpress 的 twentyeleven 入手,去了解并尝试写一个简陋主题,在 author.php:56 那里遇到了一个函数

    echo get_avatar( get_the_author_meta( 'user_email' ), apply_filters( 'twentyeleven_author_bio_avatar_size', 60 ) );
    

    在这里遇到一个问题,这个 filter 名 twentyeleven_author_bio_avatar_size,应该可以在某处见到一个类似于

    add_filter( 'twentyeleven_author_bio_avatar_size', 'the function' );
    

    但是我找翻了主题内的所有文件,硬是没见到类似函数,去 developer.wordpress.org 上面看了一下,发现只有。apply_filters( 'twentyeleven_author_bio_avatar_size', 60 )这个函数的解析,并没有说 twentyeleven_author_bio_avatar_size 这个钩子在哪里设置的。(我去 function.php 看过并没有找到)

    第一次完全用 markdown 写,可能有点恶心,见谅!

    5 条回复    2018-03-24 00:34:49 +08:00
    falcon05
        1
    falcon05  
       2018-03-23 01:44:36 +08:00 via iPhone
    那就是预留给人二次开发或者以后用的,话说我觉得并不是每个钩子都需要填上的,但是需要的时候没有那个钩子就不方便。
    cevincheung
        2
    cevincheung  
       2018-03-23 04:46:19 +08:00
    这么理解吧。

    funcs = array

    func add = ($alias,$func_name) { funcs[$alias] = $func_name }

    func apply = ($alias,$param) { if $name=funcs[$alias] { return $name(...$param) } }
    kumakiti
        3
    kumakiti  
       2018-03-23 08:17:13 +08:00 via iPhone   ❤️ 2
    这个就好像点外卖,比如我要点一碗面,外卖软件在你下单前给你很多选项,要不要葱,要不要蒜,要不要辣椒要不要香菜什么的,你一个个的调好,下单后老板开始煮面,面煮好了,要放调料,就拿出你选的选项,对照着给,要葱,不要蒜,香菜没写,那就给,辣椒也没写,默认不给。
    用户下单做选项时就是 add_filter
    老板煮好了面对着选项给调料就是 apply_filter
    McContax
        4
    McContax  
    OP
       2018-03-23 23:26:16 +08:00
    @kumakiti 还有就是第二个问题那里,只见到 apply_filters 没见到 add_filter,这个就有点难理解了,不知道是我找的方向不对还是怎么样,反正是没找到对应的 add_filter
    kumakiti
        5
    kumakiti  
       2018-03-24 00:34:49 +08:00 via iPhone
    @McContax add_filter 是主题开发者自己加的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   938 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:18 · PVG 05:18 · LAX 13:18 · JFK 16:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.