2013-02-21 95 views
7

我想简化WordPress中“自定义帖子类型”的创建过程,因为通过相同的脚本并手动更改所有自定义帖子类型名称实例非常繁琐。php中的动态函数名称

创建一个包含CPT名称的变量并在需要的地方使用它非常简单。这样,我所要做的就是在脚本的开始部分声明变量,并且应该处理其余部分。

唯一的问题是,为了使它工作,我还需要在脚本内的每个函数的前面加上CPT名称的前缀,并且似乎在函数名中使用变量并不容易,甚至不推荐在PHP中使用。

那么我怎么能解决这个问题呢?

这里是下面一个例子来弄清楚:

$prefix = 'news'; 

function news_custom_type_init() 
{ 
    global $prefix; 

    register_post_type($prefix, array(
    'labels' => array(
      'name' => $prefix, 
      'singular_label' => $prefix, 
      'add_new' => 'Add', 
      ... 
     )); 

     register_taxonomy_for_object_type('category', $prefix); 
} 
add_action('init', $prefix.'_custom_type_init'); 

这几乎是很好,如果我能动态地以重命名功能不都写在单词“新闻”可标准化它的前面,但使用“$前缀”来代替。

这本来是好的,但只是不工作:

$prefix = 'news'; 

$functionName= $prefix."_custom_type_init"; 

function $functionName() 
{ 
    global $prefix; 

    register_post_type($prefix, array(
    'labels' => array(
      'name' => $prefix, 
      'singular_label' => $prefix, 
      'add_new' => 'Add', 
      ... 
     )); 

     register_taxonomy_for_object_type('category', $prefix); 
} 
add_action('init', $prefix.'_custom_type_init'); 

有命名手动功能还挺打败我的企图(尤其是当该脚本嵌入几十种功能,如这一个)的初衷。

这样做的最好方法是什么?

PS:我google和“stackoverflowed”了很多关于此,但没有找到任何适合我的需求,并不会产生一个WordPress错误消息的工作解决方案。

谢谢。

回答

5

够简单,这里有一个类似的文档片断形成项目:

$function = $prefix . '_custom_type_init'; 
if(function_exists($function)) { 
    $function(); 
} 
+0

我不知道我说清楚了(也许我没有理解你的观点)。你的脚本检查功能是否已经存在,为此,该功能应该首先手动创建,对吗?我不是想动态调用一个现有的函数,我想要做的就是动态地“创建”该函数。为了简单起见,在上面的脚本中,我只想从第一条指令的任何地方删除“新闻”一词,并让脚本起作用。如果我没有得到你,我很抱歉。 – Baylock 2013-02-21 14:46:30

+0

如果我理解正确,你想有一些功能,如“news_something”和“blog_something”等,然后动态调用所需的。我提供的代码应该在init()中调用并选择要调用的函数。 如果你想要的是从几个位置调用相同的函数,我相信你需要创建函数并使它们调用相同的函数,因为它们需要在PHP中注册。 – hexblot 2013-02-21 14:50:49

+0

感谢您的帮助hexbot。我编辑了上面的消息,以便通过一个非工作示例更好地理解我的目的。 – Baylock 2013-02-21 14:54:44

1

编辑(2017-04):匿名函数(正确实施)都去了,看看答案由大卫Vielhuber的方式。

这个答案不好建议,因为这涉及代码作为一个字符串,因为这会邀请(除其他外)串联。


林不知道,如果它是建议使用,或者如果它可以帮助你,但是PHP允许您创建“匿名”功能:

function generateFunction ($prefix) { 
    $funcname = create_function(
     '/* comma separated args here */', 
     '/* insert code as string here, using $prefix as you please */' 
    ); 
    return $funcname; 
} 

$func= generateFunction ("news_custom_type_init"); 
$func(); // runs generated function 

我假设ADD_ACTION只是调用什么功能,你通过。

http://php.net/manual/en/function.create-function.php

注:create_function不会跟你想要的名称返回的功能,但该功能的内容将是你的控制之下,该函数的真实名称并不重要。

+0

谢谢cernunnos,我会试试这个。我不仅受限于这里的语言,我也受到WordPress机制的限制。希望它能工作。我会尽快给您回复。 – Baylock 2013-02-21 14:59:33

+0

它不起作用。至少不是在WordPress。它会在另一个核心页面上产生错误(致命错误:在/home/www/xxx/web/admin/wp-includes/rewrite.php中的非对象上调用成员函数add_rewrite_tag())。另外,我不相信这是一条路,因为触发函数的“add_action”需要一个字符串。 – Baylock 2013-02-22 14:46:00

+1

Thats the thing,genetareFunction returns a string,it would not have the name you expect:instead of $ prefix。“_ customblabla”它会像“lamda_5”那样,但是这个名字会以字符串形式保存到变量中,并且可以是传递给add_action(它是一个有效的回调函数,而wordpress add_action api表示它接受有效的回调)。尝试在代码字符串中添加一个模子(“我死在这里”),看看wordpress是否真的到达那里(或者error_log(“bla”)) – cernunnos 2013-02-22 15:34:15

3

这是一个古老的线程,但简单地使用匿名函数:

add_action('init', function() use($args) { 
    //... 
}); 

那就没有必要宣布如此多的功能。

+0

当您使用循环中的地图创建多个帖子类型时,一种强大的技术。 如果帖子类型共享一些功能但与数据层次不同,并且不应该与父母等互相耦合,这通常是一个好主意。 – sampoh 2017-04-07 07:49:32

+0

如果人们直接调用其他模块的功能,则存在问题。并不是说你应该这样做,但可能会发生。 – jgmjgm 2018-02-14 16:08:52