Solved

changing search function to look for 2 seperate words in search

Posted on 2011-03-06
7
306 Views
Last Modified: 2012-05-11
Hi there,

I've posted similar question to this before but can't seem to get a successful answer. I'm trying to get a wordpress search to look for 2 separate words in a search. For example:

i have 3 posts with keywords:
1. fun game
2. fun
3. game

and I'm searching for the words 'fun game' BUT instead of the search results bringing up the 3 posts it's only bringing up the one post with the word fun game in it. And if I do a 2nd word such as fun play it won't bring up any results because they don't have play in it.

I hope someone can help me with this please.

here is the code that I'm trying to work with. it is a current plugin that doesn't have any more support on it.

<?php
/*
Plugin Name: Search Custom Fields
Plugin URI: http://guff.szub.net/search-custom-fields/
Description: Search post custom field values. Also provides for an alternative theme 'search' template: search-custom.php.
Author: Kaf Oseo
Version: R1.beta2
Author URI: http://szub.net

    Copyright (c) 2006, 2008 Kaf Oseo (http://szub.net)
    Search Custom Fields  is released under the GNU General Public License, version 2 (GPL2)
    http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt

    This is a WordPress plugin (http://wordpress.org).

~Changelog:
R1.beta2 (Jan-19-2008)
Bug fix to szub_search_custom_template(); a loop would occur when no
search template (search.php) existed in the active theme.
*/

function szub_search_custom_join($join) {
    global $wpdb;
    if( is_search() && szub_is_search_key() ) {
        $join = " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
    }
    return $join;
}
add_filter('posts_join', 'szub_search_custom_join');

function szub_search_custom_where($where) {
    global $wp_query, $wp_version, $wpdb;
    if( !empty($wp_query->query_vars['s']) && szub_is_search_key() ) {
        $search = $wp_query->query_vars['s'];
        $key = $_GET['key'];
        $status = ($wp_version >= 2.1) ? 'post_type = \'post\' AND post_status = \'publish\'' : 'post_status = \'publish\'';
        $where = " AND $wpdb->postmeta.meta_key = '$key' AND $wpdb->postmeta.meta_value LIKE '%$search%' AND $status ";
    }
    return $where;
}
add_filter('posts_where', 'szub_search_custom_where');

function szub_search_custom_template($template) {
    if( is_search() && szub_is_search_key() && file_exists(TEMPLATEPATH . '/search-custom.php') ) {
        $template = TEMPLATEPATH . '/search-custom.php';
    }
    return $template;
}
add_filter('search_template', 'szub_search_custom_template');

function szub_is_search_key($key='') {
    if( isset($_GET['key']) ) {
        if( !empty($_GET['key']) || (!empty($key) && ($key = $_GET['key'])) )
            return true;
    }
    return false;
}
?>

Open in new window

0
Comment
Question by:carlyblack
  • 2
  • 2
  • 2
  • +1
7 Comments
 
LVL 70

Expert Comment

by:Jason C. Levine
ID: 35053771
Hi carlyblack,

There are a bunch of plugins that extend WordPress search to include booleans or default the list of terms to an OR separator.  

http://www.zirona.com/software/wordpress-advanced-search/

Is one...there are loads of others.  If your current plugin isn't working, switch to a new one.  
0
 
LVL 34

Accepted Solution

by:
Beverley Portlock earned 500 total points
ID: 35055094
You could alter the above like so....

UNTESTED

function szub_search_custom_where($where) {
    global $wp_query, $wp_version, $wpdb;
    if( !empty($wp_query->query_vars['s']) && szub_is_search_key() ) {
          $search = $wp_query->query_vars['s'];
          $searchWords = explode(" ", $search );
          $searchArr = array();

          foreach( $searchWords as $aWord )
               $searchArr [] = " $wpdb->postmeta.meta_value LIKE '%$aWord%' ";

          $searchTerm = implode(" or ", $searchArr );

          $key = $_GET['key'];
          $status = ($wp_version >= 2.1) ? 'post_type = \'post\' AND post_status = \'publish\'' : 'post_status = \'publish\'';
          $where = " AND $wpdb->postmeta.meta_key = '$key' AND ($searchTerm)  AND $status ";
    }
    return $where;
}

Open in new window

0
 
LVL 2

Expert Comment

by:adeelshahid
ID: 35056813
This should solve your problem.

Assuming q is the query search string



$q = trim(urldecode($_GET['q']));

if (strpos($q, ' ') !== false) {
      $search_words = explode(' ', $q);
} else {
      $search_words = array($q);
}

$where_arr = array();
$where = '';

foreach ($search_words as $word) {
      $where_arr[] = "field_name LIKE '%{$word}%'";
}

if (count($where_arr) > 0) {
      $where = implode(' OR ', $where_arr);
}

$sql = "SELECT * FROM table_name";

if (strlen($where) > 0) {
      $sql .= " WHERE $where";
}

$r = mysql_query($sql, $database);
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:carlyblack
ID: 35063155
This should solve your problem.

Assuming q is the query search string



$q = trim(urldecode($_GET['q']));

if (strpos($q, ' ') !== false) {
      $search_words = explode(' ', $q);
} else {
      $search_words = array($q);
}

$where_arr = array();
$where = '';

foreach ($search_words as $word) {
      $where_arr[] = "field_name LIKE '%{$word}%'";
}

if (count($where_arr) > 0) {
      $where = implode(' OR ', $where_arr);
}

$sql = "SELECT * FROM table_name";

if (strlen($where) > 0) {
      $sql .= " WHERE $where";
}

$r = mysql_query($sql, $database);

Hi adeelshahid,

thanks for offering this, sorry I'm only a novice, can you please let me know where i'd add this to the code?

bportlock, thanks for offering up the change, I'm not sure if I did it correctly or not, but I replaced the first bit of the plugin with your code, but I couldn't get it to search anything.

Jason1178 thanks for your offer. I had already tried that plugin but it's not doing what I needed. I basically need this plugin altered to search for the word or word and it will fulfill my needs perfectly.

thanks again for all your help, really hoping a I can get a solution.

Many thanks.
0
 
LVL 2

Expert Comment

by:adeelshahid
ID: 35063933
specifically this goes into the WHERE clause of your sql query.
0
 

Author Comment

by:carlyblack
ID: 35065893
Bportlock - sorry It was MY MISTAKE! I had replaced the wrong part of the code.

Thank you that is working very well, thanks for your help!

One final question, is there a way to adjust the order of how it is displayed in search results or does that come into the core function of wordpress?

Thanks.
0
 
LVL 34

Expert Comment

by:Beverley Portlock
ID: 35068033
This function's purpose seems to be the provision of a WHERE clause. Whilst you could try tacking on an ORDER BY I would not advise it as you will probably have another bit of code somewhere that tacks on another ORDER BY and then you have a broken query on your hands.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Permalink issue in Wordpress archive 1 33
Site hacked - decoding the PHP? 15 61
get domain with php 7 20
str_replace not working in php script 4 0
Password hashing is better than message digests or encryption, and you should be using it instead of message digests or encryption.  Find out why and how in this article, which supplements the original article on PHP Client Registration, Login, Logo…
Introduction This article is intended for those who are new to PHP error handling (https://www.experts-exchange.com/articles/11769/And-by-the-way-I-am-New-to-PHP.html).  It addresses one of the most common problems that plague beginning PHP develop…
The purpose of this video is to demonstrate how to exclude a particular blog category from the main blog page. This is can be used when a category already has its own tab, or you simply want certain types of posts not to show up on the main blog. …
The purpose of this video is to demonstrate how to set up the permalinks on a WordPress Website. This will be demonstrated using a Windows 8 PC. Go to your WordPress login page. This will look like the following: mywebsite.com/wp-login.php : Go t…

910 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now