问题描述

我想知道是否是根据 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

}

谢谢

最佳解决方案

一般来说:是的,等待专用的钩子来启动你自己的代码。 Never 只是将对象实例引入全局命名空间。但是 init 很少需要。

你尽可能迟到。如果您的第一个代码运行在 wp_head 上,则不要使用较早的钩子。你甚至可以 cascade hooks

add_action( 'wp_head', 'first_callback' );

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

关于 init 钩子:改用 wp_loaded 。在 init 之后和 ms_site_check()被调用后运行。这样您就可以避免在 multi-site 安装中的无效子站点上运行插件。一切都是一样的

次佳解决方案

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

注册时不会调用回调函数

add_actionadd_filter 功能仅在全局变量 $wp_filter 中添加一个条目,该变量保存所有过滤器和操作。 See source 。它不会调用你的功能。只有当 do_actionapply_filters 被调用 (具有适当的挂钩名称) 时,您的代码才会运行,这些钩子应该在那个地方发生得很晚。

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

组织代码

将所有内容都放在一个功能中,强制您记住主题/插件中每个文件中的所有钩子。你不会这样做:

  • header.php:添加钩子和回调函数的事情发生在标题 (如菜单,注册脚本)

  • content.php 中:添加用于过滤内容的钩子和回调函数

  • admin-menu.php:添加钩子和回调函数来添加管理菜单

(假设那些文件放在你的主题/插件中)

而不是这样,你必须:

  • header.phpcontent.phpadmin-menu.php 中只放置回调函数

  • 并将所有钩子分离在另一个文件中

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

并在您的主题/插件中有多个课程时思考情况。你把所有班级的钩子放在一个地方吗?还是每个类都有一个包含所有钩子的包装函数?太多了!

以上这些原因,我认为这是个人风格:) 。我看到一些框架,如混合,你说的话。有时候这让我很难在这些框架中挖掘!

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。