问题在于ri_display_metaboxes()
更具体地说,这一行:
foreach ($meta_boxes as $meta_box) {
它告诉WordPress在每个元盒显示回调上呈现两个/所有元盒。
要克服它,您可以使用$callback_args
的参数add_meta_box
作用
所以试试这个:
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 \'<input type="hidden" name="ri_meta_box_nonce" value="\', wp_create_nonce(basename(__FILE__)), \'" />\';
echo \'<table class="form-table">\';
foreach ((array)$meta_b[\'arg\'][\'fields\'] as $field) {
$meta = get_post_meta($post->ID, $field[\'id\'], true);
echo \'<tr>\', // create a table row for each option
\'<th style="width:20%"><label for="\', $field[\'id\'], \'">\', $field[\'name\'], \'</label></th>\',
\'<td>\';
switch ($field[\'type\']) {
case \'text\': // the HTML to display for type=text options
echo \'<input type="text" name="\', $field[\'id\'], \'" id="\', $field[\'id\'], \'" value="\', $meta ? $meta : $field[\'std\'], \'" size="30" style="width:97%" />\', \'\', $field[\'desc\'];
break;
case \'textarea\': // the HTML to display for type=textarea options
echo \'<textarea name="\', $field[\'id\'], \'" id="\', $field[\'id\'], \'" cols="60" rows="8" style="width:97%">\', $meta ? $meta : $field[\'std\'], \'</textarea>\', \'\', $field[\'desc\'];
break;
case \'select\': // the HTML to display for type=select options
echo \'<select name="\', $field[\'id\'], \'" id="\', $field[\'id\'], \'">\';
foreach ($field[\'options\'] as $option) {
echo \'<option\', $meta == $option ? \' selected="selected"\' : \'\', \'>\', $option, \'</option>\';
}
echo \'</select>\';
break;
case \'radio\': // the HTML to display for type=radio options
foreach ($field[\'options\'] as $option) {
echo \'<input type="radio" name="\', $field[\'id\'], \'" value="\', $option[\'value\'], \'"\', $meta == $option[\'value\'] ? \' checked="checked"\' : \'\', \' />\', $option[\'name\'];
}
break;
case \'checkbox\': // the HTML to display for type=checkbox options
echo \'<input type="checkbox" name="\', $field[\'id\'], \'" id="\', $field[\'id\'], \'"\', $meta ? \' checked="checked"\' : \'\', \' />\';
break;
}
echo \'<td>\',
\'</tr>\';
}
echo \'</table>\';
}