Bringing Metaboxes to the Front end - WebDevStudios/Custom-Metaboxes-and-Fields-for-WordPress GitHub Wiki

With 1.0.0, we now have the ability to display metabox forms on the front-end of our site.

<?php cmb_metabox_form( $meta_box, $object_id, $echo ); ?>

The first parameter $meta_box, takes a single metabox config array. For this reason, we'll give each of our metabox arrays a named key to make it easier to select for this front-end form.

Previously, we added metaboxes like:

<?php 
add_filter( 'cmb_meta_boxes', 'cmb_sample_metaboxes' );
function cmb_sample_metaboxes( $meta_boxes = array() ) {

	$meta_boxes[] = array(
		'id' => 'test_metabox',
		...
	);
}

Instead, we'll create our metaboxes like:

<?php 
add_filter( 'cmb_meta_boxes', 'cmb_sample_metaboxes' );
function cmb_sample_metaboxes( $meta_boxes = array() ) {

	$meta_boxes['test_metabox'] = array(
		'id' => 'test_metabox',
		...
	);
}

Now in order to get the metabox config array we need, we'll use the same method CMB uses to grab the entire metabox array:

<?php $meta_boxes = apply_filters( 'cmb_meta_boxes', array() ); ?>

Then we'll use our metabox key to select and display the right metabox wherever we want:

<?php
// This is the WordPress post ID where the data should be stored/displayed.
$object_id = 2;

// $echo is true by default, so it can be omitted for brevity.
// $echo = true;

cmb_metabox_form( $meta_boxes['test_metabox'], $object_id );
?>

Metabox Shortcode

Now, for real world usage, let's add this in the form of a shortcode:

<?php
add_shortcode( 'cmb-form', 'cmb_do_frontend_form' );
/**
 * Shortcode to display a CMB form for a post ID.
 * @param  array  $attr Metabox config array
 * @return string       Form HTML markup
 */
function cmb_do_frontend_form( $attr = array() ) {
	// Make sure a WordPress post ID is specified
	if ( ! isset( $attr['id'] ) )
		return __( "Please add an 'id' attribute to the shortcode.", 'cmb' );

	// Default metabox id
	$metabox_id = 'test_metabox';

	// Let shortcode override metabox id
	if ( isset( $attr['metabox_id'] ) ) {
		$metabox_id = esc_attr( $attr['metabox_id'] );
	}

	// Get all metaboxes
	$meta_boxes = apply_filters( 'cmb_meta_boxes', array() );

	// If the metabox specified doesn't exist, yell about it.
	if ( ! isset( $meta_boxes[ $metabox_id ] ) )
		return __( "A metabox with the specified 'metabox_id' doesn't exist.", 'cmb' );

	// This is the WordPress post ID where the data should be stored/displayed.
	$object_id = absint( $attr['id'] );

	// Shortcodes need to return their data, not echo it.
	$echo = false;

	// Get our form
	$form = cmb_metabox_form( $meta_boxes[ $metabox_id ], $object_id, $echo );

	return $form;
}

Adding this shortcode to your WordPress editor would look something like this:

[cmb-form id=2]

With this shortcode, you'll be able to add any metabox to the front-end. Just specify which WordPress post ID (or user/comment ID) to be editing, and which metabox to use.