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