Search code examples
phparrayswordpressadvanced-custom-fields

Custom Fields - Repeater dropdown - list only unique & not blank values


Here's the thing that I'm using the ACF repeater subfield (firma) to store some data. Usually the user is typing here his parent company name like: google, alibaba, sodexo etc. So it might happen that in multiple posts, the value of this field will be the same. At the moment I have following code:

   $args = array(
        'post_type' => 'opencourses', 
        'meta_key' => 'terminy_warsztatow'
    );

    $the_query = new WP_Query($args);

    if ($the_query->have_posts()):

        echo '<select type="text" class="form-control" name="filtr_lokalizacja">';

        while ($the_query->have_posts()) : $the_query->the_post();
                if(have_rows('terminy_warsztatow')): 
                    while (have_rows('terminy_warsztatow')) : the_row();          
                        // display your sub fields
                        $filtr_var = get_sub_field('firma'); 

                        echo '<option value="'. $filtr_var .'">'; 
                        echo $filtr_var;                                 
                        echo '</option>';

                    endwhile;

                else :
                    // no rows found
                endif;

        endwhile;

        echo '</select>'; 

    endif;  

And it works - meaning: it shows all typed values. But instead of showing only UNIQUE values it generates a list similar to this:

Google Alibaba

Google Sodexo Sodexo Tesla

Tesla Sodexo

How to avoid showing same values and hide empty as well? I know that there is php function array_unique but I was unable to implement that. I've done sth like:

$filtr_var = get_sub_field('firma');
$result = array_unique($filtr_var);
echo $result;

but then it shows no values at all.


Solution

  • I assume that "firma" is simple text input type in repeater. if so then arrya_unique function won't work for string output.

    you need to save each value in array and then use in_array function to make it unique.

    see below code.

    $args = array(
        'post_type' => 'opencourses', 
        'meta_key' => 'terminy_warsztatow'
    );
    
    $the_query = new WP_Query($args);
    
    if ($the_query->have_posts()):
    
        echo '<select type="text" class="form-control" name="filtr_lokalizacja">';
    
        while ($the_query->have_posts()) : $the_query->the_post();
            if(have_rows('terminy_warsztatow')): 
                // $PreValue = array();
                while (have_rows('terminy_warsztatow')) : the_row();          
                    // display your sub fields
                    $filtr_var = get_sub_field('firma');
                    // compare current value in saved array
                    if( !in_array( $filtr_var, $PreValue ) )
                    {
                        echo '<option value="'. $filtr_var .'">'; 
                            echo $filtr_var;                                 
                        echo '</option>';
                    }
                    // save value in array
                    $PreValue[] = $filtr_var;
    
                endwhile;
    
            else :
                // no rows found
            endif;
    
        endwhile;
    
        echo '</select>'; 
    
    endif; 
    

    Hope this will help you! Enjoy