0

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');
?>
1
  • What about replacing 'search' => 'asterix' . $search . 'asterix' by 'search' => '%' . $search . '%' ? Commented Mar 14, 2013 at 10:35

2 Answers 2

1

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.

2
  • Would you mind to explain, why this worked for you?
    – kaiser
    Commented Jun 14, 2013 at 11:48
  • 1
    sure, I just updated my answer. Commented Jun 14, 2013 at 19:03
0

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

1
  • Thanks for the suggestion, but that didn't work unfortunately, got the same result...
    – Osu
    Commented Mar 15, 2013 at 9:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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