我在使用自定义查询创建高级搜索并使用$wpdb->get_results($query , OBJECT);
在我们搜索xxx yyyy
或搜索yyyy xxx
时,在wordpress中的普通搜索中,我们会得到相同的结果并且它很好。
但是,当我被迫使用查询来创建高级搜索时,搜索字段中的单词序列非常重要,而xxx yyyy
或搜索yyyy xxx
的结果则不同。
我想用一个例子来说:
我为Title创建了两个输入字段,为我的帖子的Author创建了另一个输入字段(Author仅是示例,在此处是自定义字段)
我尝试阅读这些字段并在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 :(得分: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 :(得分:1)
进行在WP DB中搜索的自定义查询不是一个好方法。使用WP_Query来执行此操作。
以下是有人遇到同样问题的链接:
https://wordpress.stackexchange.com/questions/18703/wp-query-with-post-title-like-something
答案 2 :(得分:1)
实际上,我已经在Web开发人员门户网站上审核了您的代码,特别是SQL查询。而且我也不知道为什么通过搜索 xxx yyyy 和 yyyy 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 ";
试一试!如果您的服务器的PHP没有对这些变量运行addslashes()
,那么当您使用$_GET
,$_POST
或$_COOKIE
变量时,请不要忘记addslashes()
。您可以使用函数get_magic_quotes_gpc()
来检查这一点。