如何动态添加WordPress快捷码

时间:2019-03-24 作者:YAHsaves

我正在开发一个插件,用户可以在其中构建一个表单,然后使用自己选择的短代码名称在前端显示该表单。

在数据库中,我有一个表单名称列表,以及呈现它们所需的数据,但我不知道如何动态注册shortcode函数。

下面是一些psudeo代码,它显示了我想要做的事情。在其中,我查询数据库并拉出一个对象,该对象包含表单名称和一些json字符串,我可以解析这些字符串并使用这些字符串调用带有参数的premade函数:

foreach ($dbQuery as $row){
  function $row->formName(){ // I know I can\'t do this
    $internalFunction = json_decode($row->json)->internalFunctionName; // dynamically refrence predefined function
    $internalFunction(json_decode($row->json)->params); // call the function defined above
    // do other things with the string from the database
  }
  add_shortcode( $row->formName, $row->formName );
}
我查找了php是否支持动态函数名,我发现SO post 它只支持动态闭包。我尝试过使用它们,但wordpress抛出了一个错误,说这个短代码没有正确的回调函数。所以我认为它需要一个真正的函数。

我还发现了一个similar question 在这个网站上,但没有看到这将如何让我在函数中定义自己的代码。

任何帮助都将不胜感激!

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

假设$row->internalFunction 是一个函数,或者是一个已经存在的函数的名称,那么您可以这样做:

foreach ( $dbQuery as $row ) {
    add_shortcode( $row->formName, $row->internalFunction );
}
所以如果formName (短代码标记)是foointernalFunctionfoo_func, 然后[foo] 将由foo_func() 功能:

// The standard/non-dynamic way.
function foo_func( $atts = array() ) {
    return \'something good..\';
}
add_shortcode( \'foo\', \'foo_func\' );
请参见Codex 更多详情/指南。

以下是使用闭包的示例:

foreach ( $dbQuery as $row ) {
    $func = $row->internalFunction;
    add_shortcode( $row->formName, function ( $atts = array() ) use ( $func ){
        return $func( $atts );
    } );
}
还是我误解了你的想法

更新是否有办法将参数传递到内部函数

是的,您可以将自定义参数传递给内部函数(internalFunction); 但你可以通过闭包来实现:

foreach ( $dbQuery as $row ) {
    $func = $row->internalFunction;
    $params = json_decode( $row->json )->params;
    add_shortcode( $row->formName, function ( $atts = array() ) use ( $func, $params ){
        return $func( $params );
    } );
}
基本上,使用use 关键字以在foreach 范围在闭包中可用。

你甚至可以通过整个$row 对象

foreach ( $dbQuery as $row ) {
    add_shortcode( $row->formName, function ( $atts = array() ) use ( $row ){
        $func = $row->internalFunction;
        // Here you can pass $row->formName to the function.
        return $func( json_decode( $row->json )->params );
    } );
}

相关推荐

Namespaced shortcode?

我正在改造一个旧的WP站点,该站点有许多自定义的短代码,显然由于代码当前的组织方式,这些短代码在性能方面付出了代价。当然,我可以修复优化不好的代码,使用十几个短代码,并且一天就可以完成,但我想知道如何更好地组织它们。根据WordPress\'documentation, 建议将它们放在插件中并在上初始化init. 我们可以通过这样“命名”它们来减少这个钩子中的负载吗?[com.company shortcode attr=\"attr\" prop=\"prop\"] 有人尝试过这样的解决方案吗