Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I'm having trouble finishing off this code that I adapted from Cosmoslabs excellent tutorial. Everything is working (listing and pagination etc) except the search function whic is returning nothing i.e. no users are listed when I try to filter by a keyword.

Can anyone see what the problem might be?

Thanks for any pointers.

Osu

<?php
/*
Plugin Name: WP Author Listing
Plugin URI: #
Description: Simple shortcode to list our WordPress users.
Author: OSU
Version: 1.0
Author URI: #
Licence: MIT

Many thanks for original plugin by: Cristian Antohe [http://cozmoslabs.com/]

*/

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

    extract(shortcode_atts(array(
        "role" => '',
        "number" => '5'
    ), $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
    // (condition) ? (true return value) : (false return value)
    $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 . '*' // Assuming the problem is around here?
            ));
    } else {
        // Generate the query 
        $my_users = new WP_User_Query( 
            array( 
                'role' => '', // Default is all
                'offset' => $offset ,
                'number' => $number
            ));
    }


    // 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();
?>

    <div class="author-search">
    <h2>Search authors by name</h2>
        <form method="get" id="sul-searchform" action="<?php the_permalink() ?>">
            <label for="as" class="assistive-text">Search</label>
            <input type="text" class="field" name="as" id="sul-s" placeholder="Search Authors" />
            <input type="submit" class="submit" name="submit" id="sul-searchsubmit" value="Search Authors" />
        </form>
    <?php 
    if($search){ ?>
        <h2 >Search Results for: <em><?php echo $search; ?></em></h2>
        <a href="<?php the_permalink(); ?>">Back To Author Listing</a>
    <?php } ?>

    </div><!-- .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 echo get_avatar( $author->ID, 90 ); ?> 
            <h2><a href="<?php echo get_author_posts_url($author->ID); ?>"><?php echo $author_info->display_name; ?></a> - <?php echo count_user_posts( $author->ID ); ?> posts</h2>
            <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); ?> ">Read <?php echo $author_info->display_name; ?> posts</a></p>
        </li>
        <?php
    }
?>
    </ul> <!-- .author-list -->
<?php } else { ?>
    <h2>No authors found</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">&lt;</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">&gt;</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', 'osu_user_listing');
?>
share|improve this question
    
What about replacing 'search' => 'asterix' . $search . 'asterix' by 'search' => '%' . $search . '%' ? –  david.binda Mar 14 '13 at 10:35

2 Answers 2

This worked for me.

$user_query = new WP_User_Query( array(  'search' => '*example.net*', 'search_columns' => array('user_url') ));
$authors = $user_query->get_results();

The wild card to be used in the search string is '*' and not '%'. Also you have to include the 'search_columns' parameter with the following possible values

search_columns = array( 'user_nicename', 'user_login', 'user_email', 'user_url' )

Importantly, these are the actual field names from the users table. I tried my above mentioned query using 'search_columns' => array('url') and it failed.

share|improve this answer
    
Would you mind to explain, why this worked for you? –  kaiser Jun 14 '13 at 11:48
1  
sure, I just updated my answer. –  Abdul Haseeb Jun 14 '13 at 19:03

I'll extend my comment. From the codex, it seems to me, that your might be missing also search_columns param. So not only replacing

'search' => '*' . $search . '*'

by

'search' => '%' . $search . '%'

But also possible adding

search_columns = array( 'nicename', 'login', 'email' ) 

See the codex: https://codex.wordpress.org/Class_Reference/WP_User_Query#Search_Parameters

share|improve this answer
    
Thanks for the suggestion, but that didn't work unfortunately, got the same result... –  Osu Mar 15 '13 at 9:10

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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