2013-04-04 38 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()进行检查。