do_meta_boxes( string|WP_Screen $screen, string $context, mixed $object )

Meta-Box template function


Description Description


Parameters Parameters

$screen

(string|WP_Screen) (Required) Screen identifier. If you have used add_menu_page() or add_submenu_page() to create a new screen (and hence screen_id) make sure your menu slug conforms to the limits of sanitize_key() otherwise the 'screen' menu may not correctly render on your page.

$context

(string) (Required) box context

$object

(mixed) (Required) gets passed to the box callback function as first parameter


Top ↑

Return Return

(int) number of meta_boxes


Top ↑

Source Source

File: wp-admin/includes/template.php

function do_meta_boxes( $screen, $context, $object ) {
	global $wp_meta_boxes;
	static $already_sorted = false;

	if ( empty( $screen ) )
		$screen = get_current_screen();
	elseif ( is_string( $screen ) )
		$screen = convert_to_screen( $screen );

	$page = $screen->id;

	$hidden = get_hidden_meta_boxes( $screen );

	printf( '<div id="%s-sortables" class="meta-box-sortables">', esc_attr( $context ) );

	// Grab the ones the user has manually sorted. Pull them out of their previous context/priority and into the one the user chose
	if ( ! $already_sorted && $sorted = get_user_option( "meta-box-order_$page" ) ) {
		foreach ( $sorted as $box_context => $ids ) {
			foreach ( explode( ',', $ids ) as $id ) {
				if ( $id && 'dashboard_browser_nag' !== $id ) {
					add_meta_box( $id, null, null, $screen, $box_context, 'sorted' );
				}
			}
		}
	}

	$already_sorted = true;

	$i = 0;

	if ( isset( $wp_meta_boxes[ $page ][ $context ] ) ) {
		foreach ( array( 'high', 'sorted', 'core', 'default', 'low' ) as $priority ) {
			if ( isset( $wp_meta_boxes[ $page ][ $context ][ $priority ]) ) {
				foreach ( (array) $wp_meta_boxes[ $page ][ $context ][ $priority ] as $box ) {
					if ( false == $box || ! $box['title'] )
						continue;
					$i++;
					$hidden_class = in_array($box['id'], $hidden) ? ' hide-if-js' : '';
					echo '<div id="' . $box['id'] . '" class="postbox ' . postbox_classes($box['id'], $page) . $hidden_class . '" ' . '>' . "\n";
					if ( 'dashboard_browser_nag' != $box['id'] ) {
						$widget_title = $box[ 'title' ];

						if ( is_array( $box[ 'args' ] ) && isset( $box[ 'args' ][ '__widget_basename' ] ) ) {
							$widget_title = $box[ 'args' ][ '__widget_basename' ];
							// Do not pass this parameter to the user callback function.
							unset( $box[ 'args' ][ '__widget_basename' ] );
						}

						echo '<button type="button" class="handlediv" aria-expanded="true">';
						echo '<span class="screen-reader-text">' . sprintf( __( 'Toggle panel: %s' ), $widget_title ) . '</span>';
						echo '<span class="toggle-indicator" aria-hidden="true"></span>';
						echo '</button>';
					}
					echo "<h2 class='hndle'><span>{$box['title']}</span></h2>\n";
					echo '<div class="inside">' . "\n";
					call_user_func($box['callback'], $object, $box);
					echo "</div>\n";
					echo "</div>\n";
				}
			}
		}
	}

	echo "</div>";

	return $i;

}

Top ↑

Changelog Changelog

Changelog
Version Description
2.5.0 Introduced.


Top ↑

User Contributed Notes User Contributed Notes

  1. Skip to note 1 content
    Contributed by ramon fincken

    When wanting to change the order of metaboxes there is an undocumented (I could not find it at WP.org) filter you can use.

    get_user_option_meta-box-order_[CUSTOM_POST_TYPE]
    it will have 1 parameter, the $order array.

    For example for the CPT named posts
    get_user_option_meta-box-order_post

    This is an example to re-order metaboxes (note that this example might differ from your metaboxes)

    add_filter( 'get_user_option_meta-box-order_post', 'wpse25793_one_column_for_all' );
    function wpse25793_one_column_for_all( $order )
    {
        return array(
            'normal'   => join( ",", array(
                'postexcerpt',
                'formatdiv',
                'trackbacksdiv',
                'tagsdiv-post_tag',
                'categorydiv',
                'postimagediv',
                'postcustom',
                'commentstatusdiv',
                'slugdiv',
                'authordiv',
                'submitdiv',
            ) ),
            'side'     => '',
            'advanced' => '',
        );
    }

    Source: http://wordpress.stackexchange.com/questions/25793/how-to-force-one-column-layout-on-custom-post-type-edit-page/25814#25814

  2. Skip to note 2 content
    Contributed by Farhan Noor

    This is how you can register a new meta box, then outputs that meta box using this do_meta_boxes function:

    function adding_custom_meta_boxes() {
        add_meta_box( 
            'meta_box_id',
            __( 'Title of the Metabox' ),
            'callback_metabox_function',
            'my_custom_menu_page' );
    }
    add_action( 'add_meta_boxes', 'adding_custom_meta_boxes', 10, 2 );
    
    function callback_metabox_function(){
        echo 'Metabox Content';
    }
    
    do_meta_boxes( 'my_custom_menu_page', 'normal', '' );
    
  3. Skip to note 3 content
    Contributed by Drew Jaynes

    Worth mentioning that the ‘get_user_option_meta-box-order_post’ hook referenced in @ramon fincken’s example is “undocumented” only because it’s a dynamic hook, specifically the get_user_option_{$option} hook, where “meta-box-order” is a specific user option. Cool tip though :-)

  4. Skip to note 4 content
    Contributed by Codex

    Example

    Here is an example that uses add_meta_box to register a new meta box, then outputs that meta box using this do_meta_boxes function:

    add_meta_box( 
        'my-custom-meta-box',
        __( 'My Custom Meta Box', 'textdomain' ),
        'my_custom_menu_page',
        'normal'
    );
    
    do_meta_boxes( 'my_custom_menu_page', 'normal', '' );
    

You must log in before being able to contribute a note or feedback.