使用wp init钩子调用其他钩子?


11

我想根据WordPress主题或插件开发是否是一种好的做法。

add_action('init','all_my_hooks');

function all_my_hooks(){

// some initialization stuff here and then

add_action('admin_init',-----);
add_action('admin_menu',----);

// more like so

}

谢谢

Answers:


16

通常:是,请等待专用的挂钩启动您自己的代码。永远不要将对象实例扔到全局名称空间中。但是init几乎没有必要。

您要尽可能早点上钩。如果您的第一个代码在运行,wp_head请不要使用较早的钩子。您甚至可以层叠钩子

add_action( 'wp_head', 'first_callback' );

function first_callback()
{
    // do something
    // then
    add_action( 'wp_footer', 'second_callback' );
}

关于init挂钩:请wp_loaded改用。那initms_site_check()被调用之后 运行。这样,您可以避免在多站点安装的无效子站点上运行插件。其他一切都一样。


3
+1 wp_loaded和MS信息。
kaiser 2012年

非常感谢您的答复,仍然是一个疑问,最好将所有其他钩子加载到wp_loaded内还是单独加载?我想知道是否在wp_loaded中添加钩子,它们会更早被钩住,而不是在admin_init或admin_menu之后被钩住?
atinder 2012年

级联钩子不是问题吗?
atinder 2012年

不,为什么要这样?仅在第一个钩子有用时才调用第二个钩子。
fuxia

3

由于以下原因,我没有看到这种做法的巨大好处:

注册时未调用您的回调函数

add_actionadd_filter功能仅添加到全局变量的条目$wp_filter它包含所有过滤器和动作。参见来源。它不会调用您的函数。您的代码在调用do_action和时apply_filters(具有适当的钩子名称)才运行,这在这些钩子应放置的位置发生得很晚

您可能会说,这样做会使全局变量$wp_filter变大=>需要更多的内存。但是我认为创建一个新功能存在相同的问题。

组织代码

将所有内容放在一个函数中会迫使您记住主题/插件中每个文件的所有挂钩。您不会做这样的事情:

  • in header.php:添加钩子和回调函数,以处理标题中发生的事情(例如菜单,注册脚本)
  • content.php:添加挂钩和回调函数以过滤内容
  • admin-menu.php:添加挂钩和回调函数以添加管理菜单

(假设这些文件放在主题/插件中)

取而代之的是,您必须:

  • 仅将回调函数放在header.phpcontent.phpadmin-menu.php
  • 并将所有钩子放在另一个文件中的单独函数中

=>这将使您很难知道在查看header.php文件内容时会发生什么。您必须进行搜索才能知道何时触发这些回调。

考虑一下您的主题/插件中有多个类的情况。您是否将所有类别的所有钩子放在一个地方?还是每个类都有一个包装所有钩子的包装器功能?太多余了!

除了这些原因,我认为这是个人风格:)。我看到像Hybrid这样的一些框架可以实现您所说的。有时,这使我很难挖掘这些框架!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.