在for循环内动态创建回调函数

时间:2017-01-11 作者:RobBenz

我正在创建一个插件来处理woocommerce产品标签。

我通过挂接到woocommerce_product_tabs

add_filter( \'woocommerce_product_tabs\', \'benz_new_product_tabs\' );
然后,我有一个基于DB meta\\u值加载选项卡标题的函数-一切正常。-我已经删除了大部分内容以节省您的时间,但我试图保留所有重要的、相关的内容。

function benz_new_product_tabs( $tabs ) {
  global $post;
  $benz_tab_count = get_post_meta( $post->ID, \'_tabs_total_number\', true );
  for ( $x = 0; $x < $benz_tab_count; $x++ ) {
    $y=$x+1;
    $benz_tab_title = get_post_meta( $post->ID, "_tabs_title_$y", true );
    $benz_tab_title_clean = preg_replace(\'/\\s+/\', \'-\', $benz_tab_title);

    if ( strlen($benz_tab_title) > 0  ) {
      $tabs[$benz_tab_title_clean] = array(
        \'title\'     => __( $benz_tab_title, \'woocommerce\' ),
        \'priority\'  => $y+50,
        \'callback\'  => \'benz_new_product_tab_content\'.$y
      );
    } // end foreach
  }
  return $tabs;
}
因此,这会根据需要为每个db表生成尽可能多的选项卡标题,并分配一个唯一的回调函数,然后为每个选项卡提供内容。

回调函数是我正在努力解决的问题。我想创建一个循环来生成每个回调函数和相关内容。

以下功能运行良好,但如果可能的话,我真的想让它更智能。

function benz_new_product_tab_content1() {
  global $post;
   $benz_tab_content = get_post_meta( $post->ID, "_tabs_content_1", true );
   if (strlen($benz_tab_content) > 0) {
     echo $benz_tab_content;
   }
}

function benz_new_product_tab_content2() {
  global $post;
   $benz_tab_content = get_post_meta( $post->ID, "_tabs_content_2", true );
   if (strlen($benz_tab_content) > 0) {
     echo $benz_tab_content;
   }
}

function benz_new_product_tab_content3() {
  global $post;
   $benz_tab_content = get_post_meta( $post->ID, "_tabs_content_3", true );
   if (strlen($benz_tab_content) > 0) {
     echo $benz_tab_content;
   }
}
我的许多产品上有3个以上的标签,有时多达8个(每个客户端),所以我在插件文件中粘贴了8次回调函数块。我曾尝试将其放入for循环中,但很明显,您无法将变量连接到函数名的末尾。

让我知道你的想法,谢谢你的阅读。

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

可能您可以使用args执行此操作:

\'callback\' => benz_new_product_tab_content,
\'args\' => \'_tabs_content_\' . $y
以及您的功能:

function benz_new_product_tab_content($param, $args) { 
  global $post; 
  $table = end($args); 
  $benz_tab_content = get_post_meta( $post->ID, $table, true ); 

  if (strlen($benz_tab_content) > 0) { 
    echo $benz_tab_content; 
  } 
}
另一种方法是创建如下匿名函数:

  \'callback\' => function() { // do your work }
通常在中创建函数FOR 您将使用的循环eval. 我认为这不是明智的选择。

相关推荐

无法在模板函数.php中使用IS_HOME

我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请