Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按相关性对Wordpress搜索进行排序_Wordpress_Search_Relevance - Fatal编程技术网

按相关性对Wordpress搜索进行排序

按相关性对Wordpress搜索进行排序,wordpress,search,relevance,Wordpress,Search,Relevance,我已经为我在atm上工作的Wordpress网站创建了一个相当高级的搜索。允许访问者按不同的分类法过滤结果,按日期或自定义字段排序,以及正常的自由文本搜索(WP默认提供) 我使用pre_get_posts过滤器完成了这项工作,只需将我的东西添加到查询中,类似这样:(注意,我省略了一些健全性检查和其他代码) 我认为您可以毫无问题地使用relevansi,但需要使用过滤器挂钩,检查更多详细信息,检查以下代码 function func_reli($qry){ $qry->set( 'p

我已经为我在atm上工作的Wordpress网站创建了一个相当高级的搜索。允许访问者按不同的分类法过滤结果,按日期或自定义字段排序,以及正常的自由文本搜索(WP默认提供)

我使用
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;
}