关于过滤器和挂钩的澄清

时间:2013-06-20 作者:bigpotato

我即将开始我的第一个WordPress项目,我的任务是将覆盖核心的定制核心代码移动到单独的函数/文件中(这样在将来升级时更容易维护)。

我一直在做研究add_filterapply_filterdo_actionadd_action 似乎是要走的路。但我仍然不确定它们是如何工作的。这些方法是我用来覆盖核心方法的吗?我很困惑,因为add_filter 使用单词add 当我觉得这更符合replaceoverwrite (除非我有误解)

我刚读了第一个答案this (关于玉米饼的那篇)

因此,作者在描述如何使用add\\u过滤器时使用了三个步骤:

Step 1: $taco变量的静态值

<?php $taco = \'chicken\'; ?>

Step 2:

    <?php
    $taco = apply_filters( \'get_taco\', \'chicken\' );
    ?>

Step 3:

    <?php
    add_filter( \'get_taco\', \'my_special_order\' );
    function my_special_order( $content ) {
        return \'shredded beef\';
    }
    ?>
所以在这种情况下apply_filter 只需动态创建一个方法并使其返回chicken 一串或者这里假设有一个核心WordPress方法get_taco 使用apply_filter 是否有助于覆盖原始功能?

还有,你只能apply_filter 你已经add_filter埃德?换句话说apply_filter(\'get_taco\'); 如果我没有定义,则不起作用add_filter(\'get_taco\', \'my_special_order\');function my_special_order ($content) ... 第一

我是否在函数中放置这些过滤器。php文件?很抱歉问你这么多问题,我来自Ruby on Rails,所以我对WordPress一无所知。

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

我很困惑,因为add\\u filter在我觉得更像是替换或覆盖时使用了add这个词(除非我有误解)

你误会了。二者都add_actionadd_filter 将函数回调插入到一种队列中。您可以向同一个挂钩添加许多回调,它们将按照添加的顺序触发,除非优先级包含在第三个参数中。

因此,在这种情况下,apply\\u过滤器是否只是动态创建一个动态方法,并使其返回chicken字符串?

apply_filters -- 注意,“s”或多或少创建了过滤器,但通常会传递一个变量而不是字符串,该变量会传递给回调函数,然后回调函数会修改它并返回它。

过滤器“slug”通常不是WordPress核心函数或方法的名称,尽管有些函数具有相同名称的过滤器。例如the_content() 调用the_content 滤器

钩子通常不会覆盖整个函数,只覆盖其中的一部分,但也存在异常和近似异常。

此外,您是否只能应用已添加\\u筛选的内容?

不,相反。你只能add_filter 一些apply_filtered.您可以使用add_filter(\'whatever\',\'abc\'); 但如果没有apply_filter(\'whatever\',... 在某处

几乎同样的情况也适用于add_action/do_action 但行动是为了做事,而不是为了回报价值。

钩子在页面加载中的不同时间以及函数和方法中的不同位置执行。例如save_post 在接近结束时执行wp_insert_post 虽然pre_get_posts 在接近get_posts 的方法WP_Query 班其他在中执行the middle of the page load 而不是在函数或方法中。它们在需要(由开发人员确定)更改或添加信息、运行其他功能、重定向页面等的地方执行。

更多信息

Difference Between Filter and Action Hooks?

SO网友:Krzysiek Dróżdż

我想你弄错了一点。

过滤器和动作是您“分配”给挂钩的函数。WordPress在很多地方都会打电话do_actionapply_filter 功能。这些函数的第一个参数是hook name。

例如,当你看到

do_action(\'blabla\');
这意味着将调用分配给“blabla”挂钩的所有操作。

add_filteradd_action 不会覆盖任何内容。它完全按照它所说的做-它将您的函数分配给给定的钩子。

所以你的第二步。应用筛选器get_taco 到静态值chicken. 应用过滤器是指它调用分配给get_taco

您的步骤3。创建新函数my_special_order 并将其分配给get_taco 钩所以只要有apply_filter(\'get_taco\') 调用,将调用您的函数。

如果没有为给定的钩子分配过滤器/操作,则不会执行任何操作。

您可以在此处阅读有关此主题的更多信息:http://codex.wordpress.org/Plugin_API

结束

相关推荐

将subdir多站点安装更改为subdir core目录结构

既然WordPress 3.5应该使用子目录中的核心文件,我决定将本地开发设置(子目录multisite)移动到该配置。快进一步,我有以下内容:wordpress (3.5芯)wp-content (内容目录,通过配置WP_CONTENT_DIR 和WP_CONTENT_URL).htaccess 使用:RewriteEngine On RewriteBase / RewriteRule ^index\\.php$ - [L] # uploaded files R