How to Use Wildcards in $wpdb Queries Using $wpdb->get_results & $wpdb->prepare?

I am attempting to make a custom search for BuddyPress groups.

Here is my method:

Read More
public function search_groups($string){
    global $wpdb;
    $results = $wpdb->get_results($wpdb->prepare(
        "
        SELECT * 
        FROM {$wpdb->prefix}bp_groups 
        WHERE `name` LIKE '%%s%'
        AND `description` LIKE '%%s%' 
        AND `status` = 'public'
        ORDER BY `name` ASC
        ",
        $string,
        $string
    ));
    if(!empty($results)){
        $return = $results;
    } else{
        $return = false;    
    }
    return $return;
}

However, I am receiving a WordPress database error. I’m pretty sure it’s due to the fact that I’m using $wpdb->prepare();, since it uses % signs for replacing variables.

Let’s take a look at this portion of my query:

WHERE `name` LIKE '%%s%'
AND `description` LIKE '%%s%'

That just looks like trouble. Is there any way that I can accomplish something along the lines of…

WHERE `name` LIKE '%{$string}%'
AND `description` LIKE '%{$string}%'

and still use the $wpdb->prepare(); method?

Related posts

Leave a Reply

1 comment

  1. I figured out a solution to my question.

    First of all, in my original query, I should have specified OR instead of AND for searching between group names and group descriptions. (It was skewing the results.)

    And I needed to double escape my ‘%’s in the LIKE statements.

    Here is the updated query which works correctly:

    SELECT * 
    FROM {$wpdb->prefix}bp_groups 
    WHERE `name` LIKE '%%%s%%'
    OR `description` LIKE '%%%s%%' 
    AND `status` = 'public'
    ORDER BY `name` ASC
    

    Example using $wpdb->query and $wpdb->prepare:

    global $wpdb;
    $wpdb->query( $wpdb->prepare(
        'DELETE FROM %s WHERE `option_name` LIKE %s',
        $wpdb->options,
        $wpdb->esc_like(PLUGIN_SLUG . '%%')
    ) );