4

我在使用自定义查询创建高级搜索和使用时遇到问题$wpdb->get_results($query , OBJECT);

在 wordpress 中的普通搜索中,当我们搜索xxx yyyy或搜索时,yyyy xxx我们会得到相同的结果,这很好。但是当我被迫使用查询来创建高级搜索时,搜索字段中的单词序列很重要,而且 xxx yyyy搜索yyyy xxx结果不一样。我想说一个例子:我创建了两个输入字段,一个用于标题,另一个用于我的帖子的作者(作者只是一个例子,在这个地方是一个自定义字段)我尝试阅读这些字段并在 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;
?>

在您的想法中,我必须做什么?

4

3 回答 3

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%')
于 2013-04-09T08:40:33.170 回答
1

在 WP DB 中进行自定义查询不是一个好方法。使用 WP_Query 来执行此操作。

这是某人遇到相同问题的链接:

https://wordpress.stackexchange.com/questions/18703/wp-query-with-post-title-like-something

于 2013-04-04T08:35:17.360 回答
1

实际上,我已经在 Web 开发人员门户网站上查看了您的代码,特别是 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 ";

试试看!如果您的服务器的 PHP 没有在这些变量上运行,请不要忘记addslashes()何时使用$_GET,$_POST或变量。您可以使用该功能进行检查。$_COOKIEaddslashes()get_magic_quotes_gpc()

于 2013-04-09T09:00:40.813 回答