carlyblack
asked on
changing search function to look for 2 seperate words in search
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.
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;
}
?>
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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);
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);
ASKER
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.
specifically this goes into the WHERE clause of your sql query.
ASKER
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.
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.
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.
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.