我正在服务器中构建一个Solr实例,我想用它替换wordpress搜索。我测试了一些Solr Wordpress插件,但它们没有我需要的灵活性和简单性。
因此,我想做的是从用户那里获取搜索查询,然后向Solr服务器发出请求,Solr服务器将返回一个wp\\U帖子id列表。然后我将此列表传递给wp\\U query,并向用户显示项目。
代码可能如下所示:
$url = \'http://{SOLR_IP}:{SOLR_PORT}/solr/{CORE_NAME}/select?indent=on&q={ DESIRED_QUERY }&wt=json\';
$result = file_get_contents($url);
$data = json_decode($result, true);
$ids = array();
foreach ($data[\'response\'][\'docs\'] as $item)
array_push($ids, $item[\'id\']);
$args = array(
\'post__in\' => $ids
);
$the_query = new WP_Query( $args );
问题是:我不知道该把这段代码放在哪里,以便以干净的方式替换原始的搜索查询。我一直在看这两个搜索。php和searchform。但是我真的不知道该怎么做。
最合适的回答,由SO网友:Elex 整理而成
对不起,我的英语不好。我认为您必须使用内置查询挂钩将您的帖子ID发送到主查询。它使用pre_get_posts 钩这将允许您在创建查询之后和执行之前更改查询。
add_action(\'pre_get_posts\', \'my_search_query\');
function my_search_query($query) {
if($query->is_search() && $query->is_main_query() && get_query_var(\'s\', false)) {
// Get the "s" query arg from the initial search
$desired_query = get_query_var(\'s\', false);
// Your code
$url = \'http://{SOLR_IP}:{SOLR_PORT}/solr/{CORE_NAME}/select?indent=on&q={ DESIRED_QUERY }&wt=json\';
$result = file_get_contents($url);
$data = json_decode($result, true);
$ids = array();
foreach ($data[\'response\'][\'docs\'] as $item)
{
array_push($ids, $item[\'id\']);
}
// Update the main query
$query->set(\'post__in\' => $ids);
}
return $query;
}
您将使用Solr系统中的新ID更新主查询。可能有更好的方法来获取搜索查询,如使用
get_search_query
但我不确定该函数是否在
pre_get_posts
钩