我应该在主题开发中使用Function_Existes()和/或Add_action()吗?

时间:2013-11-19 作者:Bass Jobsen

我在试着my theme 准备在WordPress上发布。组织机构

我得到了以下反馈:

function\\u exist()这不是最好的3.0设计

现在我想知道我做错了什么。

在当前结构中,我有:

functions.php:

/* Load JBST functions on \'after_setup_theme\'. */
add_action( \'after_setup_theme\', \'jbst_theme_setup\' );

if ( ! function_exists( \'jbst_theme_setup\' ) ):
function jbst_theme_setup() {

        /* Load custom Skematik header functions. */
    require( get_template_directory() . \'/functions/skematik-header-functions.php\' );
//more code
}
/functions/skematik-header-functions.php 定义如下函数:

add_action( \'skematik_header\', \'skematik_doc_type\', 9 );
function skematik_doc_type() {
?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo( \'charset\' ); ?>" />
<meta name="viewport" content="width=device-width" />
<?php
}
在这种情况下skematik_doc_type 可以使用删除remove_action 但无法覆盖,因为它没有包装在function_exists(). 这就是问题所在吗?

是否必须将所有函数包装在function_exists() 添加add_action? 使用的规则是什么function_exists() 还是没有?

1 个回复
SO网友:fuxia

不使用function_exists().

从技术上讲,你的方法是可行的。实际上,您在代码中产生了问题,而没有任何好处。

  • Readability. 当其他人阅读你的代码时(例如,一年后的你),第一个问题是:你为什么不知道自己的代码?第二个可能是:好的,这个函数是在哪里定义的,我怎样才能知道调用了哪个函数?

  • Interoperability. 当我想替换你的代码时,我必须使用你的名字。skematik_doc_type() 是一个糟糕的函数名doctype. 我不能用skematik_doctype() 或类方法<哦,你也不能重命名它,因为其他人的代码可能依赖于这个名称。

  • Inconsistent behavior.

    您不能重用这样的函数,因为您永远不知道它会做什么或返回什么

  • function_exists() 行为不象defined(), 你不能return 如果函数返回true, 因为该文件中的所有其他代码都将被更早地解析。请参见comments in the manual 例如。因此,以后无法重新组织文件结构function_exists() 正如芯片所指出的,这是一个设计决策。但这是非常糟糕的一个。主题审查指南中没有禁止,但应该禁止。由于上述原因,WordPress内核不会引入更多的“可插拔”功能。

结束

相关推荐

hooks & filters and variables

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