首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ElasticPress -搜索无法工作的元和高级自定义字段

ElasticPress -搜索无法工作的元和高级自定义字段
EN

Stack Overflow用户
提问于 2018-04-26 14:38:38
回答 2查看 3.6K关注 0票数 2

我们使用Wordpress 4.9.5与ElasticPress 2.5和Searchly。

默认搜索工作正常。然而,我们索引了成千上万的零件编号,每一个都是wordpress中的一篇文章。和许多零件号码一样,他们也有ABC-12-B23-QQ这样的标题。

我们正在开箱即用ElasticPress。广告上说它的效果非常好,但是.

似乎它只是在搜索帖子标题。它根本没有搜索我们的高级自定义字段。我们正在使用ACF的所有零件细节,如长度,颜色,和完成,所以这是非常重要的,我们能够搜索这些字段。

如何让Elasticpress搜索我的自定义字段?我需要使用自定义映射吗?

https://github.com/10up/ElasticPress

注:我张贴这个,所以它包括在堆栈溢出,以造福于其他人谁以后搜索。如果我在搜索开始的时候在Stackoverflow上找到这个,我就省了几个小时。:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-26 14:38:38

事实证明,是的,ElasticPress确实会自动映射所有元字段,但默认情况下,它不会搜索它们。

根据文档(https://github.com/10up/ElasticPress),

“以下是仅由ElasticPress支持的特殊参数。

代码语言:javascript
复制
search_fields (array)
If not specified, defaults to array( 'post_title', 'post_excerpt', 'post_content' ).

这是我的问题。要解决这个问题,必须告诉ElasticPress要搜索哪些字段。

ElasticPress文档包括使用WP_Query的示例:

代码语言:javascript
复制
new WP_Query( array(
    's'             => 'meta search phrase',
    'search_fields' => array(
        'post_title',
        'post_content',
        'post_excerpt',
        'meta' => array( 'meta_key_1', 'meta_key_2' ),
    ),
) );

我确实需要连接到现有的搜索查询,下面是我使用pre_get_posts操作所做的工作的一个例子:

代码语言:javascript
复制
function my_search_filter($query) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->is_search() ) {
        $query->set('search_fields', array(
        'post_title',
        'meta' => array( 'bin_part_number',
                        'shelf_part_number',
                        )));
    }
  }
}
add_action('pre_get_posts','my_search_filter',1);
票数 3
EN

Stack Overflow用户

发布于 2020-07-13 11:22:08

此时,真正起作用的唯一方法是使用ep_search_fields钩子。注意:您必须确保字段是索引的,但是默认情况下所有ACF字段都是添加的。您可以使用以下代码。经过漫长的奋斗之后,关键在于它必须作为meta.yourfield.value提供。

代码语言:javascript
复制
add_filter( 'ep_search_fields', 'update_search_fields', 11, 2 );
/**
 * Updates fields to search against.
 *
 * @param array $fields List of searchable fields.
 * @param array $args List of arguments provided.
 *
 * @return array
 */
function update_search_fields( array $fields, array $args ): array {
    $fields[] = 'meta.mfr_part.value';

    return $fields;
}

还有一个更复杂的例子,它允许您提供一个字段数组,因为这个数组可以由助手函数生成,并在其他地方使用。

代码语言:javascript
复制
/**
  * ElasticSearch: Modify available search fields
  */
  add_filter( 'ep_search_fields', function($search_fields, $args ) {
    $fields = ['my_field'];
    foreach($acf_fields as $key => $label) {
    $fields[] = 'meta.'.$key.'.value';
  }
  return array_merge( $search_fields, $fields );
 }, 10,2 );
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50045798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档