Dynamic Variables in PHP
say you have 10 group names, labeled ‘$group_1’, ‘$group_2’, etc. and you want to display each of them. a quick way to do that is to use dynamic variables (aka variable variables)
for ($i = 1; $i < 11; $i++) {
echo ${'group_' . $i};
}
that’s a super simple implementation. i needed to use it for a recent project — it was pretty intense to figure out the logic, but this is what i came up with
i needed to add some custom post meta fields to the wordpress admin for 13 groups (simplified, adding a WIZZY editor for the editor to add bios for each group), but didn’t want to write 13 versions of pretty much the same code, save for a incrementing variable in the name
for ( $i = 1; $i < 14; $i++) {
$group_bio = 'group_' . $i . '_bio';
$$group_bio = get_post_meta($object->ID, '_group_' . $i . '_bio', true);
echo '
<h3>Group '.$i.'</h3>
<div>
<label for="'.$group_bio.'">GROUP Bio</label>
'.wp_editor( $$group_bio, $group_bio, array(false, true, $group_bio, 4) ).'
</div>
';
}
one of the toughest parts to wrap my head around in the beginning was the $$group_bio variable. take it one line at a time:
$group_bio = 'group_' . $i . '_bio';
for example, the first iteration, that $group_bio variable will be ‘group_1_bio‘
the next line will then make ‘group_1_bio‘ into a variable: $group_1_bio, which will store the post_meta data stored in _group_1_bio
that snippet of code will make 13 of my WIZZY editors on the page — this keeps my functions.php leaner!
want to save the data and still keep your functions.php file clean?
this goes somewhere in your save_post class:
for($i=1; $i < 14; $i++) {
$new_meta_value = ( isset( $_POST['group_' . $i . '_bio'] ) ? $_POST['group_' . $i . '_bio'] : '' );
$meta_value = get_post_meta( $post_id, '_group_' . $i . '_bio', true );
if ( $new_meta_value && '' == $meta_value )
add_post_meta( $post_id, '_group_' . $i . '_bio', $new_meta_value, true );
elseif ( $new_meta_value && $new_meta_value != $meta_value )
update_post_meta( $post_id, '_group_' . $i . '_bio', $new_meta_value );
elseif ( '' == $new_meta_value && $meta_value )
delete_post_meta( $post_id, '_group_' . $i . '_bio', $meta_value );
}