Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的动态函数名_Php_Function_Dynamic_Wordpress - Fatal编程技术网

php中的动态函数名

php中的动态函数名,php,function,dynamic,wordpress,Php,Function,Dynamic,Wordpress,我想简化WordPress中“自定义帖子类型”的创建,因为反复使用同一个脚本并手动更改所有自定义帖子类型名称实例是非常繁琐的 通过创建一个包含CPT名称的变量并在任何需要的地方使用它,可以非常简单地实现。这样,我所要做的就是在脚本的开头声明变量,剩下的就交给我了 唯一的问题是,为了让它工作,我还需要在脚本中的每个函数前面加上CPT名称的前缀,在函数名中使用变量似乎不容易,甚至在PHP中也不推荐 那么我该如何解决这个问题呢 下面是一个例子来说明这一点: $prefix = 'news'; fun

我想简化WordPress中“自定义帖子类型”的创建,因为反复使用同一个脚本并手动更改所有自定义帖子类型名称实例是非常繁琐的

通过创建一个包含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');
这几乎是好的,如果我可以动态地重命名函数,以便不必在函数前面写“news”,而是使用“$前缀”,那么它就可以标准化

这本可以很好,但就是不起作用:

$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:我在谷歌上搜索了很多关于这方面的信息,但没有找到任何适合我需要的有效解决方案,也没有生成WordPress错误消息


谢谢。

很简单,这里有一个类似的剪贴形式的项目:

$function = $prefix . '_custom_type_init';
if(function_exists($function)) {
  $function();
}
编辑(2017-04):匿名功能(正确实现)是一条出路,见David 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_操作只调用您传递的任何函数


注意:create_函数不会返回具有所需名称的函数,但函数的内容将由您控制,函数的真实名称并不重要。

这是一个旧线程,只需使用匿名函数即可:

add_action('init', function() use($args) {
    //...
});
那么就没有必要声明这么多函数了。

我想您可以使用

runkit\u函数\u添加


另一个可用的方法是使用
eval()

这篇文章很老了,但是PHP7可以解决这个问题

尝试:


我认为它应该适用于WordPress。

我不确定上面提到的任何一个问题是否真正回答了动态创建自定义帖子类型的问题。但这对我来说很有效:

$languages = ("English", "Spanish", "French");

foreach($languages as $language):

    $example = function () use ($language) {

        $labels = array(
                'name' => __( $language . ' Posts' ),
                'singular_name' => __( $language . ' Post' )
        );

        $args = array(
   
            'labels'              => $labels,
            'hierarchical'        => false,
            'public'              => true,
            'show_ui'             => true,
            'show_in_menu'        => true,
            'show_in_nav_menus'   => true,
            'show_in_admin_bar'   => true,
            'menu_position'       => 5,
            "rewrite" => array( "slug" => $language . "_posts", "with_front" => true ),
            'capability_type'     => 'page',
         );
        register_post_type( $language . "_posts", $args );  

    };
    add_action( 'init', $example, 0 );

endforeach;

我不确定我说得是否清楚(或者我不明白你的意思)。您的脚本检查函数是否已经存在,因此,首先应该手动创建函数,对吗?我并不是试图动态地“调用”一个现有函数,我试图做的正是动态地“创建”这个函数。为了简单起见,在我上面的脚本中,我只想从任何地方删除单词“news”,而不是从第一条指令开始,然后让脚本正常工作。如果我没有理解你,我很抱歉。如果我理解正确,你希望有一些功能,如“news\u某物”和“blog\u某物”等。然后动态调用所需的功能。我提供的代码应该在init()中调用,并选择要调用的函数。如果您希望从多个位置调用相同的函数,我相信您需要创建函数并使它们调用相同的函数,因为它们需要在PHP中注册。感谢您的帮助。为了更好地理解我的目的,我在上面编辑了一个不起作用的例子。谢谢Cernunos,我要试试这个。我不仅受到这里语言的限制,我还受到WordPress机制的限制。希望能奏效。我会再打给你的,没用了。至少在WordPress中没有。它在另一个核心页面上生成错误(致命错误:在/home/www/xxx/web/admin/wp includes/rewrite.php中对非对象调用成员函数add_rewrite_tag())。此外,我不认为这是一种方式,因为触发函数的“add_action”需要一个字符串。就是这样,genetareFunction返回一个字符串,它不会有您期望的名称:而不是$prefix。“_customblablablabla”类似于“lamda_5”,但该名称将作为字符串保存到变量中,并可以传递给add_操作(这是一个有效的回调,wordpress add_操作api表示它接受一个有效的回调)。试着在代码字符串中添加一个die(“我死在这里”),看看wordpress是否真的到了那里(或者一个错误日志(“bla”)@cernunnos投票否决,因为这不再被推荐。从PHP7.2开始,create_函数将被弃用。改用匿名函数。唯一的缺点是,一旦与匿名函数挂钩,就无法删除该操作。在PHP文档中,“非常不鼓励依赖此函数”。@sampoh更新了答案,当您使用循环中的映射创建多个post类型时,您完全正确地使用了voteA强大的技术。如果post类型共享某些功能,但与数据层次结构不同,并且不应作为父类等相互耦合,则这通常是一个好主意。如果人们一直直接调用其他模块的函数,则会出现问题。不是说你应该这么做,但这是可能发生的。
$languages = ("English", "Spanish", "French");

foreach($languages as $language):

    $example = function () use ($language) {

        $labels = array(
                'name' => __( $language . ' Posts' ),
                'singular_name' => __( $language . ' Post' )
        );

        $args = array(
   
            'labels'              => $labels,
            'hierarchical'        => false,
            'public'              => true,
            'show_ui'             => true,
            'show_in_menu'        => true,
            'show_in_nav_menus'   => true,
            'show_in_admin_bar'   => true,
            'menu_position'       => 5,
            "rewrite" => array( "slug" => $language . "_posts", "with_front" => true ),
            'capability_type'     => 'page',
         );
        register_post_type( $language . "_posts", $args );  

    };
    add_action( 'init', $example, 0 );

endforeach;