1.  
  2. $portfolio_excerpt_1_metabox = array(
  3.     'id' => 'portfolio-excerpt',
  4.     'title' => 'portfolio-excerpt',
  5.     'page' => array('portfolio'),
  6.     'context' => 'advanced',
  7.     'priority' => 'high',
  8.     'fields' => array(
  9.  
  10.                
  11.                 array(
  12.                     'name'          => 'Portfolio Excerpt',
  13.                     'desc'          => 'This is the excerpt that will display in Main portfolio sortable archive under the image',
  14.                     'id'                => 'nick_prtf_excerpt',
  15.                     'class'             => 'nick_prtf_excerpt',
  16.                     'type'          => 'textarea',
  17.                     'rich_editor'   => 0,          
  18.                     'max'           => 0               
  19.                 ),
  20.                 )
  21. );         
  22.            
  23. add_action('admin_menu', 'nick_add_portfolio_excerpt_1_meta_box');
  24. function nick_add_portfolio_excerpt_1_meta_box() {
  25.  
  26.     global $portfolio_excerpt_1_metabox;       
  27.  
  28.     foreach($portfolio_excerpt_1_metabox['page'] as $page) {
  29.         add_meta_box($portfolio_excerpt_1_metabox['id'], $portfolio_excerpt_1_metabox['title'], 'nick_show_portfolio_excerpt_1_box', $page, 'advanced', 'high', $portfolio_excerpt_1_metabox);
  30.     }
  31. }
  32.  
  33. // function to show meta boxes
  34. function nick_show_portfolio_excerpt_1_box()    {
  35.     global $post;
  36.     global $portfolio_excerpt_1_metabox;
  37.     global $nick_prefix;
  38.     global $wp_version;
  39.    
  40.     // Use nonce for verification
  41.     echo '<input type="hidden" name="nick_portfolio_excerpt_1_meta_box_nonce" value="', wp_create_nonce(basename(__FILE__)), '" />';
  42.    
  43.     echo '<table class="form-table">';
  44.  
  45.     foreach ($portfolio_excerpt_1_metabox['fields'] as $field) {
  46.         // get current post meta data
  47.  
  48.         $meta = get_post_meta($post->ID, $field['id'], true);
  49.        
  50.         echo '<tr>',
  51.                 '<th style="width:20%"><label for="', $field['id'], '">', stripslashes($field['name']), '</label></th>',
  52.                 '<td class="nick_field_type_' . str_replace(' ', '_', $field['type']) . '">';
  53.         switch ($field['type']) {
  54.             case 'text':
  55.                 echo '<input type="text" name="', $field['id'], '" id="', $field['id'], '" value="', $meta ? $meta : $field['std'], '" size="30" style="width:97%" /><br/>', '', stripslashes($field['desc']);
  56.                 break;
  57.             case 'date':
  58.                 if($meta) { $value = nick_timestamp_to_date($meta); } else {  $value = ''; }
  59.                 echo '<input type="text" class="nick_datepicker" name="' . $field['id'] . '" id="' . $field['id'] . '" value="'. $value . '" size="30" style="width:97%" />' . '' . stripslashes($field['desc']);
  60.                 break;
  61.             case 'upload':
  62.                 echo '<input type="text" class="nick_upload_field" name="', $field['id'], '" id="', $field['id'], '" value="', $meta ? $meta : $field['std'], '" size="30" style="width:80%" /><input class="nick_upload_image_button" type="button" value="Upload Image" /><br/>', '', stripslashes($field['desc']);
  63.                 break;
  64.             case 'textarea':
  65.            
  66.                 if($field['rich_editor'] == 1) {
  67.                     if($wp_version >= 3.3) {
  68.                         echo wp_editor($meta, $field['id'], array('textarea_name' => $field['id']));
  69.                     } else {
  70.                         // older versions of WP
  71.                         $editor = '';
  72.                         if(!post_type_supports($post->post_type, 'editor')) {
  73.                             $editor = wp_tiny_mce(true, array('editor_selector' => $field['class'], 'remove_linebreaks' => false) );
  74.                         }
  75.                         $field_html = '<div style="width: 97%; border: 1px solid #DFDFDF;"><textarea name="' . $field['id'] . '" class="' . $field['class'] . '" id="' . $field['id'] . '" cols="60" rows="8" style="width:100%">'. $meta . '</textarea></div><br/>' . __(stripslashes($field['desc']));
  76.                         echo $editor . $field_html;
  77.                     }
  78.                 } else {
  79.                     echo '<div style="width: 100%;"><textarea name="', $field['id'], '" class="', $field['class'], '" id="', $field['id'], '" cols="60" rows="8" style="width:97%">', $meta ? $meta : $field['std'], '</textarea></div>', '', stripslashes($field['desc']);            
  80.                 }
  81.                
  82.                 break;
  83.             case 'select':
  84.                 echo '<select name="', $field['id'], '" id="', $field['id'], '">';
  85.                 foreach ($field['options'] as $option) {
  86.                     echo '<option value="' . $option . '"', $meta == $option ? ' selected="selected"' : '', '>', $option, '</option>';
  87.                 }
  88.                 echo '</select>', '', stripslashes($field['desc']);
  89.                 break;
  90.             case 'radio':
  91.                 foreach ($field['options'] as $option) {
  92.                     echo '<input type="radio" name="', $field['id'], '" value="', $option, '"', $meta == $option ? ' checked="checked"' : '', ' /> ', $option;
  93.                 }
  94.                 echo '<br/>' . stripslashes($field['desc']);
  95.                 break;
  96.             case 'multicheck':
  97.                 foreach ($field['options'] as $option) {
  98.                     echo '<input type="checkbox" name="' . $field['id'] . '[' . $option . ']" value="' . $option . '"' . checked( true, in_array( $option, $meta ), false ) . '/> ' . $option;
  99.                 }
  100.                 echo '<br/>' . stripslashes($field['desc']);
  101.                 break;
  102.             case 'checkbox':
  103.                 echo '<input type="checkbox" name="', $field['id'], '" id="', $field['id'], '"', $meta ? ' checked="checked"' : '', ' /> ';
  104.                 echo stripslashes($field['desc']);
  105.                 break;
  106.             case 'slider':
  107.                 echo '<input type="text" rel="' . $field['max'] . '" name="' . $field['id'] . '" id="' . $field['id'] . '" value="' . $meta . '" size="1" style="float: left; margin-right: 5px" />';
  108.                 echo '<div class="nick-slider" rel="' . $field['id'] . '" style="float: left; width: 60%; margin: 5px 0 0 0;"></div>';     
  109.                 echo '<div style="width: 100%; clear: both;">' . stripslashes($field['desc']) . '</div>';
  110.                 break;
  111.             case 'repeatable' :
  112.                
  113.                 $field_html = '<input type="hidden" id="' . $field['id'] . '" class="nick_repeatable_field_name" value=""/>';
  114.                 if(is_array($meta)) {
  115.                     $count = 1;
  116.                     foreach($meta as $key => $value) {
  117.                         $field_html .= '<div class="nick_repeatable_wrapper"><input type="text" class="nick_repeatable_field" name="' . $field['id'] . '[]" id="' . $field['id'] . '[]" value="' . $meta[$key] . '" size="30" style="width:90%" />';
  118.                         if($count > 1) {
  119.                             $field_html .= '<a href="#" class="nick_remove_repeatable button-secondary">x</a><br/>';
  120.                         }
  121.                         $field_html .= '</div>';
  122.                         $count++;
  123.                     }
  124.                 } else {
  125.                     $field_html .= '<div class="nick_repeatable_wrapper"><input type="text" class="nick_repeatable_field" name="' . $field['id'] . '[]" id="' . $field['id'] . '[]" value="' . $meta . '" size="30" style="width:90%" /></div>';
  126.                 }
  127.                 $field_html .= '<button class="nick_add_new_field button-secondary">' . __('Add New', 'nick') . '</button>  ' . __(stripslashes($field['desc']));
  128.                
  129.                 echo $field_html;
  130.                
  131.                 break;
  132.            
  133.             case 'repeatable upload' :
  134.            
  135.                 $field_html = '<input type="hidden" id="' . $field['id'] . '" class="nick_repeatable_upload_field_name" value=""/>';
  136.                 if(is_array($meta)) {
  137.                     $count = 1;
  138.                     foreach($meta as $key => $value) {
  139.                         $field_html .= '<div class="nick_repeatable_upload_wrapper"><input type="text" class="nick_repeatable_upload_field nick_upload_field" name="' . $field['id'] . '[]" id="' . $field['id'] . '[]" value="' . $meta[$key] . '" size="30" style="width:80%" /><button class="button-secondary nick_upload_image_button">Upload File</button>';
  140.                         if($count > 1) {
  141.                             $field_html .= '<a href="#" class="nick_remove_repeatable button-secondary">x</a><br/>';
  142.                         }
  143.                         $field_html .= '</div>';
  144.                         $count++;
  145.                     }
  146.                 } else {
  147.                     $field_html .= '<div class="nick_repeatable_upload_wrapper"><input type="text" class="nick_repeatable_upload_field nick_upload_field" name="' . $field['id'] . '[]" id="' . $field['id'] . '[]" value="' . $meta . '" size="30" style="width:80%" /><input class="button-secondary nick_upload_image_button" type="button" value="Upload File" /></div>';
  148.                 }
  149.                 $field_html .= '<button class="nick_add_new_upload_field button-secondary">' . __('Add New', 'nick') . '</button>  ' . __(stripslashes($field['desc']));       
  150.            
  151.                 echo $field_html;
  152.            
  153.                 break;
  154.         }
  155.         echo     '<td>',
  156.             '</tr>';
  157.     }
  158.    
  159.     echo '</table>';
  160. }  
  161.  
  162. // Save data from meta box
  163. add_action('save_post', 'nick_portfolio_excerpt_1_save');
  164. function nick_portfolio_excerpt_1_save($post_id) {
  165.     global $post;
  166.     global $portfolio_excerpt_1_metabox;
  167.    
  168.     // verify nonce
  169.     if (!wp_verify_nonce($_POST['nick_portfolio_excerpt_1_meta_box_nonce'], basename(__FILE__))) {
  170.         return $post_id;
  171.     }
  172.  
  173.     // check autosave
  174.     if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
  175.         return $post_id;
  176.     }
  177.  
  178.     // check permissions
  179.     if ('page' == $_POST['post_type']) {
  180.         if (!current_user_can('edit_page', $post_id)) {
  181.             return $post_id;
  182.         }
  183.     } elseif (!current_user_can('edit_post', $post_id)) {
  184.         return $post_id;
  185.     }
  186.    
  187.     foreach ($portfolio_excerpt_1_metabox['fields'] as $field) {
  188.    
  189.         $old = get_post_meta($post_id, $field['id'], true);
  190.         $new = $_POST[$field['id']];
  191.        
  192.         if ($new && $new != $old) {
  193.             if($field['type'] == 'date') {
  194.                 $new = nick_format_date($new);
  195.                 update_post_meta($post_id, $field['id'], $new);
  196.             } else {
  197.                 if(is_string($new)) {
  198.                     $new = $new;
  199.                 }
  200.                 update_post_meta($post_id, $field['id'], $new);
  201.                
  202.                
  203.             }
  204.         } elseif ('' == $new && $old) {
  205.             delete_post_meta($post_id, $field['id'], $old);
  206.         }
  207.     }
  208. }
  209.  
  210.  
  211. function nick_export_ui_scripts() {
  212.  
  213.     global $nick_options;
  214.     ?>
  215.     <script type="text/javascript">
  216.             jQuery(document).ready(function($)
  217.             {
  218.                
  219.                 if($('.form-table .nick_upload_field').length > 0 ) {
  220.                     // Media Uploader
  221.                     window.formfield = '';
  222.    
  223.                     $('.nick_upload_image_button').live('click', function() {
  224.                     window.formfield = $('.nick_upload_field',$(this).parent());
  225.                         tb_show('', 'media-upload.php?type=file&TB_iframe=true');
  226.                                         return false;
  227.                         });
  228.    
  229.                         window.original_send_to_editor = window.send_to_editor;
  230.                         window.send_to_editor = function(html) {
  231.                             if (window.formfield) {
  232.                                 imgurl = $('a','<div>'+html+'</div>').attr('href');
  233.                                 window.formfield.val(imgurl);
  234.                                 tb_remove();
  235.                             }
  236.                             else {
  237.                                 window.original_send_to_editor(html);
  238.                             }
  239.                             window.formfield = '';
  240.                             window.imagefield = false;
  241.                         }
  242.                 }
  243.                 if($('.form-table .nick-slider').length > 0 ) {
  244.                     $('.nick-slider').each(function(){
  245.                         var $this = $(this);
  246.                         var id = $this.attr('rel');
  247.                         var val = $('#' + id).val();
  248.                         var max = $('#' + id).attr('rel');
  249.                         max = parseInt(max);
  250.                         //var step = $('#' + id).closest('input').attr('rel');
  251.                         $this.slider({
  252.                             value: val,
  253.                             max: max,
  254.                             step: 1,
  255.                             slide: function(event, ui) {
  256.                                 $('#' + id).val(ui.value);
  257.                             }
  258.                         });
  259.                     });
  260.                 }
  261.                
  262.                 if($('.form-table .nick_datepicker').length > 0 ) {
  263.                     var dateFormat = 'mm/dd/yy';
  264.                     $('.nick_datepicker').datepicker({dateFormat: dateFormat});
  265.                 }
  266.                
  267.                 // add new repeatable field
  268.                 $(".nick_add_new_field").on('click', function() {                  
  269.                     var field = $(this).closest('td').find("div.nick_repeatable_wrapper:last").clone(true);
  270.                     var fieldLocation = $(this).closest('td').find('div.nick_repeatable_wrapper:last');
  271.                     // set the new field val to blank
  272.                     $('input', field).val("");
  273.                     field.insertAfter(fieldLocation, $(this).closest('td'));
  274.    
  275.                     return false;
  276.                 });    
  277.    
  278.                 // add new repeatable upload field
  279.                 $(".nick_add_new_upload_field").on('click', function() {   
  280.                     var container = $(this).closest('tr');
  281.                     var field = $(this).closest('td').find("div.nick_repeatable_upload_wrapper:last").clone(true);
  282.                     var fieldLocation = $(this).closest('td').find('div.nick_repeatable_upload_wrapper:last');
  283.                     // set the new field val to blank
  284.                     $('input[type="text"]', field).val("");
  285.                
  286.                     field.insertAfter(fieldLocation, $(this).closest('td'));
  287.    
  288.                     return false;
  289.                 });
  290.                
  291.                 // remove repeatable field
  292.                 $('.nick_remove_repeatable').on('click', function(e) {
  293.                     e.preventDefault();
  294.                     var field = $(this).parent();
  295.                     $('input', field).val("");
  296.                     field.remove();            
  297.                     return false;
  298.                 });                                        
  299.                                                        
  300.             });
  301.       </script>
  302.     <?php
  303. }
  304.  
  305. function nick_export_datepicker_ui_scripts() {
  306.     global $nick_base_dir;
  307.     wp_enqueue_script('jquery-ui-datepicker');
  308.     wp_enqueue_script('jquery-ui-slider');
  309. }
  310. function nick_export_datepicker_ui_styles() {
  311.     global $nick_base_dir;
  312.     wp_enqueue_style('jquery-ui-css', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css', false, '1.8', 'all');
  313. }
  314.  
  315. // these are for newest versions of WP
  316. add_action('admin_print_scripts-post.php', 'nick_export_datepicker_ui_scripts');
  317. add_action('admin_print_scripts-edit.php', 'nick_export_datepicker_ui_scripts');
  318. add_action('admin_print_scripts-post-new.php', 'nick_export_datepicker_ui_scripts');
  319. add_action('admin_print_styles-post.php', 'nick_export_datepicker_ui_styles');
  320. add_action('admin_print_styles-edit.php', 'nick_export_datepicker_ui_styles');
  321. add_action('admin_print_styles-post-new.php', 'nick_export_datepicker_ui_styles');
  322.  
  323. if ((isset($_GET['post']) && (isset($_GET['action']) && $_GET['action'] == 'edit') ) || (strstr($_SERVER['REQUEST_URI'], 'wp-admin/post-new.php')))
  324. {
  325.     add_action('admin_head', 'nick_export_ui_scripts');
  326. }
  327.  
  328. // converts a time stamp to date string for meta fields
  329. if(!function_exists('nick_timestamp_to_date')) {
  330.     function nick_timestamp_to_date($date) {
  331.        
  332.         return date('m/d/Y', $date);
  333.     }
  334. }
  335. if(!function_exists('nick_format_date')) {
  336.     function nick_format_date($date) {
  337.  
  338.         $date = strtotime($date);
  339.        
  340.         return $date;
  341.             }
  342. }