0

I'm using the following repeatable meta box code in my functions.php:

    /**
 * Repeatable Custom Fields in a Metabox
 * Author: Helen Hou-Sandi
 *
 * From a bespoke system, so currently not modular - will fix soon
 * Note that this particular metadata is saved as one multidimensional array (serialized)
 */

function hhs_get_sample_options() {
    $options = array (
        'Option 1' => 'option1',
        'Option 2' => 'option2',
        'Option 3' => 'option3',
        'Option 4' => 'option4',
    );

    return $options;
}
add_action('admin_init', 'hhs_add_meta_boxes', 1);
function hhs_add_meta_boxes() {
    add_meta_box( 'repeatable-fields', 'Emergency Contacts', 'hhs_repeatable_meta_box_display', 'team', 'normal', 'default');
}
function hhs_repeatable_meta_box_display() {
    global $post;
    $repeatable_fields = get_post_meta($post->ID, 'repeatable_fields', true);
    $options = hhs_get_sample_options();
    wp_nonce_field( 'hhs_repeatable_meta_box_nonce', 'hhs_repeatable_meta_box_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.insertBefore( '#repeatable-fieldset-one tbody>tr:last' );
            return false;
        });

        $( '.remove-row' ).on('click', function() {
            $(this).parents('tr').remove();
            return false;
        });
    });
    </script>

    <table id="repeatable-fieldset-one" width="100%">
    <thead>
        <tr>
            <th width="40%">Name</th>
            <th width="40%">Phone Number</th>
            <th width="8%"></th>
        </tr>
    </thead>
    <tbody>
    <?php

    if ( $repeatable_fields ) :

    foreach ( $repeatable_fields as $field ) {
    ?>
    <tr>
        <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="phone[]" value="<?php if ($field['phone'] != '') echo esc_attr( $field['phone'] ); else echo 'http://'; ?>" /></td>

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

        <td><input type="text" class="widefat" name="phone[]" value="" /></td>

        <td><a class="button remove-row" href="#">Remove</a></td>
    </tr>
    <?php endif; ?>

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

        <td><input type="text" class="widefat" name="phone[]" value="" /></td>

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

    <p><a id="add-row" class="button" href="#">Add another</a></p>
    <?php
}
add_action('save_post', 'hhs_repeatable_meta_box_save');
function hhs_repeatable_meta_box_save($post_id) {
    if ( ! isset( $_POST['hhs_repeatable_meta_box_nonce'] ) ||
    ! wp_verify_nonce( $_POST['hhs_repeatable_meta_box_nonce'], 'hhs_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();
    $options = hhs_get_sample_options();

    $names = $_POST['name'];
    $phones = $_POST['phone'];

    $count = count( $names );

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

            if ( $phones[$i] == '' )
                $new[$i]['phone'] = '';
            else
                $new[$i]['phone'] = stripslashes( $phones[$i] ); // and however you want to sanitize
        endif;
    }
    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 );
}

add_action( 'init', 'team_contacts_posttype' );

I just need to know how I can display each piece separately. I've tried the following as well as a few other things in my frontend, to no avail:

<?php
        $member_contact_meta = get_post_meta(get_the_ID(), 'tcp', true);
        $emergency_contact_meta = get_post_custom(get_the_ID(), 'repeatable_fields', true);
        $emerency_contact_name = $emergency_contact_meta['name'];
        $emergency_contact_phone = $emergency_contact_meta['phone'];
        the_content();
        echo $emergency_contact_meta;
        echo '<strong>Phone: </strong>' . $member_contact_meta . '<br />';
        echo '<strong>Emergency Contacts:</strong><br />';
        foreach ($emergency_contact_meta as $emergency_contact_metas)
        echo $emergency_contact_name . ' - ' . $emergency_contact_phone;
    ?>

the tcp meta is separate and working fine, but I just don't know how to grab the repeated content meta and display it.

1

Here's a tested and working version of the template code, which displays the repeatable $emergency_contact_meta correctly:

$member_contact_meta = get_post_meta( get_the_ID(), 'tcp', true );
echo '<strong>Phone: </strong>' . $member_contact_meta . '<br />';

$emergency_contact_meta = get_post_meta( get_the_ID(), 'repeatable_fields', true);

if ( $emergency_contact_meta ) {
    echo '<strong>Emergency Contacts:</strong><br />';

    foreach ( $emergency_contact_meta as $emergency_contact_metas ) {
        echo '<strong>' . esc_html( $emergency_contact_metas['name'] ) .'</strong> ' . esc_html( $emergency_contact_metas['phone'] ) . '<br />';
    }
}

The main issue in the original code was the use of get_post_custom() when it appeared you were just trying to get the meta data for the repeatable fields, repeatable_fields. get_post_custom() gets all of the meta fields for a particular post.

  • Thank you so much! Worked perfectly, and thanks for helping me understand why. – Trenton Moore Dec 7 '16 at 21:49
  • You got it, Trenton! – Dave Romsey Dec 7 '16 at 22:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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