file, array( $this, 'uninstall' ) ); } /** * Registers a page. * * @return void */ public function page_init() { if ( ! isset( $this->args['columns'] ) ) { $this->args['columns'] = 2; } parent::page_init(); add_action( 'load-' . $this->pagehook, array( $this, 'boxes_init' ) ); } /** * Prints default CSS styles. * * @return void */ protected function default_css() { ?> default_css(); global $screen_layout_columns; if ( isset( $screen_layout_columns ) ) { $hide2 = $hide3 = $hide4 = ''; switch ( $screen_layout_columns ) { case 4: if ( ! isset( $this->args['column_widths'] ) ) { $this->args['column_widths'] = array( 24.5, 24.5, 24.5, 24.5 ); } break; case 3: if ( ! isset( $this->args['column_widths'] ) ) { $this->args['column_widths'] = array( 32.67, 32.67, 32.67 ); } $hide4 = 'display:none;'; break; case 2: if ( ! isset( $this->args['column_widths'] ) ) { $this->args['column_widths'] = array( 49, 49 ); } $hide3 = $hide4 = 'display:none;'; break; default: if ( ! isset( $this->args['column_widths'] ) ) { $this->args['column_widths'] = array( 98 ); } $hide2 = $hide3 = $hide4 = 'display:none;'; } $this->args['column_widths'] = array_pad( $this->args['column_widths'], 4, 0 ); } ?>
args['column_widths'][0]}%'>\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(); } /** * Handles option saving. * * @return void */ protected 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 ); } } } /** * Uninstalls boxes. * * @return void */ public 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} " ); } /** * Adds boxes. * * @return void */ public function boxes_init() { wp_enqueue_script( 'postbox' ); add_screen_option( 'layout_columns', array( 'max' => $this->args['columns'], 'default' => $this->args['columns'] ) ); $registered = array(); foreach ( $this->boxes as $box_args ) { $box_args = self::numeric_to_assoc( $box_args, array( 'name', 'title', 'context', 'priority', 'args' ) ); $defaults = array( 'title' => ucfirst( $box_args['name'] ), 'context' => 'normal', 'priority' => 'default', 'args' => array() ); $box_args = array_merge( $defaults, $box_args ); $name = $box_args['name']; if ( isset( $registered[ $name ] ) ) { if ( empty( $box_args['args'] ) ) { trigger_error( "Duplicate box name: $name", E_USER_NOTICE ); } $name = $this->_increment( $name ); } else { $registered[ $name ] = true; } add_meta_box( $name, $box_args['title'], array( $this, '_intermediate_callback' ), $this->pagehook, $box_args['context'], $box_args['priority'], $box_args['args'] ); } } /** * Transforms numeric array to associative. * * @param array $argv * @param array $keys * * @return array */ private static function numeric_to_assoc( $argv, $keys ) { $args = array(); foreach ( $keys as $i => $key ) { if ( isset( $argv[ $i ] ) ) { $args[ $key ] = $argv[ $i ]; } } return $args; } /** * Since we don't pass an object to do_meta_boxes(), * pass $box['args'] directly to each method. * * @param string $_ * @param array $box * * @return void */ public function _intermediate_callback( $_, $box ) { list( $name ) = explode( '-', $box['id'] ); call_user_func_array( array( $this, $name . '_box' ), $box['args'] ); } /** * Adds/Increments ID in box name. * * @param string $name * * @return string */ 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. * * @return void */ protected function _boxes_js_init() { echo $this->js_wrap( <<pagehook' ); } ); EOT ); ?>