Created
January 3, 2013 22:32
-
-
Save WagnerMatos/4448045 to your computer and use it in GitHub Desktop.
WordPress Custom Meta Box that can used only on certain post types, pages, etc.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/*///////////////////////////////////////////////////////////////////////////////////// | |
//// Load scripts and styles for Meta box */ | |
// enqueue scripts and styles, but only if is_admin | |
if(is_admin()) { | |
wp_enqueue_script('jquery-ui-datepicker'); | |
wp_enqueue_script('jquery-ui-slider'); | |
wp_enqueue_script('custom-js', get_template_directory_uri().'/library/metaboxes/js/custom-js.js'); | |
wp_enqueue_style('jquery-ui-custom', get_template_directory_uri().'/library/metaboxes/css/jquery-ui-custom.css'); | |
} | |
// add some custom js to the head of the page | |
add_action('admin_head','add_custom_scripts'); | |
function add_custom_scripts() { | |
global $home_custom_meta_fields, $post; | |
$output = '<script type="text/javascript"> | |
jQuery(function() {'; | |
foreach ($home_custom_meta_fields as $field) { // loop through the fields looking for certain types | |
// date | |
if($field['type'] == 'date') | |
$output .= 'jQuery(".datepicker").datepicker();'; | |
// slider | |
if ($field['type'] == 'slider') { | |
$value = get_post_meta($post->ID, $field['id'], true); | |
if ($value == '') $value = $field['min']; | |
$output .= ' | |
jQuery( "#'.$field['id'].'-slider" ).slider({ | |
value: '.$value.', | |
min: '.$field['min'].', | |
max: '.$field['max'].', | |
step: '.$field['step'].', | |
slide: function( event, ui ) { | |
jQuery( "#'.$field['id'].'" ).val( ui.value ); | |
} | |
});'; | |
} | |
} | |
$output .= '}); | |
</script>'; | |
echo $output; | |
} | |
// Get all categories from WP and create a dropdown | |
$categories = get_categories('hide_empty=0&orderby=name'); | |
$wp_cats = array(); | |
foreach ($categories as $category_list ) { | |
$wp_cats[$category_list->cat_ID] = $category_list->cat_name; | |
} | |
array_unshift($wp_cats, "Choose a category"); | |
// Wrap all categories in a function | |
function wcat2() { | |
$out = array(); | |
$categories = get_categories(); | |
foreach( $categories as $category ) { | |
$out[$category->term_id] = array( | |
'label' => $category->slug, | |
'value' => $category->term_id | |
); | |
} | |
//return array('options'=>$out); | |
return $out; | |
} | |
/*///////////////////////////////////////////////////////////////////////////////////// | |
//// Metaboxes homepage */ | |
// Check if is page-homepage.php template | |
$post_id = (isset($_GET['post'])) ? $_GET['post'] : ((isset($_POST['post_ID'])) ? $_POST['post_ID'] : false); | |
if ($post_id) : | |
$post_template = get_post_meta($post_id, '_wp_page_template', true); | |
if ($post_template == 'page-homepage.php') { | |
// Add the Meta Box | |
function home_custom_meta_box() { | |
add_meta_box( | |
'home_meta_box', // $id | |
'Homepage options', // $title | |
'home_show_custom_meta_box', // $callback | |
'page', // $page | |
'normal', // $context | |
'high'); // $priority | |
} | |
add_action('add_meta_boxes', 'home_custom_meta_box'); | |
// Field Array | |
$prefix = 'home_'; | |
$home_custom_meta_fields = array( | |
array( | |
'label' => 'Slider On/Off', | |
'desc' => 'Tick here if you would like a slider on this page (This will override the theme settings).', | |
'id' => $prefix.'slider_default_onoff', | |
'type' => 'select', | |
'options' => array ( | |
'select' => array ( | |
'label' => 'Select one', | |
'value' => 'none' | |
), | |
'one' => array ( | |
'label' => 'On', | |
'value' => 'one' | |
), | |
'two' => array ( | |
'label' => 'Off', | |
'value' => 'two' | |
) | |
) | |
), | |
array( | |
'label' => 'Short code for slider', | |
'desc' => 'Something like this: [rev_slider slider3]', | |
'id' => $prefix.'slider_code', | |
'type' => 'text' | |
), | |
); | |
// The Callback | |
function home_show_custom_meta_box() { | |
global $home_custom_meta_fields, $post; | |
// Use nonce for verification | |
echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />'; | |
// Begin the field table and loop | |
echo '<table class="form-table">'; | |
foreach ($home_custom_meta_fields as $field) { | |
// get value of this field if it exists for this post | |
$meta = get_post_meta($post->ID, $field['id'], true); | |
// begin a table row with | |
echo '<tr> | |
<th><label for="'.$field['id'].'">'.$field['label'].'</label></th> | |
<td>'; | |
switch($field['type']) { | |
// text | |
case 'text': | |
echo '<input type="text" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" /> | |
<br /><span class="description">'.$field['desc'].'</span>'; | |
break; | |
// textarea | |
case 'textarea': | |
echo '<textarea name="'.$field['id'].'" id="'.$field['id'].'" cols="60" rows="4">'.$meta.'</textarea> | |
<br /><span class="description">'.$field['desc'].'</span>'; | |
break; | |
// checkbox | |
case 'checkbox': | |
echo '<input type="checkbox" name="'.$field['id'].'" id="'.$field['id'].'" ',$meta ? ' checked="checked"' : '','/> | |
<label for="'.$field['id'].'">'.$field['desc'].'</label>'; | |
break; | |
// select | |
case 'select': | |
echo '<select name="'.$field['id'].'" id="'.$field['id'].'">'; | |
foreach ($field['options'] as $option) { | |
echo '<option', $meta == $option['value'] ? ' selected="selected"' : '', ' value="'.$option['value'].'">'.$option['label'].'</option>'; | |
} | |
echo '</select><br /><span class="description">'.$field['desc'].'</span>'; | |
break; | |
// radio | |
case 'radio': | |
foreach ( $field['options'] as $option ) { | |
echo '<input type="radio" name="'.$field['id'].'" id="'.$option['value'].'" value="'.$option['value'].'" ',$meta == $option['value'] ? ' checked="checked"' : '',' /> | |
<label for="'.$option['value'].'">'.$option['label'].'</label><br />'; | |
} | |
echo '<span class="description">'.$field['desc'].'</span>'; | |
break; | |
// checkbox_group | |
case 'checkbox_group': | |
foreach ($field['options'] as $option) { | |
echo '<input type="checkbox" value="'.$option['value'].'" name="'.$field['id'].'[]" id="'.$option['value'].'"',$meta && in_array($option['value'], $meta) ? ' checked="checked"' : '',' /> | |
<label for="'.$option['value'].'">'.$option['label'].'</label><br />'; | |
} | |
echo '<span class="description">'.$field['desc'].'</span>'; | |
break; | |
// tax_select | |
case 'tax_select': | |
echo '<select name="'.$field['id'].'" id="'.$field['id'].'"> | |
<option value="">Select One</option>'; // Select One | |
$terms = get_terms($field['id'], 'get=all'); | |
$selected = wp_get_object_terms($post->ID, $field['id']); | |
foreach ($terms as $term) { | |
if (!empty($selected) && !strcmp($term->slug, $selected[0]->slug)) | |
echo '<option value="'.$term->slug.'" selected="selected">'.$term->name.'</option>'; | |
else | |
echo '<option value="'.$term->slug.'">'.$term->name.'</option>'; | |
} | |
$taxonomy = get_taxonomy($field['id']); | |
echo '</select><br /><span class="description"><a href="'.get_bloginfo('home').'/wp-admin/edit-tags.php?taxonomy='.$field['id'].'">Manage '.$taxonomy->label.'</a></span>'; | |
break; | |
// post_list | |
case 'post_list': | |
$items = get_posts( array ( | |
'post_type' => $field['post_type'], | |
'posts_per_page' => -1 | |
)); | |
echo '<select name="'.$field['id'].'" id="'.$field['id'].'"> | |
<option value="">Select One</option>'; // Select One | |
foreach($items as $item) { | |
echo '<option value="'.$item->ID.'"',$meta == $item->ID ? ' selected="selected"' : '','>'.$item->post_type.': '.$item->post_title.'</option>'; | |
} // end foreach | |
echo '</select><br /><span class="description">'.$field['desc'].'</span>'; | |
break; | |
// date | |
case 'date': | |
echo '<input type="text" class="datepicker" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" /> | |
<br /><span class="description">'.$field['desc'].'</span>'; | |
break; | |
// slider | |
case 'slider': | |
$value = $meta != '' ? $meta : '0'; | |
echo '<div id="'.$field['id'].'-slider"></div> | |
<input type="text" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$value.'" size="5" /> | |
<br /><span class="description">'.$field['desc'].'</span>'; | |
break; | |
// image | |
case 'image': | |
$image = get_template_directory_uri().'/images/image.png'; | |
echo '<span class="custom_default_image" style="display:none">'.$image.'</span>'; | |
if ($meta) { $image = wp_get_attachment_image_src($meta, 'medium'); $image = $image[0]; } | |
echo '<input name="'.$field['id'].'" type="hidden" class="custom_upload_image" value="'.$meta.'" /> | |
<img src="'.$image.'" class="custom_preview_image" alt="" /><br /> | |
<input class="custom_upload_image_button button" type="button" value="Choose Image" /> | |
<small> <a href="#" class="custom_clear_image_button">Remove Image</a></small> | |
<br clear="all" /><span class="description">'.$field['desc'].'</span>'; | |
break; | |
// repeatable | |
case 'repeatable': | |
echo '<a class="repeatable-add button" href="#">+</a> | |
<ul id="'.$field['id'].'-repeatable" class="custom_repeatable">'; | |
$i = 0; | |
if ($meta) { | |
foreach($meta as $row) { | |
echo '<li><span class="sort hndle">|||</span> | |
<input type="text" name="'.$field['id'].'['.$i.']" id="'.$field['id'].'" value="'.$row.'" size="30" /> | |
<a class="repeatable-remove button" href="#">-</a></li>'; | |
$i++; | |
} | |
} else { | |
echo '<li><span class="sort hndle">|||</span> | |
<input type="text" name="'.$field['id'].'['.$i.']" id="'.$field['id'].'" value="" size="30" /> | |
<a class="repeatable-remove button" href="#">-</a></li>'; | |
} | |
echo '</ul> | |
<span class="description">'.$field['desc'].'</span>'; | |
break; | |
} //end switch | |
echo '</td></tr>'; | |
} // end foreach | |
echo '</table>'; // end table | |
} | |
// Save the Data | |
function home_save_custom_meta($post_id) { | |
global $home_custom_meta_fields; | |
// verify nonce | |
if (!wp_verify_nonce($_POST['custom_meta_box_nonce'], basename(__FILE__))) | |
return $post_id; | |
// check autosave | |
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) | |
return $post_id; | |
// check permissions | |
if ('page' == $_POST['post_type']) { | |
if (!current_user_can('edit_page', $post_id)) | |
return $post_id; | |
} elseif (!current_user_can('edit_post', $post_id)) { | |
return $post_id; | |
} | |
// loop through fields and save the data | |
foreach ($home_custom_meta_fields as $field) { | |
$old = get_post_meta($post_id, $field['id'], true); | |
$new = $_POST[$field['id']]; | |
if ($new && $new != $old) { | |
update_post_meta($post_id, $field['id'], $new); | |
} elseif ('' == $new && $old) { | |
delete_post_meta($post_id, $field['id'], $old); | |
} | |
} // enf foreach | |
} | |
add_action('save_post', 'home_save_custom_meta'); | |
} | |
endif; | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment