2

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 );

} ?>

1 Answer 1

2
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']);

} ?>
7
  • can you show me example code because i have been trying this for a couple of days could not get it to work
    – user5601
    Commented Mar 18, 2012 at 15:25
  • assuming your first metabox already works then you already have sample code... does your first metabox not work? Commented Mar 18, 2012 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
    Commented Mar 18, 2012 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) Commented Mar 18, 2012 at 15:40
  • one problem i get is Parse error: syntax error, unexpected T_IF in - on line 121 Errors parsing -
    – user5601
    Commented Mar 18, 2012 at 15:47

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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