How to customize user search

I’m developing a custom user search and I’m using this plugin found here:

<?php

function sul_user_listing($atts, $content = null) {
    global $post;

    extract(shortcode_atts(array(
        "role" => 'technician',
        "number" => '10'
    ), $atts));

    $role = sanitize_text_field($role);
    $number = sanitize_text_field($number);

    // We're outputting a lot of HTML, and the easiest way 
    // to do it is with output buffering from PHP.
    ob_start();

    // Get the Search Term
    $search = ( isset($_GET["as"]) ) ? sanitize_text_field($_GET["as"]) : false ;

    // Get Query Var for pagination. This already exists in WordPress
    $page = (get_query_var('paged')) ? get_query_var('paged') : 1;

    // Calculate the offset (i.e. how many users we should skip)
    $offset = ($page - 1) * $number;

    if ($search){
        // Generate the query based on search field
        $my_users = new WP_User_Query(
          array( 
            'role' => $role,
            'search' => '*' . $search . '*',
          ));
    } else {
        // Generate the query 
        $my_users = new WP_User_Query( 
          array( 
            'role' => 'technician'
          ));
    }

    // Get the total number of authors. Based on this, offset and number 
    // per page, we'll generate our pagination. 
    $total_authors = $my_users->total_users;

    // Calculate the total number of pages for the pagination
    $total_pages = intval($total_authors / $number) + 1;

    // The authors object. 
    $authors = $my_users->get_results();
?>

<style>

.advance-search .real-btn {
    margin: 0;
}

</style>

<section class="advance-search ">
    <form method="get" id="sul-searchform" class="advance-search-form clearfix" action="<?php the_permalink() ?>">
        <div class="option-bar small">
            <input type="text" class="field" name="as" id="sul-s" placeholder="Cerca tecnico" />
        </div>
        <div class="option-bar">
            <input type="submit" name="submit" class=" real-btn btn"  id="sul-searchsubmit" value="Cerca" />
        </div>
    </form>
  <?php 
  if($search) { ?>
    <h2>Ricerca: <em><?php echo $search; ?></em></h2>
    <!--<a href="https://wordpress.stackexchange.com/questions/182955/<?php the_permalink(); ?>">Back To Author Listing</a>-->
  <?php } ?>

</section><!-- .author-search -->

<?php if (!empty($authors)) { ?>
    <ul class="author-list">
        <?php
          // loop through each author
          foreach($authors as $author) {
            $author_info = get_userdata($author->ID);
            ?>
            <li>
                <?php if(!empty($author->pie_profile_pic_5)): ?>
                <img width="130" height="130" src="<?php echo $author->pie_profile_pic_5; ?>" 
                                                     class="attachment-agent-image wp-post-image" alt="<?php echo $author->first_name; ?> <?php echo $author->last_name; ?>">
                <h2 style="display: inline; margin-left: 20px;">
                    <a href="<?php echo get_author_posts_url($author->ID); ?>"><?php echo $author->first_name; ?> <?php echo $author->last_name; ?></a>
                    - <?php echo count_user_posts( $author->ID ); ?> immobili
                </h2>
                <?php else: ?>
                    <h2 style="display: inline;">
                        <a href="<?php echo get_author_posts_url($author->ID); ?>"><?php echo $author->first_name; ?> <?php echo $author->last_name; ?></a>
                        - <?php echo count_user_posts($author->ID, "property"); ?> immobili
                    </h2>
                <?php endif; ?>

              <p><?php //echo $author_info->description; ?></p>
              <?php $latest_post = new WP_Query( "author=$author->ID&post_count=1" ); 
              if (!empty($latest_post->post)){ ?>
              <p><strong>Latest Article:</strong>
              <a href="<?php echo get_permalink($latest_post->post->ID) ?>">
                <?php echo get_the_title($latest_post->post->ID) ;?>
              </a></p>
              <?php } //endif ?>
              <!--<p><a href="<?php echo get_author_posts_url($author->ID); ?> ">Maggiori informazioni.. <?php //echo $author_info->display_name; ?></a></p>-->
            </li>
            <?php
          }
        ?>
    </ul> <!-- .author-list -->
<?php } else { ?>
  <!--<h2>Nessun tecnico trovato</h2>-->
<? } //endif ?>

  <nav id="nav-single" style="clear:both; float:none; margin-top:20px;">
    <!--<h3 class="assistive-text">Post navigation</h3>-->
    <?php if ($page != 1) { ?>
      <span class="nav-previous"><a rel="prev" href="<?php the_permalink() ?>page/<?php echo $page - 1; ?>/"><span class="meta-nav">←</span> Previous</a></span>
    <?php } ?>

    <?php if ($page < $total_pages ) { ?>
      <span class="nav-next"><a rel="next" href="<?php the_permalink() ?>page/<?php echo $page + 1; ?>/">Next <span class="meta-nav">→</span></a></span>
    <?php } ?>
  </nav>


  <?php 
  // Output the content.
  $output = ob_get_contents();
  ob_end_clean();


  // Return only if we're inside a page. This won't list anything on a post or archive page. 
  if (is_page()) return  $output;

}

// Add the shortcode to WordPress. 
add_shortcode('userlisting', 'sul_user_listing');
?>

But I want to expand the search by city, state and country.
In fact, inside the wp_usermeta table has these values:
meta_key: pie_address_3;
meta_value: a:6:{s:7:"address";s:18:"New York Street, 4";s:8:"address2";s:0:"";s:4:"city";s:5:"Venice";s:5:"state";s:7:"Vicenza";s:3:"zip";s:5:"36015";s:7:"country";s:5:"Italy";}

Thus, my question is: how can expand the search using these meta values?
Thanks!

UPDATE

I have updated the WP_User_Query like this:

$args = array(
            'meta_key' => 'pie_address_3'
        );
        $query = new WP_User_Query($args);

        $authors = $query->get_results();

        foreach ($authors as $author){
            $c = get_user_meta($author->id,'pie_address_3',true);
            if(isset($c)){
                if(empty(get_user_meta($author->id,'address',true))){
                   add_user_meta($author->ID,'address',$c['address']); 
                }
                if(empty(get_user_meta($author->id,'address2',true))){
                   add_user_meta($author->ID,'address2',$c['address2']); 
                }
                if(empty(get_user_meta($author->id,'city',true))){
                   add_user_meta($author->ID,'city',$c['city']); 
                }
                if(empty(get_user_meta($author->id,'state',true))){
                   add_user_meta($author->ID,'state',$c['state']); 
                }
                if(empty(get_user_meta($author->id,'zip',true))){
                   add_user_meta($author->ID,'zip',$c['zip']); 
                }
                if(empty(get_user_meta($author->id,'country',true))){
                   add_user_meta($author->ID,'country',$c['country']); 
                };
                //delete_user_meta($author->ID,'pie_address_3',$c);
            }
        }

        $my_users = new WP_User_Query(
          array( 
            'role' => $role,
            'search' => '*' . $search . '*',
            'search_columns' => array(
                'user_login',
                'user_nicename',
                'user_email',
                'user_url',
                'display_name'
            ),
            'meta_query' => array(
                'relation' => 'OR',
                array(
                  'key'     => 'address',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'address2',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'city',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'state',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'zip',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'country',
                  'value'   => $search,
                  'compare' => 'LIKE'
                )
              )
          )
        );

But still, it doesn’t work. Where am I doing wrong?

1 Answer
1

I was able to find a solution:

if(!empty($search)){
   $query = $wpdb->prepare( 
                 "SELECT DISTINCT user_id
                  FROM wp_usermeta
                  WHERE meta_key = 'pie_address_3'
                  AND meta_value LIKE %s
                  ", '%' . $search . '%' );

                $ids = $wpdb->get_results($query); ?> 
                <ul class="author-list"> 
                    <?php
                    foreach ($ids as $id) { ?>
                        <li>
                            <img width="90" height="90" src="https://wordpress.stackexchange.com/questions/182955/<?php echo get_user_meta($id->user_id,"pie_profile_pic_5", true); ?>" 
                                                                 class="attachment-agent-image wp-post-image">
                            <h2 style="display: inline; margin-left: 20px;">
                                <a href="<?php echo get_author_posts_url($id->user_id); ?>"><?php echo get_the_author_meta('first_name', $id->user_id); ?> 
                                    <?php echo get_the_author_meta('last_name', $id->user_id); ?>
                                </a>
                                - <?php echo count_user_posts($id->user_id); ?> immobili
                            </h2>
                        </li>
                    <?php } ?>
                </ul>
 <?php } ?>

Leave a Comment