Skip to content

Instantly share code, notes, and snippets.

@spencejs
Created March 22, 2013 03:38
Show Gist options
  • Save spencejs/5218770 to your computer and use it in GitHub Desktop.
Save spencejs/5218770 to your computer and use it in GitHub Desktop.
Add Wordpress Meta Boxes Without A Plugin
/**
Made with the help of a tutorial at WPShout.com => http://wpshout.com.
Courtesy of the Hybrid theme - themehybrid.com
* Adds the Hybrid Settings meta box on the Write Post/Page screeens
*
* @package Hybrid
* @subpackage Admin
*/
/* Add a new meta box to the admin menu. */
add_action( 'admin_menu', 'hybrid_create_meta_box' );
/* Saves the meta box data. */
add_action( 'save_post', 'hybrid_save_meta_data' );
/**
* Function for adding meta boxes to the admin.
* Separate the post and page meta boxes.
*
* @since 0.3
*/
function hybrid_create_meta_box() {
global $theme_name;
add_meta_box( 'post-meta-boxes', __('Staff Member'), 'post_meta_boxes', 'staff', 'normal', 'high' );
add_meta_box( 'form-meta-boxes', __('Staff Member'), 'form_meta_boxes', 'forms', 'normal', 'high' );
}
/**
* Array of variables for post meta boxes. Make the
* function filterable to add options through child themes.
*
* @since 0.3
* @return array $meta_boxes
*/
function hybrid_post_meta_boxes() {
/* Array of the meta box options. */
$meta_boxes = array(
'name' => array( 'name' => 'Name', 'title' => __('Name', 'hybrid'), 'type' => 'text' ),
'room' => array( 'name' => 'Room', 'title' => __('Room Number', 'hybrid'), 'type' => 'text' ),
'phone' => array( 'name' => 'Phone', 'title' => __('Phone Number', 'hybrid'), 'type' => 'text' ),
'email' => array( 'name' => 'Email', 'title' => __('Email', 'hybrid'), 'type' => 'text' ),
);
return apply_filters( 'hybrid_post_meta_boxes', $meta_boxes );
}
/**
* Array of variables for form meta boxes. Make the
* function filterable to add options through child themes.
*
* @since 0.3
* @return array $meta_boxes
*/
function hybrid_form_meta_boxes() {
/* Array of the meta box options. */
$meta_boxes = array(
'formname' => array( 'name' => 'Form_Name', 'title' => __('Form Name', 'hybrid'), 'type' => 'text' ),
'formurl' => array( 'name' => 'Form_URL', 'title' => __('Form URL', 'hybrid'), 'type' => 'text' ),
'phone' => array( 'name' => 'Phone', 'title' => __('Phone Number', 'hybrid'), 'type' => 'text' ),
);
return apply_filters( 'hybrid_form_meta_boxes', $meta_boxes );
}
/**
* Displays meta boxes on the Write Post panel. Loops
* through each meta box in the $meta_boxes variable.
* Gets array from hybrid_post_meta_boxes().
*
* @since 0.3
*/
function post_meta_boxes() {
global $post;
$meta_boxes = hybrid_post_meta_boxes(); ?>
<table class="form-table">
<?php foreach ( $meta_boxes as $meta ) :
$value = get_post_meta( $post->ID, $meta['name'], true );
if ( $meta['type'] == 'text' )
get_meta_text_input( $meta, $value );
elseif ( $meta['type'] == 'textarea' )
get_meta_textarea( $meta, $value );
elseif ( $meta['type'] == 'select' )
get_meta_select( $meta, $value );
endforeach; ?>
</table>
<?php
}
/**
* Displays meta boxes on the Write Post panel. Loops
* through each meta box in the $meta_boxes variable.
* Gets array from hybrid_post_meta_boxes().
*
* @since 0.3
*/
function form_meta_boxes() {
global $post;
$meta_boxes = hybrid_form_meta_boxes(); ?>
<table class="form-table">
<?php foreach ( $meta_boxes as $meta ) :
$value = get_post_meta( $post->ID, $meta['name'], true );
if ( $meta['type'] == 'text' )
get_meta_text_input( $meta, $value );
elseif ( $meta['type'] == 'textarea' )
get_meta_textarea( $meta, $value );
elseif ( $meta['type'] == 'select' )
get_meta_select( $meta, $value );
endforeach; ?>
</table>
<?php
}
/**
* Outputs a text input box with arguments from the
* parameters. Used for both the post/page meta boxes.
*
* @since 0.3
* @param array $args
* @param array string|bool $value
*/
function get_meta_text_input( $args = array(), $value = false ) {
extract( $args ); ?>
<tr>
<th style="width:10%;">
<label for="<?php echo $name; ?>"><?php echo $title; ?></label>
</th>
<td>
<input type="text" name="<?php echo $name; ?>" id="<?php echo $name; ?>" value="<?php echo wp_specialchars( $value, 1 ); ?>" size="30" tabindex="30" style="width: 97%;" />
<input type="hidden" name="<?php echo $name; ?>_noncename" id="<?php echo $name; ?>_noncename" value="<?php echo wp_create_nonce( plugin_basename( __FILE__ ) ); ?>" />
</td>
</tr>
<?php
}
/**
* Outputs a select box with arguments from the
* parameters. Used for both the post/page meta boxes.
*
* @since 0.3
* @param array $args
* @param array string|bool $value
*/
function get_meta_select( $args = array(), $value = false ) {
extract( $args ); ?>
<tr>
<th style="width:10%;">
<label for="<?php echo $name; ?>"><?php echo $title; ?></label>
</th>
<td>
<select name="<?php echo $name; ?>" id="<?php echo $name; ?>">
<?php foreach ( $options as $option ) : ?>
<option <?php if ( htmlentities( $value, ENT_QUOTES ) == $option ) echo ' selected="selected"'; ?>>
<?php echo $option; ?>
</option>
<?php endforeach; ?>
</select>
<input type="hidden" name="<?php echo $name; ?>_noncename" id="<?php echo $name; ?>_noncename" value="<?php echo wp_create_nonce( plugin_basename( __FILE__ ) ); ?>" />
</td>
</tr>
<?php
}
/**
* Outputs a textarea with arguments from the
* parameters. Used for both the post/page meta boxes.
*
* @since 0.3
* @param array $args
* @param array string|bool $value
*/
function get_meta_textarea( $args = array(), $value = false ) {
extract( $args ); ?>
<tr>
<th style="width:10%;">
<label for="<?php echo $name; ?>"><?php echo $title; ?></label>
</th>
<td>
<textarea name="<?php echo $name; ?>" id="<?php echo $name; ?>" cols="60" rows="4" tabindex="30" style="width: 97%;"><?php echo wp_specialchars( $value, 1 ); ?></textarea>
<input type="hidden" name="<?php echo $name; ?>_noncename" id="<?php echo $name; ?>_noncename" value="<?php echo wp_create_nonce( plugin_basename( __FILE__ ) ); ?>" />
</td>
</tr>
<?php
}
/**
* Loops through each meta box's set of variables.
* Saves them to the database as custom fields.
*
* @since 0.3
* @param int $post_id
*/
function hybrid_save_meta_data( $post_id ) {
global $post;
if ( 'page' == $_POST['post_type'] )
$meta_boxes = array_merge( hybrid_form_meta_boxes() );
else //JOSIAH-THE FOLLOWING IS IMPORTANT FOR ADDING STUFF!
$meta_boxes = array_merge( hybrid_post_meta_boxes() );
$meta_boxes = array_merge( hybrid_form_meta_boxes() );
foreach ( $meta_boxes as $meta_box ) :
if ( !wp_verify_nonce( $_POST[$meta_box['name'] . '_noncename'], plugin_basename( __FILE__ ) ) )
return $post_id;
if ( 'forms' == $_POST['post_type'] && !current_user_can( 'edit_page', $post_id ) )
return $post_id;
elseif ( 'post' == $_POST['post_type'] && !current_user_can( 'edit_post', $post_id ) )
return $post_id;
$data = stripslashes( $_POST[$meta_box['name']] );
if ( get_post_meta( $post_id, $meta_box['name'] ) == '' )
add_post_meta( $post_id, $meta_box['name'], $data, true );
elseif ( $data != get_post_meta( $post_id, $meta_box['name'], true ) )
update_post_meta( $post_id, $meta_box['name'], $data );
elseif ( $data == '' )
delete_post_meta( $post_id, $meta_box['name'], get_post_meta( $post_id, $meta_box['name'], true ) );
endforeach;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment