Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I have created a custom meta box which I have pasted in functions.php (minus the <?php call of course)

I have two fields in this meta box, one is labeled 'Primary Title' and the other is labeled 'Secondary Title'.

How do I call data from each of these boxes individually so that I can insert them into the template of a page?

<?php
$prefix = 'dbt_';
$meta_box = array(
  'id' => 'my-meta-box',
  'title' => 'Custom meta box',
  'page' => 'post',
  'context' => 'normal',
  'priority' => 'high',
  'fields' => array(
    array(
     'name' => 'Primary Title',
     'id' => $prefix . 'text',
     'type' => 'text'
    ),
    array(
     'name' => 'Secondary Title',
     'id' => $prefix . 'text1',
     'type' => 'text',  
    )   
  )
);

add_action('admin_menu', 'mytheme_add_box');

// Add meta box
function mytheme_add_box() {
  global $meta_box;
  add_meta_box(
    $meta_box['id'],
    $meta_box['title'],
    'mytheme_show_box',
    $meta_box['page'],
    $meta_box['context'],
    $meta_box['priority']
  );
}

// Callback function to show fields in meta box
function mytheme_show_box() {
  global $meta_box, $post;
  // Use nonce for verification
  echo '<input type="hidden" name="mytheme_meta_box_nonce" value="';
  echo wp_create_nonce(basename(__FILE__)), '" />';
  echo '<table class="form-table">';
  foreach ($meta_box['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'] . '">';
    echo $field['name'];
    echo '</label></th><td>';
    switch ($field['type']) {
      case 'text':
        echo '<input type="text" name="' . $field['id'] . '"';
        echo ' id="' .$field['id'] . '"';
        echo ' value="' . ( $meta ? $meta : $field['std'] ) . '"';
        echo ' size="30" style="width:97%" />';
        echo '<br />' . $field['desc'];
        break;
    }
    echo '<td></tr>';
  }
  echo '</table>';
}

add_action('save_post', 'mytheme_save_data');

// Save data from meta box
function mytheme_save_data($post_id) {
    global $meta_box;
    // verify nonce
    if (!wp_verify_nonce($_POST['mytheme_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['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);
      }
    }
}
?>
share|improve this question
    
Please edit relevant code into the question. A question should not depend upon data from a third party. –  s_ha_dum Apr 1 at 15:40
    
Updated accordingly. –  AndrettiMilas Apr 1 at 15:53

2 Answers 2

up vote 5 down vote accepted

Meta boxes are saving data at each post ($post_id)

$value = get_post_meta($post_id, 'name', true);

name = 'dbt_text' or 'dbt_text1'

so

$value = get_post_meta($post_id, 'dbt_text', true);
$value1 = get_post_meta($post_id, 'dbt_text1', true);

~ more info on get_post_meta

share|improve this answer
    
For some reason, this isn't fetching my information. –  AndrettiMilas Apr 6 at 21:55
    
@AndrettiMilas this line: $meta = get_post_meta($post->ID, $field['id'], true) comes from your code. If your metabox works well, the code in this answer have to work too. So be sure that when you call it what you use as 1st argument for get_post_meta is the ID of post where you saved the fields and the 2nd argument ('dbt_text' or 'dbt_text1' in the answer) match exactly what you have in $field['id'], including prefix. –  G. M. Apr 7 at 0:31
    
I tried exactly what was in the answer and it did not work. –  AndrettiMilas Apr 7 at 3:17
    
@AndrettiMilas You must define $post_id. Try this: echo get_post_meta( get_the_ID(), 'dbt_text', true ) in the single post loop. –  birgire Apr 7 at 7:31

I just ran your initial code myself with wp_debug on and it seems that there is some basic housekeeping needed for this to actually save the data into the custom field. I think your problem so far is that there is no data being saved in, therefore you cannot read anything out.

On line 55 and 57 you are trying to prints parts of the array that do not exist, which is leading to some errors.

Line 55:

echo ' value="' . ( $meta ? $meta : $field['std'] ) . '"';

$field['std'] does not exist, the only keys inside of $field are name, id and type.

Line 57:

echo '<br />' . $field['desc'];

$field['desc'] also does not exist. If you want these keys to exist in the array, add them in your metabox array initially.

I changed the line 55 to reference $field['id'] and removed line 57 and it works just fine.

Then, in your template file if you call:

$value = get_post_meta($post->ID, 'dbt_text', true);

$value1 = get_post_meta($post->ID, 'dbt_text1', true);

echo $value;

You will see your correct data.

share|improve this answer
    
@AndrettiMilas are you still looking for a solution to this? If not, please mark it answered. –  Aris Blevins Apr 11 at 18:16

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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