13

我想简化在 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”代替。

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

$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:我在谷歌上搜索并“stackoverflowed”了很多关于这个但没有找到任何适合我需要并且不会生成 WordPress 错误消息的有效解决方案。

谢谢你。

4

7 回答 7

14

很简单,这是一个类似的项目截图:

$function = $prefix . '_custom_type_init';
if(function_exists($function)) {
  $function();
}
于 2013-02-21T14:39:26.720 回答
10

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

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

那么就没有必要声明这么多函数了。

于 2016-07-04T12:42:20.693 回答
2

编辑(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_action 只是调用你传递的任何函数。

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

注意:create_function 不会返回一个你想要的名字的函数,但是函数的内容会在你的控制之下,函数的真实名字并不重要。

于 2013-02-21T14:52:29.233 回答
2

我想你可以使用

runkit_function_add

http://php.net/manual/pl/function.runkit-function-add.php

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

于 2017-10-27T00:18:11.880 回答
1

这篇文章很旧,但 PHP 7 可能会解决这个问题。

尝试:

$prefix = 'news';

$functionName = $prefix . "_custom_type_init";

${$functionName} = function() use ($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', '$' . $functionName);

我认为它应该适用于 WordPress。

于 2018-07-19T15:03:29.250 回答
0

动态函数在 PHP 中命名为variable functions

https://www.php.net/manual/en/functions.variable-functions.php

例如

$functionName = function () {
    global $prefix;

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

        register_taxonomy_for_object_type( 'category', $prefix );
}

你可以通过键入来调用它$functionName()

于 2021-07-28T21:01:16.660 回答
0

我不确定上述任何内容是否真正回答了有关动态创建自定义帖子类型的问题。这对我有用:

$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;
于 2020-09-03T11:53:24.027 回答