1

I created a custom meta box inside a page but I can't display the content!
I'm inside the loop and here there is the code of my functions.php:

$meta_box['portfolio'] = array(
    'id' => 'descportfolio',
    'title' => 'Description',
    'context' => 'normal',
    'priority' => 'high',
    'fields' => array(
        array(
            'name' => 'Short Description',
            'desc' => 'This short desc will appear under the thumbnail with hover effect',
            'id' => 'portfolio_description',
            'type' => 'descport',
            'default' => ''
        )
   )
);  
add_action('admin_menu', 'descportfolio_add_box'); 
//Add meta boxes to post types
function descportfolio_add_box() {
    global $meta_box;

    foreach($meta_box as $post_type => $value) {
        add_meta_box($value['id'], $value['title'], 'descportfolio_format_box', $post_type, $value['context'], $value['priority']);
    }
}
//Format meta boxes
function descportfolio_format_box() {
  global $meta_box, $post;

  // Use nonce for verification
  echo '<input type="hidden" name="descportfolio_meta_box_nonce" value="', wp_create_nonce(basename(__FILE__)), '" />';

  echo '<table class="form-table">';

  foreach ($meta_box[$post->post_type]['fields'] as $field) {
      // get current post meta data
      $meta = get_post_meta($post->ID, $field['id'], true);

      echo '<tr>'.
              '<th style="width:20%"><label for="'. $field['id'] .'">'. $field['name']. '</label></th>'.
              '<td>';
      switch ($field['type']) {
          case 'text':
              echo '<input type="text" name="'. $field['id']. '" id="'. $field['id'] .'" value="'. ($meta ? $meta : $field['default']) . '" size="30" style="width:97%" />'. '<br />'. $field['desc'];
              break;
          case 'descport':
              echo '<input type="textarea" name="'. $field['id']. '" id="'. $field['id'] .'" value="'. ($meta ? $meta : $field['default']) . '" size="30" maxlength="5" style="width:97%" />'. '<br />'. $field['desc'];
              break;
          case 'textarea':
              echo '<textarea name="'. $field['id']. '" id="'. $field['id']. '" cols="60" rows="4" style="width:97%">'. ($meta ? $meta : $field['default']) . '</textarea>'. '<br />'. $field['desc'];
              break;
          case 'select':
              echo '<select name="'. $field['id'] . '" id="'. $field['id'] . '">';
              foreach ($field['options'] as $option) {
                  echo '<option '. ( $meta == $option ? ' selected="selected"' : '' ) . '>'. $option . '</option>';
              }
              echo '</select>';
              break;
          case 'radio':
              foreach ($field['options'] as $option) {
                  echo '<input type="radio" name="' . $field['id'] . '" value="' . $option['value'] . '"' . ( $meta == $option['value'] ? ' checked="checked"' : '' ) . ' />' . $option['name'];
              }
              break;
          case 'checkbox':
              echo '<input type="checkbox" name="' . $field['id'] . '" id="' . $field['id'] . '"' . ( $meta ? ' checked="checked"' : '' ) . ' />';
              break;
      }
      echo     '<td>'.'</tr>';
  }

  echo '</table>';

}
// Save data from meta box
function descportfolio_save_data($post_id) {
    global $meta_box,  $post;

    //Verify nonce
    if (!wp_verify_nonce($_POST['descportfolio_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;
    }

    foreach ($meta_box[$post->post_type]['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);
        }
    }
}

add_action('save_post', 'descportfolio_save_data');

And here my code inside the page

<?php echo get_post_meta($post->ID, "descportfolio", true); ?>

I've tried with get_post_ID instead of $post->ID, but nothing changed.
Can anyone see any error?

  • Do you see the values in your database correctly? – fischi Feb 21 '14 at 9:34
  • I went in wp_postmeta and I didn't find anything but in the post panel I can see the value of the meta_box so it's saved somewhere – dborghez Feb 21 '14 at 9:40
0

You got the wrong id for your get_post_meta(). As you define the input-name by the id of the field in your metabox, it has to be portfolio_description.

<?php echo get_post_meta($post->ID, "portfolio_description", true); ?>

Should do the trick.

If you are not sure which name of the post_meta you need to call, try inspecting the input field in your developer tools in your browser, and check the name of the input.

inspect metabox field

| improve this answer | |
  • glad to hear @dborghez, take care! – fischi Feb 21 '14 at 10:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.