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.

hi does any one know how can i add other meta box and save the data in a different custom fields, using the code below.

<?php
function add_meta_boxes() {
    add_meta_box(
        'repeatable-fields',
        'Audio Playlist',
        'repeatable_meta_box_display',
        'post',
        'normal',
        'high');
}
add_action('admin_menu', 'add_meta_boxes');


function repeatable_meta_box_display() {
    global $custom_meta_fields, $post;
    wp_nonce_field( 'repeatable_meta_box_nonce', 'repeatable_meta_box_nonce' );
    //$repeatable_fields = get_post_meta($post->ID, $prefix, true);
?>
    <script type="text/javascript">
jQuery(document).ready(function($) {
    $('.metabox_submit').click(function(e) {
        e.preventDefault();
        $('#publish').click();
    });
    $('#add-row').on('click', function() {
        var row = $('.empty-row.screen-reader-text').clone(true);
        row.removeClass('empty-row screen-reader-text');
        row.insertBefore('#repeatable-fieldset-one tbody>tr:last');
        return false;
    });
    $('.remove-row').on('click', function() {
        $(this).parents('tr').remove();
        return false;
    });

    $('#repeatable-fieldset-one tbody').sortable({
        opacity: 0.6,
        revert: true,
        cursor: 'move',
        handle: '.sort'
    });
});
    </script>
<?php 
        $meta = get_post_meta($post->ID, 'custom_audio', true);
?>
    <table id="repeatable-fieldset-one" width="100%">
    <thead>
        <tr>
            <th width="2%"></th>
            <th width="30%">Name</th>
            <th width="60%">URL</th>
            <th width="2%"></th>
        </tr>
    </thead>
    <tbody>
    <?php

        if ( $meta ) {

            foreach ( $meta as $field ) {
?>
    <tr>
        <td><a class="button remove-row" href="#">-</a></td>
        <td><input type="text" class="widefat" name="name[]" value="<?php if($field['name'] != '') echo esc_attr( $field['name'] ); ?>" /></td>

        <td><input type="text" class="widefat" name="url[]" value="<?php if ($field['url'] != '') echo esc_attr( $field['url'] ); else echo 'http://'; ?>" /></td>
        <td><a class="sort">|||</a></td>

    </tr>
    <?php
            }
         } else {
            // show a blank one
?>
    <tr>
        <td><a class="button remove-row" href="#">-</a></td>
        <td><input type="text" class="widefat" name="name[]" /></td>


        <td><input type="text" class="widefat" name="url[]" value="http://" /></td>
<td><a class="sort">|||</a></td>

    </tr>
    <?php } ?>

    <!-- empty hidden one for jQuery -->
    <tr class="empty-row screen-reader-text">
        <td><a class="button remove-row" href="#">-</a></td>
        <td><input type="text" class="widefat" name="name[]" /></td>


        <td><input type="text" class="widefat" name="url[]" value="http://" /></td>
<td><a class="sort">|||</a></td>

    </tr>
    </tbody>
    </table>

    <p><a id="add-row" class="button" href="#">Add another</a>
    <input type="submit" class="metabox_submit" value="Save" />
    </p>
    <?php

}

add_action('save_post', 'repeatable_meta_box_save');
function repeatable_meta_box_save($post_id) {
    global $custom_meta_fields;
    if ( ! isset( $_POST['repeatable_meta_box_nonce'] ) ||
        ! wp_verify_nonce( $_POST['repeatable_meta_box_nonce'], 'repeatable_meta_box_nonce' ) )
        return;

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
        return;

    if (!current_user_can('edit_post', $post_id))
        return;

    // loop through fields and save the data
        $old = get_post_meta($post_id, 'custom_audio', true);
        $new = array();


        $names = $_POST['name'];
        $urls = $_POST['url'];

        $count = count( $names );

        for ( $i = 0; $i < $count; $i++ ) {
            if ( $names[$i] != '' ) :
                $new[$i]['name'] = stripslashes( strip_tags( $names[$i] ) );


            if ( $urls[$i] == 'http://' )
                $new[$i]['url'] = '';
            else
                $new[$i]['url'] = stripslashes( $urls[$i] ); // and however you want to sanitize
            endif;
        }

        if ( !empty( $new ) && $new != $old )
            update_post_meta( $post_id, 'custom_audio', $new );
        elseif ( empty($new) && $old )
            delete_post_meta( $post_id, 'custom_audio', $old );

} ?>
share|improve this question
add comment

1 Answer 1

up vote 2 down vote accepted
function add_meta_boxes() {
     add_meta_box(
          'repeatable-fields',
          'Audio Playlist',
          'repeatable_meta_box_display',
          'post',
          'normal',
          'high');

     add_meta_box(
          'wpa-45985',
          'Wordpress Answers Metabox',
          'wpa_meta_box_display',
          'post',
          'normal',
          'high');

} add_action('admin_menu', 'add_meta_boxes');

just define a 2nd metabox, then define its display function and save function. it is exactly the same. EXCEPT, that if you want to save it as a different meta entry then you will change the name attribute for all the new inputs.

for example: your first metabox has the name="custom_audio[]", so to save the 2nd box in a different meta entry you'd name the meta inputs differently

<input type="text" name="wpa_45985['input1']" />
<input type="text" name="wpa_45985['input2']" />

and all your meta in this box will be saved in the meta key wpa_45985

edit#1: adding display and save callbacks. you should add some data sanitation to the save function but this should be a good start

function wpa_meta_box_display() {
    global $post;
    wp_nonce_field( 'wpa_45985', 'wpa_45985_nonce' );


$meta = get_post_meta($post->ID, 'wpa_45985', true);

$foo = isset($meta[foo]) ? $meta[foo] : '';
$bar = isset($meta[bar]) ? $meta[bar] : '';
?>
<input type="text" class="widefat" name="wpa_45985[foo]" value="<?php echo $foo; ?>"/>
<input type="text" class="widefat" name="wpa_45985[bar]" value="<?php echo $bar; ?>"/>


<?php

}

add_action('save_post', 'wpa_meta_box_save');
function wpa_meta_box_save($post_id) {
    global $custom_meta_fields;
    if ( ! isset( $_POST['wpa_45985_nonce'] ) ||
        ! wp_verify_nonce( $_POST['wpa_45985_nonce'], 'wpa_45985' ) )
        return;

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
        return;

    if (!current_user_can('edit_post', $post_id))
        return;

    update_post_meta($post_id,'wpa_45985',$_POST['wpa_45985']);

} ?>
share|improve this answer
    
can you show me example code because i have been trying this for a couple of days could not get it to work –  user5601 Mar 18 '12 at 15:25
    
assuming your first metabox already works then you already have sample code... does your first metabox not work? –  helgatheviking Mar 18 '12 at 15:29
    
the first box works but when i add another box and try to save the data it saves the data on both customfields (metabox). –  user5601 Mar 18 '12 at 15:30
    
see my edit. you need to rename the inputs AND add a 2nd function for saving (one that saves to a new meta field) –  helgatheviking Mar 18 '12 at 15:40
    
thank you very much, your a star –  user5601 Mar 18 '12 at 15:42
show 4 more comments

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.