Como exibir vários $ meta_boxes em tabelas separadas

Estou escrevendo um plugin dentro de uma aula e criei meus $ meta_boxes, sou capaz de recuperar todos os campos, mas eles são duplicados e na mesma tabela.

Este é o meu código para adicionar $ meta_boxes

function ri_add_custom_box() { global $prefix, $meta_box, $meta_boxes; $prefix = '_ri_custom_meta_'; // a custom prefix to help us avoid pulling data from the wrong meta box $meta_boxes = array(); $meta_boxes[] = array( 'id' => 'ri_meta_box_panel1', // the id of our meta box 'title' => 'Test1', // the title of the meta box 'page' => 'ri_my_page', // display this meta box on post editing screens 'context' => 'side', 'priority' => 'high', // keep it near the top 'fields' => array( // all of the options inside of our meta box array( 'name' => 'Test1:', 'desc' => 'Test1', 'id' => $prefix . 'Test1', 'type' => 'text', 'std' => '' ), ) ); $meta_boxes[] = array( 'id' => 'ri_meta_box_panel2', // the id of our meta box 'title' => 'Test2', // the title of the meta box 'page' => 'ri_my_page', // display this meta box on post editing screens 'context' => 'side', 'priority' => 'high', // keep it near the top 'fields' => array( // all of the options inside of our meta box array( 'name' => 'Test2:', 'desc' => 'Test2', 'id' => $prefix . 'Test2', 'type' => 'text', 'std' => '' ), ) ); foreach ($meta_boxes as $meta_box) { new Ri($meta_box); add_meta_box($meta_box['id'], $meta_box['title'], array(&$this, 'ri_display_metaboxes'), $meta_box['page'], $meta_box['context'], $meta_box['priority']); } } 

e este é o meu código para exibir $ meta_boxes

 function ri_display_metaboxes() { global $meta_box, $meta_boxes, $post; echo ''; echo ''; foreach ($meta_boxes as $meta_box) { foreach ($meta_box['fields'] as $field) { $meta = get_post_meta($post->ID, $field['id'], true); echo '', // create a table row for each option '', ''; } } echo '
'; switch ($field['type']) { case 'text': // the HTML to display for type=text options echo '', ' ', $field['desc']; break; case 'textarea': // the HTML to display for type=textarea options echo '', ' ', $field['desc']; break; case 'select': // the HTML to display for type=select options echo ''; foreach ($field['options'] as $option) { echo '', $option, ''; } echo ''; break; case 'radio': // the HTML to display for type=radio options foreach ($field['options'] as $option) { echo '', $option['name']; } break; case 'checkbox': // the HTML to display for type=checkbox options echo ''; break; } echo '', '
'; }

Eu quero exibir na primeira metabox Test1 e na segunda metabox Test2 como essa Metabox1 Test1

Metabox2 Test2

mas agora com este código eu tenho

Metabox1 Test1 Test2

Metabox2 Test1 Test2

Desculpe pelo meu mau inglês. Qualquer ajuda é apreciada!

Solutions Collecting From Web of "Como exibir vários $ meta_boxes em tabelas separadas"

O problema está na sua function ri_display_metaboxes() mais especificamente nesta linha:

 foreach ($meta_boxes as $meta_box) { 

O que diz ao WordPress para renderizar todas as meta-checkboxs em todas as canvass de exibição de metabox.

Para add_meta_box -lo, você pode usar o parâmetro $callback_args da function add_meta_box

então tente isso:

 function ri_add_custom_box() { global $prefix, $meta_box, $meta_boxes; $prefix = '_ri_custom_meta_'; // a custom prefix to help us avoid pulling data from the wrong meta box $meta_boxes = array(); $meta_boxes[] = array( 'id' => 'ri_meta_box_panel1', // the id of our meta box 'title' => 'Test1', // the title of the meta box 'page' => 'ri_my_page', // display this meta box on post editing screens 'context' => 'side', 'priority' => 'high', // keep it near the top 'fields' => array( // all of the options inside of our meta box array( 'name' => 'Test1:', 'desc' => 'Test1', 'id' => $prefix . 'Test1', 'type' => 'text', 'std' => '' ), ) ); $meta_boxes[] = array( 'id' => 'ri_meta_box_panel2', // the id of our meta box 'title' => 'Test2', // the title of the meta box 'page' => 'ri_my_page', // display this meta box on post editing screens 'context' => 'side', 'priority' => 'high', // keep it near the top 'fields' => array( // all of the options inside of our meta box array( 'name' => 'Test2:', 'desc' => 'Test2', 'id' => $prefix . 'Test2', 'type' => 'text', 'std' => '' ), ) ); foreach ($meta_boxes as $meta_box) { new Ri($meta_box); add_meta_box($meta_box['id'], $meta_box['title'], array(&$this, 'ri_display_metaboxes'), $meta_box['page'], $meta_box['context'], $meta_box['priority'],array('fields' => $meta_box['fields'])); } } function ri_display_metaboxes($post,$meta_b) { global $meta_boxes, $post; echo ''; echo ''; foreach ((array)$meta_b['arg']['fields'] as $field) { $meta = get_post_meta($post->ID, $field['id'], true); echo '', // create a table row for each option '', ''; } echo '
'; switch ($field['type']) { case 'text': // the HTML to display for type=text options echo '', '', $field['desc']; break; case 'textarea': // the HTML to display for type=textarea options echo '', '', $field['desc']; break; case 'select': // the HTML to display for type=select options echo ''; break; case 'radio': // the HTML to display for type=radio options foreach ($field['options'] as $option) { echo '', $option['name']; } break; case 'checkbox': // the HTML to display for type=checkbox options echo ''; break; } echo '', '
'; }

Eu encontrei o erro!

 foreach ((array)$meta_b['args']['fields'] as $field) { 

ao invés de

 foreach ((array)$meta_b['arg']['fields'] as $field) { 

Como posso salvar dados de postagem agora?

Este é o meu código:

 function ri_meta_save_data($post_id) { global $post; // check autosave if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return $post_id; } // verify nonce -- checks that the user has access if (!wp_verify_nonce($_POST['ri_meta_box_nonce'], basename(__FILE__))) { return $post_id; } // check permissions if ('page' == $_POST['post_type']) { if (!current_user_can('edit_page', $post_id)) { return $post_id; } } elseif (!current_user_can('edit_post', $post_id)) { return $post_id; } foreach ((array)$meta_b['args']['fields'] as $field) { $old = get_post_meta($post_id, $field['id'], true); $new = $_POST[$field['id']]; if ($new && $new != $old) { update_post_meta($post_id, $field['id'], $new); } elseif ('' == $new && $old) { delete_post_meta($post_id, $field['id'], $old); } } } 

Desde já, obrigado!