Site icon Hip-Hop Website Design and Development

Repeatable field within repeatable group of fields

Compounding on Saving metabox repeatable fields

I’ve created a metabox with a series of fields that are repeatable. However, within those fields, I’d like to create another field named Choices and make that repeatable within each grouping.

I was able to setup the additional field and repeat it, but have no idea how to save the value of the new repeatable field. The new field that I was trying to create is within the commented portions of the code below as well as my attempts at saving it

function poll_potential_results() {
    $options = array (
        'Option 1' => 'option1',
        'Option 2' => 'option2',
    );
    return $options;
}

add_action('admin_init', 'poll_add_metaboxes', 1);
function poll_add_metaboxes() {
    add_meta_box( 'Dicey', 'Questions and Options', 'poll_metabox', 'quizzes', 'normal', 'default');
}

function poll_metabox() {
    global $post;
    $repeat_fields = get_post_meta($post->ID, 'repeat_fields', true);
    $options = poll_potential_results();
    wp_nonce_field( 'poll_metabox_nonce', 'poll_metabox_nonce' );
    ?>
    <script type="text/javascript">
    jQuery(document).ready(function( $ ){
        $( '#add-row' ).on('click', function() {
            var row = $( '.empty-row.screen-reader-text' ).clone(true);
            row.removeClass( 'empty-row screen-reader-text' );
            row.insertAfter( '#repeatable_row' );
            return false;
        });
        $( '.remove-row' ).on('click', function() {
            $(this).parents('tr').remove();
            return false;
        });
        /*$('#add-choice' ).on('click',function() {
            var choicenew = $(this).closest('tr' ).clone(true);
            var choice = $(this ).closest('tr');
            choicenew.insertAfter(choice);
            return false;
        })*/
    });
    </script>
    <table id="repeatable_row" width="100%"><tbody>

    <?php if ( $repeat_fields ) : foreach ( $repeat_fields as $field ) { ?>
    <tr><td><table>
        <tr>
            <td colspan="3"><input type="text" class="widefat" name="name[]" value="<?php if($field['name'] != '') echo esc_attr( $field['name'] ); ?>" /></td>
        </tr>
        <tr>
            <!--<td><a id="add-choice" class="button" href="#">Add Choice</a></td>-->

            <!--<td><input type="text" class="widefat" name="choice[]" value="<?php //if($field['choice'] != '') echo esc_attr( $field['choice'] ); ?>" /></td>-->
            <td><input type="text" class="widefat" name="url[]" value="<?php if ($field['url'] != '') echo esc_attr( $field['url'] ); else echo 'http://'; ?>" /></td>
            <td>
                <select name="select[]">
                <?php foreach ( $options as $label => $value ) : ?>
                <option value="<?php echo $value; ?>"<?php selected( $field['select'], $value ); ?>><?php echo $label; ?></option>
                <?php endforeach; ?>
                </select>
            </td>
            <td><a class="button remove-row" href="#">Remove</a></td>
        </tr>
    </table></td></tr>

    <?php } else : ?>
    <tr><td><table>
        <tr>
            <td colspan="3"><input type="text" class="widefat" name="name[]" /></td>
        </tr>
        <tr>
            <!--<td><a id="add-choice" class="button" href="#">Add Choice</a></td>-->

            <!--<td><input type="text" class="widefat" name="choice[]" /></td>-->
            <td><input type="text" class="widefat" name="url[]" value="http://" /></td>
            <td>
                <select name="select[]">
                <?php foreach ( $options as $label => $value ) : ?>
                <option value="<?php echo $value; ?>"><?php echo $label; ?></option>
                <?php endforeach; ?>
                </select>
            </td>
            <td><a class="button remove-row" href="#">Remove</a></td>
        </tr>
    </table></td></tr>

    <?php endif; ?>

    <!-- empty hidden one for jQuery -->
    <tr class="empty-row screen-reader-text"><td><table>
        <tr>
            <td colspan="3"><input type="text" class="widefat" name="name[]" /></td>
        </tr>
        <tr>
            <!--<td><a id="add-choice" class="button" href="#">Add Choice</a></td>-->
            <!--<td><input type="text" class="widefat" name="choice[]" /></td>-->
            <td><input type="text" class="widefat" name="url[]" value="http://" /></td>
            <td>
                <select name="select[]">
                <?php foreach ( $options as $label => $value ) : ?>
                <option value="<?php echo $value; ?>"><?php echo $label; ?></option>
                <?php endforeach; ?>
                </select>
            </td>
            <td><a class="button remove-row" href="#">Remove</a></td>
        </tr>
    </table></td></tr>
    </tbody>
    </table>
    <p><a id="add-row" class="button" href="#">Add another</a></p>
<?php }

add_action('save_post', 'poll_metabox_save');
function poll_metabox_save($post_id) {
    if ( ! isset( $_POST['poll_metabox_nonce'] ) || ! wp_verify_nonce( $_POST['poll_metabox_nonce'], 'poll_metabox_nonce' ) ) return;
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
    if (!current_user_can('edit_post', $post_id)) return;

    $old = get_post_meta($post_id, 'repeat_fields', true);
    $new = array();
    //$newchoice = $new[$j];
    //$newchoice = $new;
    //

    $options = poll_potential_results();
    $names = $_POST['name'];
    //$choices = $_POST['choice'];
    $selects = $_POST['select'];
    $urls = $_POST['url'];

    $count = count( $names );
    //$countchoices = count($choices);

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

            //for ( $j = 0; $j < $countchoices; $j++) {
            //  if ( $choices[$j] != '') {
            //      $newchoice[$j]['choice'] = stripslashes(strip_tags($choices[$j]));
            //  }
            //}

            if ( in_array( $selects[$i], $options ) ) $new[$i]['select'] = $selects[$i];
            else $new[$i]['select'] = '';
            if ( $urls[$i] == 'http://' ) $new[$i]['url'] = '';
            else $new[$i]['url'] = stripslashes( $urls[$i] );
        }
    }
    //if (!empty($newchoice)) {
    //  update_post_meta($post_id,'repeat_fields',$newchoice);
    //}

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