динамически создавать функции обратного вызова внутри цикла for

Я создаю плагин для обработки вкладок продукта woocommerce.

Я загружаю новые пользовательские вкладки, подключаясь к woocommerce_product_tabs

 add_filter( 'woocommerce_product_tabs', 'benz_new_product_tabs' ); 

Затем у меня есть функция загрузки заголовков табуляций на основе метаданных DB – все работает нормально. – Я удалил большинство вещей, чтобы вас пощадить, но пытался сохранить все, что важно, актуально.

 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, но, очевидно, вы не можете связать переменную с именем функции.

Дайте мне знать ваши мысли, спасибо за чтение.

Solutions Collecting From Web of "динамически создавать функции обратного вызова внутри цикла for"

Вероятно, вы можете сделать это с помощью 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 . Я думаю, что это не разумный выбор.