boxes = array( array('settings', 'Settings box', 'normal') ... ); You must also define two methods in your class for each box: function settings_box() - this is where the box content is echoed function settings_handler() - this is where the box settings are saved ... */ abstract class scbBoxesPage extends scbAdminPage { /* A box definition looks like this: array($slug, $title, $column); Available columns: normal, side, column3, column4 */ protected $boxes = array(); function __construct($file, $options = null) { parent::__construct($file, $options); // too late scbUtil::add_uninstall_hook($this->file, array($this, 'uninstall')); } function page_init() { if ( !isset($this->args['columns']) ) $this->args['columns'] = 2; parent::page_init(); add_action('load-' . $this->pagehook, array($this, 'boxes_init')); add_filter('screen_layout_columns', array($this, 'columns')); } function default_css() { ?> default_css(); global $screen_layout_columns; if ( isset($screen_layout_columns) ) { $hide2 = $hide3 = $hide4 = ''; switch ( $screen_layout_columns ) { case 4: $width = 'width:24.5%;'; break; case 3: $width = 'width:32.67%;'; $hide4 = 'display:none;'; break; case 2: $width = 'width:49%;'; $hide3 = $hide4 = 'display:none;'; break; default: $width = 'width:98%;'; $hide2 = $hide3 = $hide4 = 'display:none;'; } } ?>
\n"; do_meta_boxes( $this->pagehook, 'normal', '' ); echo "\t
\n"; do_meta_boxes( $this->pagehook, 'side', '' ); echo "\t
\n"; do_meta_boxes( $this->pagehook, 'column3', '' ); echo "\t
\n"; do_meta_boxes( $this->pagehook, 'column4', '' ); ?>
_boxes_js_init(); parent::page_footer(); } function form_handler() { if ( empty($_POST) ) return; check_admin_referer($this->nonce); // Box handler foreach ( $this->boxes as $box ) { $args = isset($box[4]) ? $box[4] : array(); $handler = $box[0] . '_handler'; if ( method_exists($this, $handler) ) call_user_func_array(array($this, $handler), $args); } if ( $this->options ) $this->formdata = $this->options->get(); } function columns($columns) { $columns[$this->pagehook] = $this->args['columns']; return $columns; } function uninstall() { global $wpdb; $hook = str_replace('-', '', $this->pagehook); foreach ( array('metaboxhidden', 'closedpostboxes', 'wp_metaboxorder', 'screen_layout') as $option ) $keys[] = "'{$option}_{$hook}'"; $keys = '(' . implode(', ', $keys) . ')'; $wpdb->query(" DELETE FROM {$wpdb->usermeta} WHERE meta_key IN {$keys} "); } function boxes_init() { wp_enqueue_script('common'); wp_enqueue_script('wp-lists'); wp_enqueue_script('postbox'); $registered = array(); foreach($this->boxes as $box_args) { @list($name, $title, $context, $priority, $args) = $box_args; if ( empty($title) ) $title = ucfirst($name); if ( empty($context) ) $context = 'normal'; if ( empty($priority) ) $priority = 'default'; if ( empty($args) ) $args = array(); if ( isset($registered[$name]) ) { if ( empty($args) ) trigger_error("Duplicate box name: $name", E_USER_NOTICE); $name = $this->_increment($name); } else { $registered[$name] = true; } add_meta_box($name, $title, array($this, '_intermediate_callback'), $this->pagehook, $context, $priority, $args); } } // Make it so that $args is actually what's passed to the callback function _intermediate_callback($_, $box) { list($name) = explode('-', $box['id']); call_user_func_array(array($this, $name . '_box'), $box['args']); } private function _increment($name) { $parts = explode('-', $name); if ( isset($parts[1]) ) $parts[1]++; else $parts[1] = 2; return implode('-', $parts); } // Adds necesary code for JS to work function _boxes_js_init() { echo $this->js_wrap( <<pagehook'); }); //]]> EOT ); ?>