【问题标题】:Custom hooks in WordPress across pluginsWordPress中跨插件的自定义钩子
【发布时间】:2010-06-24 15:49:57
【问题描述】:

我正在尝试在一个 Wordpress 插件中创建一个可供其他插件使用的钩子。首先,这可能吗?我还发送了一些额外的参数,所以这可能是两个问题合二为一,因为我一直无法找到有关如何执行此操作的确切信息。

这是我迄今为止尝试过的:

在创建钩子的插件(称为插件 1)中,我添加了:

do_action('plugin1_hook', $customArg1, $customArg2, $customArg3);

在我想要钩子开火的时候。然后,在另一个插件(插件 2)中,我添加了:

add_action('plugin1_hook', 'my_function');

function my_function($customArg1, $customArg2, $customArg3) { //my code }

但是,这似乎并没有触发该功能。 我对此的参考是 Wordpress 钩子 comment_post,它由 Wordpress 定义为:

do_action('comment_post', $comment_ID, $commentdata['comment_approved']);

我使用的是:

add_action('comment_post', 'my_comment'); 
function my_comment($comment_id) { //my code }

上面的sn-p运行正常。

【问题讨论】:

    标签: php wordpress hook


    【解决方案1】:

    我想我会发布这个作为答案,因为它解释得更清楚:)

    当你挂钩一个函数,但没有指定参数的数量时,WordPress 总是会传回一个参数。

    这样的事情不会出错;

    function do_my_hook($arg1, $arg2 = '', $arg3 = '') {}
    add_action('my_hook', 'do_my_hook');
    

    但你会为了这样的事情;

    function do_my_hook($arg1, $arg2, $arg3) {}
    add_action('my_hook', 'do_my_hook');
    

    WordPress 正在尝试调用do_my_hook(),但它只传回一个参数。第一个示例使用PHP default function arguments,这样您就可以在不传递所有可用参数的情况下调用函数,但不会出错。

    第二个示例将触发“缺少参数”PHP 错误,因为所有三个参数都是必需的。

    解决办法?

    add_action('my_hook', 'do_my_hook', 10, 3);
    

    定义函数接受多少参数背后的想法是避免此类错误(尽管从技术上讲,使用默认参数很容易避免这些错误!)。

    【讨论】:

      【解决方案2】:

      我的猜测是第二个插件是在第一个插件之后加载的,所以当你向它添加动作时,钩子已经触发了。你可以试试这个第一个插件:

      function my_custom_hook_insertion($arg1, $arg2, $arg3){
        do_action('plugin1_hook', $arg1, $arg2, $arg3);
      }
      add_action('plugins_loaded', 'my_custom_hook_insertion');
      

      这将等到所有插件都加载完毕后再触发钩子。

      【讨论】:

      • 我正在做的是使用评论投票插件,直到有人对评论进行投票,钩子才会触发。我仍然想知道订单是否会影响事情 - 我猜 add_action 可以随时调用,只要之后触发 do_action 就可以工作。
      • Ryan 差不多就是这样 :) John 的解决方案应该会奏效,因为它会等待所有插件加载完毕后再触发 do_action
      【解决方案3】:

      将我的 add_action 更改为此解决了问题:

      add_action('plugin1_hook', 'my_function', 10, 3);
      

      10 代表优先级,3 代表函数将采用的 args 数量。我不确定匹配是如何工作的,因为默认值为 1,并且我使用了很多钩子而没有指定 0 个参数,并且我使用了传递超过 1 个参数但在我的函数签名中只使用了 1 个参数的钩子。来源:WordPress Codex: Function Reference/add action

      它正在工作,因此可以使用跨插件挂钩。

      【讨论】:

        猜你喜欢
        • 2013-05-01
        • 2023-03-19
        • 1970-01-01
        • 2015-03-24
        • 2015-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-19
        相关资源
        最近更新 更多