2013-04-04 62 views
4

創建高級搜索我在創建自定義查詢高級搜索和使用$wpdb->get_results($query , OBJECT);問題使用查詢

在WordPress的普通搜索時,我們搜索xxx yyyy或搜索yyyy xxx我們有相同的結果,它是一個好問題。 但是,當我被迫使用查詢來創建高級搜索時,搜索字段中的單詞序列是重要的,並且進一步xxx yyyy或搜索yyyy xxx不是相同的結果。 我想用一個例子說: 我創建兩個輸入字段之一爲標題和另一個作者的我的帖子(作者僅是一個例子,在這個地方是一個自定義字段) 我嘗試閱讀這些字段,並搜索他們in wordpress

<?php 
$t = $_REQUEST['title']; 
$a = $_REQUEST['author']; 
global $wpdb; 
$query = "SELECT DISTINCT wp_posts.* FROM wp_posts, wp_postmeta WHERE wp_posts.ID = wp_postmeta.post_id"; 

if ($t != '') { 
    $t_sql = " AND wp_posts.post_title like '%$t%' "; 
} 

if ($a != '') { 
    $a_sql = " AND wp_postmeta.meta_key = 'Author' AND wp_postmeta.meta_value like '%$a%' "; 
} 
$query .= $t_sql; 
$query .= $a_sql; 
$pageposts = $wpdb->get_results($query , OBJECT); 
global $post; 

if ($pageposts): 
foreach ($pageposts as $post): 
setup_postdata($post); 
//... 
endforeach; 
endif; 
?> 

在你的想法中,我該怎麼做?

+0

您能否在您的問題中添加一些額外的細節?如果你願意的話,給出這些功能的含義。你以前做過嗎?代碼中的「OBJECT」是什麼? $ query是一個SQL嗎? – 5ervant 2013-04-09 06:10:55

回答

3

您可以通過一個Space字符分割搜索字詞,然後構建您的查詢查找的話每一個可能的順序。下面是一個例子你Title領域:

// Assuming the title is "One Two Three" 
$t = $_REQUEST['title']; 

// Split the TITLE by space character 
$terms = explode(' ', $t); // $terms = ["One", "Two", "Three"] 

// Concats each search term with a LIKE operator 
$temp = array(); 
foreach ($terms as $term) { 
    $temp[] = "title LIKE '%".$term."%'"; 
    // $temp = ["title LIKE %One%", "title LIKE %Two%", ... 
} 

// Adds an AND operator for each $temp to the query statement 
$query = "SELECT * FROM titleTable WHERE (".implode(' AND ', $temp).")"; 
// $query = SELECT * FROM titleTable WHERE 
     // (title LIKE '%One%' AND title LIKE '%Two%' AND title LIKE '%Three%') 
1

其實,我已經審覈您的網頁開發人員門戶網站,特別是SQL查詢代碼。而且我也不知道爲什麼通過搜索xxx yyyyyyyy xxx與您的PHP腳本不一樣。但唯一的提示,我可以給你:

$query .= $t_sql; 
$query .= $a_sql; 
// is to add an sql order by keyword like this 
$query .= " ORDER BY wp_posts . post_title "; 

試試看!當你使用$_GET,$_POST$_COOKIE變量時,如果你的服務器的PHP沒有對這些變量運行addslashes(),請不要忘記addslashes()。您可以使用功能get_magic_quotes_gpc()進行檢查。