Jump to content
John Olsson

[Solved] Search error / complication

Recommended Posts

John Olsson

Hello, i'm working on a webshop, and got this code to really boost the search within WP. But when adding this code to functions.php the front end media library search flipped totally, and not working at all, any ideas what's the problem?


function atom_search_where($where){
  global $wpdb;
  if (is_search())
    $where .= "OR (t.name LIKE '%".get_search_query()."%' AND {$wpdb->posts}.post_status = 'publish')";
  return $where;
}

function atom_search_join($join){
  global $wpdb;
  if (is_search())
    $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id";
  return $join;
}

function atom_search_groupby($groupby){
  global $wpdb;

  // we need to group on post ID
  $groupby_id = "{$wpdb->posts}.ID";
  if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;

  // groupby was empty, use ours
  if(!strlen(trim($groupby))) return $groupby_id;

  // wasn't empty, append ours
  return $groupby.", ".$groupby_id;
}

add_filter('posts_where','atom_search_where');
add_filter('posts_join', 'atom_search_join');
add_filter('posts_groupby', 'atom_search_groupby');

 

Share this post


Link to post
Share on other sites
Simon

Hi John.

Firstly if you are going to copy 6 year old code from the internet be sure to namespace it or put it in a class you can be pretty sure other people have copied that code and even put it into 'premium' plugins.

So Ive done that for you.

Also, the snippet is using is_search() so ALL searches would be affected. I added a function to check that the post_type is not attachment.

class Olsson_Search {

  function __construct() {
    add_action( 'init', array( $this, 'init' ) );
  }

  function init() {

    add_filter( 'posts_where', array( $this, 'atom_search_where' ) );
    add_filter( 'posts_join', array( $this, 'atom_search_join' ) );
    add_filter( 'posts_groupby', array( $this, 'atom_search_groupby' ) );
  }

  function atom_search_where($where){
    global $wpdb;

    if ( is_search() && ! $this->is_attachment() ) {
      $where .= "OR (t.name LIKE '%" . get_search_query() . "%' AND {$wpdb->posts}.post_status = 'publish')";
    }
    return $where;
  }

  function atom_search_join($join){
    global $wpdb;

    if ( is_search() && ! $this->is_attachment() ) {
      $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id";
    }

    return $join;
  }

  function atom_search_groupby($groupby){
    global $wpdb;

    // we need to group on post ID
    $groupby_id = "{$wpdb->posts}.ID";
    if( ! is_search()
      || ! $this->is_attachment()
      || strpos( $groupby, $groupby_id ) !== false ) {
        return $groupby;
      }

    // groupby was empty, use ours
    if( ! strlen( trim( $groupby ) ) ) {
      return $groupby_id;
    }

    // wasn't empty, append ours
    return $groupby . ", " . $groupby_id;
  }

  function is_attachment() {
    return ( 'attachment' === get_query_var( 'post_type' ) ) ? true : false;
  }
}
new Olsson_Search;

 

  • Like 1

Share this post


Link to post
Share on other sites
John Olsson

Holy sh*t!

That's...awesome! BIG THANKS!

Share this post


Link to post
Share on other sites
John Olsson

I found out that the function messes up the search -query a bit, it renders 3 results of the same products, look here.. @Simon ?

Skärmklipp 2016-12-14 18.14.33.png

Share this post


Link to post
Share on other sites
Simon

Going to be tricky, you need to use is_admin to make sure the code is NOT run in the admin area, problem is the media popup on the frontend is actually part of wp admin, so is_admin() will be true.

So not sure what to suggest.

Share this post


Link to post
Share on other sites
John Olsson

That's ok Simon! I found out that with the plugin Relevanssi it does the job! Just assigning Products and Products-Brands to the index. Maybe good for other users. Cheers!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Similar Content

    • mtaus
      By mtaus+
      How can I remove the Search function from NavPro?
    • Queue-it
      By Queue-it+
      HI,
      Search function doesn't seem to work. 
      When ever searching for something it redirect to the home page and add the search string to the url.
      For example searching for "cases" it would display https://queue-it.com/?s=cases
      Do you know how to solve that? 
    • MissT
      By MissT+
      Would be great to have the ability to include a search option within menus and within Splashup - is this possible?
    • balfred1345
      By balfred1345
      null When I tested Search using the search field in Navi, it throws the error as shown in pastebin: http://pastebin.com/DJ079bmy
      Is there a fix for this? If there is no fix, can you please tell me how to disable search in Navi?
      Thanks,
      Bruce
    • MissT
      By MissT+
      Hi there,
      Just wondering if there is a reason why there is no search option within Multimenu as there is with Navi - would be good if it did have it and it worked in a similar way and you could switch it off when you need to.
      Many thanks.
×