好的,所以我最终还是使用了 Relevanssi。但有不少修改。
首先,分类法过滤非常简单,因为它内置在 Relevanssi 中,我需要做的就是将<select>
元素的名称更改为分类名称 + 将值更改为 slug:
<select name="custom_taxonomy">
<option value="some-term">Some term</option>
...
</select>
其次,为了允许按自定义字段排序,我必须使用relevanssi_hits_filter
过滤器。与pre_get_posts
or不同relevanssi_modify_wp_query
(Sheikh Heera 建议),此过滤器通过帖子数组而不是WP_Query 对象。当我尝试使用 WP_Query 对象时,订单只是拒绝更改。这里基本上是如何做你自己的排序relevanssi_hits_filter
:
<?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;
}
这也有助于解决我之前遇到的一个问题,即缺少“价格”键的帖子没有出现在搜索中。现在他们这样做了,我给他们一个“10000000”的价格的原因是为了让他们出现在那些有价格的人之后。
最后,我还需要空搜索才能工作。根据 Relevanssi 开发人员的说法,这仅在高级版本中受支持,但我想我设法解决了这个问题。首先,即使 ?s 为空,我也强制 WP 显示搜索页面:
<?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;
}
其次,如果 ?s 为空,我告诉 Relevanssi 获取所有帖子,默认情况下它根本不会获取任何帖子。不幸的是,在执行此操作时,自定义分类法的默认行为停止工作(我的代码重写了它),因此我还必须手动检查此代码中的分类法:
<?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;
}
就是这样。一切似乎都有效,希望这将有助于将来有类似要求的人。
我真的希望 WP 在未来改进其荒谬的搜索。按相关性排序应该是世界上最受欢迎的 CMS imo 中可用的东西。
感谢@Sheikh Heera 为我指明了正确的方向。尽管看到我真的无法使用您建议的东西,但我不确定该给谁正确答案。