按相关性对Wordpress搜索进行排序
我已经为我在atm上工作的Wordpress网站创建了一个相当高级的搜索。允许访问者按不同的分类法过滤结果,按日期或自定义字段排序,以及正常的自由文本搜索(WP默认提供) 我使用按相关性对Wordpress搜索进行排序,wordpress,search,relevance,Wordpress,Search,Relevance,我已经为我在atm上工作的Wordpress网站创建了一个相当高级的搜索。允许访问者按不同的分类法过滤结果,按日期或自定义字段排序,以及正常的自由文本搜索(WP默认提供) 我使用pre_get_posts过滤器完成了这项工作,只需将我的东西添加到查询中,类似这样:(注意,我省略了一些健全性检查和其他代码) 我认为您可以毫无问题地使用relevansi,但需要使用过滤器挂钩,检查更多详细信息,检查以下代码 function func_reli($qry){ $qry->set( 'p
pre_get_posts
过滤器完成了这项工作,只需将我的东西添加到查询中,类似这样:(注意,我省略了一些健全性检查和其他代码)
我认为您可以毫无问题地使用relevansi
,但需要使用过滤器
挂钩,检查更多详细信息,检查以下代码
function func_reli($qry){
$qry->set( 'post_type', array( 'post', 'page', 'restaurant', 'products' ) );
if ($_GET['myorder'] == 'price') {
$qry->set('orderby', 'meta_value_num');
$qry->set('meta_key', 'price');
$qry->set('order', 'ASC');
}
else {
$qry->set('orderby', 'date');
$qry->set('order', 'DESC'); // <-- set (in your code 'add' is used)
}
return $qry; // <-- must return, in your code you didn't
}
add_filter('relevanssi_modify_wp_query', 'func_reli');
此外,如果您使用插件,您可以使用它的设置页面设置post\u类型
,而不是在functions.php
文件中使用此($qry->set('post\u类型',数组(…)
)
下面给出了一张碎石照片
好的,所以我最终还是使用了relevansi。但是经过相当多的修改
首先,分类法的过滤非常简单,因为它内置于Relevanssi中,我所需要做的就是将
元素的名称更改为分类法名称+将值更改为slug:
<select name="custom_taxonomy">
<option value="some-term">Some term</option>
...
</select>
这也解决了我之前遇到的一个问题,即缺少“价格”键的帖子没有出现在搜索中。现在他们有了,我给他们一个“10000000”的价格是为了让他们在那些有价格的人之后出现
最后,我还需要空搜索才能工作。根据Relevanssi开发人员的说法,这只在高级版本中受支持,但我想我已经设法解决了这个问题。首先,我强制WP显示搜索页面,即使?s为空:
<?php
add_filter('request', 'h5b_allow_empty_search');
function h5b_allow_empty_search ($qryVars) {
if (isset($_GET['s']) and empty($_GET['s'])) {
$qryVars['s'] = ' ';
}
return $qryVars;
}
刚刚发现WP的核心已经有了这个
在中,查看“orderby”=>“相关性”参数
按以下顺序排列搜索词:首先,是否
整个句子是匹配的。第二,如果所有的搜索词都是
在标题中。第三,如果任何搜索词出现在
标题。第四,如果内容中出现完整的句子
我知道这个插件做得很好:。也许这有助于填补空白。谢谢,但如果你读了整个问题,你就会明白为什么我不想使用它。是的,我明白了,只是想也许可以从中提取一些有用的东西。祝你好运,太棒了!谢谢你给我一个很好的回答,我会试试Relevansi然后回来。好吧,这看起来很有希望,但由于某些原因它不起作用。我似乎能够按日期排序,但尝试按自定义字段排序会产生与相关性相同的顺序(或未设置任何顺序)。不知道为什么。似乎大多数人都使用relevansi\u hits\u过滤器
来添加自己的排序,但这看起来要复杂得多(不能使用WPQuery对象,而是必须自己对数组进行排序)。想法?我还需要它来处理空搜索以及按自定义分类法过滤。看起来并不像这个回答所说的那么简单。好吧,我最终还是使用了relevansi,但使用了不同的钩子和完全不同的代码(我前面提到的relevansi_hits_filter
)。我必须自己usort()
发布数组,而不是依赖WP的“orderby”设置。不过它很有效。很高兴知道这一点,你介意和社区分享吗?
<select name="custom_taxonomy">
<option value="some-term">Some term</option>
...
</select>
<?php
add_filter('relevanssi_hits_filter', 'h5b_hits_filter');
function h5b_hits_filter ($hits) {
global $wp_query;
if (isset($wp_query->query_vars['orderby']) and $wp_query->query_vars['orderby'] == 'price') {
if (count($hits[0])) {
usort($hits[0], 'h5b_sort_by_price');
}
}
return $hits;
}
function h5b_sort_by_price ($a, $b) {
$priceKey = 'price';
$aPrice = get_post_meta($a->ID, $priceKey, true);
$bPrice = get_post_meta($b->ID, $priceKey, true);
$aPrice = $aPrice ? $aPrice : 10000000;
$bPrice = $bPrice ? $bPrice : 10000000;
if ($aPrice == $bPrice) {
return 0;
}
return ($aPrice < $bPrice) ? -1 : 1;
}
<?php
add_filter('request', 'h5b_allow_empty_search');
function h5b_allow_empty_search ($qryVars) {
if (isset($_GET['s']) and empty($_GET['s'])) {
$qryVars['s'] = ' ';
}
return $qryVars;
}
<?php
add_filter('relevanssi_hits_filter', 'h5b_allow_empty_search_filter');
function h5b_allow_empty_search_filter ($hits) {
if (isset($_GET['s']) and empty($_GET['s']) and !count($hits[0])) {
$taxQry = array('relation' => 'AND');
if (!empty($_GET['custom_taxonomy'])) {
$taxQry[] = array(
'taxonomy' => 'custom_taxonomy',
'field' => 'slug',
'terms' => $_GET['custom_taxonomy']
);
}
$args = array(
'numberposts' => -1,
'post_type' => 'any'
);
if (count($taxQry) > 1) {
$args['tax_query'] = $taxQry;
}
$hits[0] = get_posts($args);
}
return $hits;
}