在不使用任何挂钩的情况下注册分类是否安全?

时间:2014-05-19 作者:user1981248

我正在创建一个Wordpress网站,我想在我的主题选项中使用自定义分类法,我已经使用“init”挂钩注册了该分类法。但问题是,“init”钩子在主题选项之后被触发(我正在使用Redux框架插件来处理主题选项)。因此,当我在主题选项中使用get\\u categories()函数并尝试获取自定义分类法时,我遇到了一个“invalid\\u categority”错误。

因此,我决定只注册分类法,不使用任何挂钩,只需在函数中调用register\\u taxonomy()函数。php文件,它工作了。

我只想知道这是否“安全”,如中所示,如果我只调用register\\u taxonomy函数而不使用任何挂钩,会有什么后果。

以下是使用init钩子时无法工作的代码:

function my_function(){
  register_taxonomy( \'portfolio_category\', \'portfolio\', array(
                    \'labels\' => array(
                              \'name\' => _x( \'Portfolio Categories\', \'taxonomy general name\' ),
                              \'singular_name\'     => _x( \'Portfolio Category\', \'taxonomy singular name\'     ),
                              \'search_items\'      => __( \'Search Portfolio Categories\' ),
                              \'all_items\'         => __( \'All Portfolio Categories\' ),
                              \'parent_item\'       => __( \'Parent Portfolio Category\' ),
                              \'parent_item_colon\' => __( \'Parent Portfolio Category:\' ),
                              \'edit_item\'         => __( \'Edit Portfolio Category\' ),
                              \'update_item\'       => __( \'Update Portfolio Category\' ),
                              \'add_new_item\'      => __( \'Add New Portfolio Category\' ),
                              \'new_item_name\'     => __( \'New Portfolio Category\' ),
                              \'menu_name\'         => __( \'Portfolio Categories\' ),
                          ),
                    \'hierarchical\' => true,
                  ) );

}
add_action(\'init\', \'my_function\');

$portfolio_categories = get_categories(array(\'taxonomy\' => \'portfolio_category\', \'hide_empty\'=> 0));
echo "<pre>", print_r($portfolio_categories), "</pre>"; // This will return an error of \'invalid_taxonomy\'
这是一个有效的方法(不使用任何挂钩):

register_taxonomy( \'portfolio_category\', \'portfolio\', array(
                    \'labels\' => array(
                              \'name\' => _x( \'Portfolio Categories\', \'taxonomy general name\' ),
                              \'singular_name\'     => _x( \'Portfolio Category\', \'taxonomy singular name\'     ),
                              \'search_items\'      => __( \'Search Portfolio Categories\' ),
                              \'all_items\'         => __( \'All Portfolio Categories\' ),
                              \'parent_item\'       => __( \'Parent Portfolio Category\' ),
                              \'parent_item_colon\' => __( \'Parent Portfolio Category:\' ),
                              \'edit_item\'         => __( \'Edit Portfolio Category\' ),
                              \'update_item\'       => __( \'Update Portfolio Category\' ),
                              \'add_new_item\'      => __( \'Add New Portfolio Category\' ),
                              \'new_item_name\'     => __( \'New Portfolio Category\' ),
                              \'menu_name\'         => __( \'Portfolio Categories\' ),
                          ),
                    \'hierarchical\' => true,
                  ) );

$portfolio_categories = get_categories(array(\'taxonomy\' => \'portfolio_category\', \'hide_empty\'=> 0));
echo "<pre>", print_r($portfolio_categories), "</pre>";
如果我将第一个代码放在页面模板中,那么第一个代码也可以工作,因此我知道我做得很正确。请告诉我这件事

谢谢

3 个回复
SO网友:bueltge

不使用init钩子的代码也使用钩子,但不是从源代码激发的。最后一个是从WordPress中加载的主题包含中激发的。这对你的控制很不利。如果您使用了一个钩子,那么控件上是否包含来自源代码的钩子,您就选择了钩子。如果您将此打开,并且WP的核心更改了主题包含的顺序或其他点,那么可能您有问题,比如该功能永远不会工作。此外,您没有在包装器中捕获源代码(如控件的函数)也是一种糟糕的风格。也更容易阅读,在这个钩子上,这个回调-您的函数上进行了验证。

SO网友:Howdy_McGee

根据WordPress Codex on register_taxonomy()

Use the init action to call this function. 在操作之外调用它可能会导致麻烦。See #15568 for details.

在为自定义帖子类型注册自定义分类法时,与其说抱歉,不如说安全。使用register_taxonomy_for_object_type() 就在连接它们的功能之后。否则,您可能会遇到陷阱,其中在parse_requestpre_get_posts.

所以我会相信抄本并坚持使用init hook然后试着找出原因get_categories() 工作不正常。

SO网友:Otto

在钩子外面做任何事都是不安全的。

在您的情况下,真正的问题不是您正在使用init操作挂钩,而是您对get\\u categories的调用不在操作挂钩的函数中。

我认为你需要更笼统地理解“挂钩”。

WordPress中“钩子”系统的目的是让代码在正确的时间、正确的位置执行。很简单,真的。某些事情需要按一定的顺序发生。

现在,确保某种顺序的一种方法是,只需按照您希望它运行的顺序在文件中编写一组代码,然后再运行它。简单的方法。但是,这会导致以后在该文件的特定点添加任意代码的问题。这就是挂钩解决问题的地方。

WordPress按特定顺序运行大量代码。挂钩用于在指定的位置将其他代码插入到预定义的特定顺序中。因此,不在附加到挂钩的函数中的代码只是按顺序运行,从文件的顶部到文件的底部,无论文件包含在哪里。该文件可能以不同的方式包含。你不能肯定。使用钩子,您可以将代码基本上放在任何地方,但必须在正确的时间调用它,这是您自己选择的时间。

所以对于插件中的代码,或者主题函数中的代码。php文件,那么实际上,您永远都不应该有任何不在函数中且挂接的代码。这里和那里都有一些特殊情况,但很少有。

主题函数中的所有代码。php文件应该位于附加到某个钩子的函数中。它之所以命名为“functions.php”,是因为它只应该包含函数,而不应该包含函数之外的代码。

结束

相关推荐

hooks & filters and variables

我是updating the codex page example for action hooks, 在游戏中完成一些可重用的功能(最初是针对这里的一些Q@WA)。但后来我遇到了一个以前没有意识到的问题:在挂接到一个函数以修改变量的输出后,我再也无法决定是要回显输出还是只返回它。The Problem: 我可以修改传递给do_action 用回调函数钩住。使用变量修改/添加的所有内容仅在回调函数中可用,但在do_action 在原始函数内部调用。很高兴:我将其修改为一个工作示例,因此您可以将其复制/粘贴