2

This is a code that I'm adapting from https://gist.github.com/2057532. The problem is that I'm not being able to save the content from the new fields that I created. I had checked the other questions here, but none helped me. Any idea where is the problem?

add_action('admin_init', 'slider_metabox_caption', 1);
function slider_metabox_caption() {
add_meta_box( 'repeatable-fields', 'Captions', 'repeatable_metabox_display', 'slide', 'normal', 'high'); }

function repeatable_metabox_display() {
global $post;

$repeatable_fields = get_post_meta($post->ID, 'repeatable_fields', true);
wp_nonce_field( 'repeatable_meta_box_nonce', 'repeatable_meta_box_nonce' ); ?>

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

<table id="repeatable-fieldset-one" width="100%">
    <thead>
        <tr>
            <th width="1%"></th>
            <th width="15%">Text</th>
            <th width="4%">Fx</th>
            <th width="4%">Easing</th>
            <th width="4%">Speed</th>
            <th width="4%">X</th>
            <th width="4%">Y</th>
            <th width="4%">Width</th>
            <th width="4%">Height</th>
            <th width="1%"></th>
        </tr>
    </thead>

    <tbody>

    <?php 
    if ( $repeatable_fields ) :
        foreach ( $repeatable_fields as $field ) { ?>

    <tr>
        <td><a class="button remove-row" href="#">-</a></td>

        <td><input type="text" class="widefat" name="text[]" value="<?php if($field['text'] != '') echo esc_attr( $field['text'] ); ?>" /></td>
        <td><input type="text" class="widefat" name="fx[]" value="<?php if($field['fx'] != '') echo esc_attr( $field['fx'] ); ?>" /></td>
        <td><input type="text" class="widefat" name="easing[]" value="<?php if($field['easing'] != '') echo esc_attr( $field['easing'] ); ?>" /></td>
        <td><input type="text" class="widefat" name="speed[]" value="<?php if($field['speed'] != '') echo esc_attr( $field['speed'] ); ?>" /></td>
        <td><input type="text" class="widefat" name="x[]" value="<?php if($field['x'] != '') echo esc_attr( $field['x'] ); ?>" /></td>
        <td><input type="text" class="widefat" name="y[]" value="<?php if($field['y'] != '') echo esc_attr( $field['y'] ); ?>" /></td>
        <td><input type="text" class="widefat" name="width[]" value="<?php if($field['width'] != '') echo esc_attr( $field['width'] ); ?>" /></td>
        <td><input type="text" class="widefat" name="height[]" value="<?php if($field['height'] != '') echo esc_attr( $field['height'] ); ?>" /></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="text[]" /></td>
        <td><input type="text" class="widefat" name="fx[]" /></td>
        <td><input type="text" class="widefat" name="easing[]" /></td>
        <td><input type="text" class="widefat" name="speed[]" /></td>
        <td><input type="text" class="widefat" name="x[]" /></td>
        <td><input type="text" class="widefat" name="y[]" /></td>
        <td><input type="text" class="widefat" name="width[]" /></td>
        <td><input type="text" class="widefat" name="height[]" /></td>

        <td><a class="sort">|||</a></td>

    </tr>

    <?php endif; ?>

    <!-- 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="text[]" /></td>        
        <td><input type="text" class="widefat" name="fx[]" /></td>
        <td><input type="text" class="widefat" name="easing[]" /></td>
        <td><input type="text" class="widefat" name="speed[]" /></td>
        <td><input type="text" class="widefat" name="x[]" /></td>
        <td><input type="text" class="widefat" name="y[]" /></td>
        <td><input type="text" class="widefat" name="width[]" /></td>
        <td><input type="text" class="widefat" name="height[]" /></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) {
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;

$old = get_post_meta($post_id, 'repeatable_fields', true);
$new = array();

$text = $_POST['text'];
$fx = $_POST['fx'];
$easing = $_POST['easing'];
$speed = $_POST['speed'];
$x = $_POST['x'];
$y = $_POST['y'];
$width = $_POST['width'];
$height = $_POST['height'];

$count = count( $text );

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

    elseif ( $fx[$i] != '' ) :
        $new[$i]['fx'] = stripslashes( strip_tags( $fx[$i] ) );

    elseif ( $easing[$i] != '' ) :
        $new[$i]['easing'] = stripslashes( strip_tags( $easing[$i] ) );

    elseif ( $speed[$i] != '' ) :
        $new[$i]['speed'] = stripslashes( strip_tags( $speed[$i] ) );

    elseif ( $x[$i] != '' ) :
        $new[$i]['x'] = stripslashes( strip_tags( $x[$i] ) );

    elseif ( $y[$i] != '' ) :
        $new[$i]['y'] = stripslashes( strip_tags( $y[$i] ) );

    elseif ( $width[$i] != '' ) :
        $new[$i]['width'] = stripslashes( strip_tags( $width[$i] ) );

    elseif ( $height[$i] != '' ) :
        $new[$i]['height'] = stripslashes( strip_tags( $height[$i] ) );

    endif;
}

if ( !empty( $new ) && $new != $old )
    update_post_meta( $post_id, 'repeatable_fields[$i]', $new );
elseif ( empty($new) && $old )
    delete_post_meta( $post_id, 'repeatable_fields[$i]', $old );
}

2 Answers 2

2

Using the following code allows you to retrieve the array.

foreach ($repeatable_fields as $v) {

}   

Than you can access individual values with something like this:

<?php echo $v['text']; ?>
1

Could be that you are saving it wrong, change this:

if ( !empty( $new ) && $new != $old )
    update_post_meta( $post_id, 'repeatable_fields[$i]', $new );
elseif ( empty($new) && $old )
    delete_post_meta( $post_id, 'repeatable_fields[$i]', $old );

to this:

if ( !empty( $new ) && $new != $old )
    update_post_meta( $post_id, 'repeatable_fields', $new );
elseif ( empty($new) && $old )
    delete_post_meta( $post_id, 'repeatable_fields', $old );
5
  • Yeah.. however now it's giving me Notice: Undefined index:
    – Daniel
    Jan 23, 2013 at 11:33
  • The code works almost fine now. One last thing: Do the repeatable fields get serialized in the database? If yes, how can I retrieve the data?
    – Daniel
    Jan 23, 2013 at 11:47
  • yes its stored as a serialized array and you get it using $repeatable_fields = get_post_meta($post->ID, 'repeatable_fields', true);
    – Bainternet
    Jan 23, 2013 at 12:15
  • Thanks. But don't I need to unserialize the array? Because when I use the code you provided, I just get the word 'Array' printed.
    – Daniel
    Jan 23, 2013 at 12:20
  • 2
    @Daniel You now use $repeatable_fields in a foreach statement such as foreach ($repeatable_fields as $field) { echo $field; } as an example.
    – Adam
    Jan 24, 2013 at 4:50

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.