如何将高级定制字段/元字段添加到Elasticearch?

时间:2015-07-17 作者:Florian

我正在使用the plugin ElasticPress. 我想索引一些额外的(高级自定义)字段。我能找到的唯一信息是this comment by one of the developers:

[…]如果您想添加尚未引入的其他字段(ElasticPress本机引入任何不受保护的字段,即不带下划线前缀的元字段),只需过滤ep\\U post\\U sync\\U参数过滤器,然后自己添加即可。

我根据ialocin\'s instructions. 现在,标准字段已被索引,没有错误消息,但自定义字段仍不会出现在ElasticSearch索引中。

function update_ep_sync_args( $post_args, $post_id ) {
$oldPreparedMeta = $post_args[ \'post_meta\' ];
$additionalPreparedMeta = array();
$post = get_post( $post_id );
if( have_rows(\'content\',$post->ID) ):
 // loop through the rows of data
while ( have_rows(\'content\',$post->ID) ) : the_row();
    // BODY TEXT
    if( get_row_layout() == \'text\' ):
        $additionalPreparedMeta[\'text\'] = get_sub_field(\'text\') . \' \';
    elseif( get_row_layout() == \'subHeading\' ):
        $text = get_sub_field(\'text\');
        $additionalPreparedMeta[\'text\'] = $text . \' \';
    endif;
endwhile;
endif;
$newPreparedMeta = array_merge( $oldPreparedMeta, $additionalPreparedMeta );
$post_args[ \'post_meta\' ] = $newPreparedMeta;
return $post_args;
}
add_filter( \'ep_post_sync_args\', \'update_ep_sync_args\', 10, 2 );
This issue on gitHub 参考文献ep_config_mapping. 我也需要做些什么吗?

有没有人能用ElasticPress为我指出正确的方向?

更新

1 个回复
最合适的回答,由SO网友:Nicolai Grossherr 整理而成

让我们来分析一下,高级自定义字段(ACF)确实会将数据保存为自定义字段/post meta,我想这似乎很明显,但最好是确认它,ElasticPress会自动设置自定义字段以将其包含到搜索索引中。ElasticPress执行此操作,除非meta data is hidden, 如果自定义字段名的前缀是下划线-_.

根据实际情况,这正是ACF所做的,它在字段前面加上前缀_ 把它们藏起来。例如,在文档页中解释update_field(), 你在那里读到的简短摘要field_key_ + field_name.实际上没有,或者至少没有。我不知道原因是什么,因为我无法查看设置。无论如何,元数据得到了正确的索引,但搜索不起作用,这将在另一个链接中得到解决。所有这些仍然适用于添加额外的、非自动索引的搜索数据,如隐藏的自定义字段。

反过来,导致ACF字段未被ElasticPress索引。我们可以看到EP_API 班post meta确实included to the index 像这样:

\'post_meta\' => $this->prepare_meta( $post ),
所以我们仔细看看prepare_meta() 方法,我们可以看到:

if ( ! is_protected_meta( $key ) ) {
  $prepared_meta[$key] = maybe_unserialize( $value );
}
证实了可疑情况。

您已经找到了添加数据的正确位置/挂钩,即ep_post_sync_args 滤器但您并没有正确地执行此操作,尤其是,您试图将字符串附加到数组中-请参阅上面的代码块和源代码。(注意:如果启用了调试,则可能会出现错误的错误。)这当然行不通,您需要添加到$prepared_meta 大堆我对ACF了解不多,所以我省略了这一部分,但如果您知道如何获取数据,那么下面的示例代码应该让您非常清楚,如何向搜索索引添加额外字段。

add_filter( \'ep_post_sync_args\', \'wpse194785_ep_post_sync_args\', 10, 2 );  
function wpse194785_ep_post_sync_args( $post_args, $post_id ) {
  $old_prepared_meta = $post_args[ \'post_meta\' ];
  $additional_prepared_meta = array();
  // code to get up additional meta
  // set up data like this:
  // $additional_prepared_meta[ $key ] = array( $value );
  // note that the value is enclosed into an array
  // you can add one or multiple new elements by key => value association to the array
  // afterwards merge new and old data
  $new_prepared_meta = array_merge( $old_prepared_meta, $additional_prepared_meta );
  $post_args[ \'post_meta\' ] = $new_prepared_meta;
  return $post_args;
}

结束

相关推荐

Searchresult sidebar change

那么,searchresult页面侧栏位于哪里?例如,在searchresult页面中,有一个“A”侧栏。但是,我想将其更改为“B”侧栏。我看着search.php 但无法理解侧边栏的来源。

如何将高级定制字段/元字段添加到Elasticearch? - 小码农CODE - 行之有效找到问题解决它

如何将高级定制字段/元字段添加到Elasticearch?

时间:2015-07-17 作者:Florian

我正在使用the plugin ElasticPress. 我想索引一些额外的(高级自定义)字段。我能找到的唯一信息是this comment by one of the developers:

[…]如果您想添加尚未引入的其他字段(ElasticPress本机引入任何不受保护的字段,即不带下划线前缀的元字段),只需过滤ep\\U post\\U sync\\U参数过滤器,然后自己添加即可。

我根据ialocin\'s instructions. 现在,标准字段已被索引,没有错误消息,但自定义字段仍不会出现在ElasticSearch索引中。

function update_ep_sync_args( $post_args, $post_id ) {
$oldPreparedMeta = $post_args[ \'post_meta\' ];
$additionalPreparedMeta = array();
$post = get_post( $post_id );
if( have_rows(\'content\',$post->ID) ):
 // loop through the rows of data
while ( have_rows(\'content\',$post->ID) ) : the_row();
    // BODY TEXT
    if( get_row_layout() == \'text\' ):
        $additionalPreparedMeta[\'text\'] = get_sub_field(\'text\') . \' \';
    elseif( get_row_layout() == \'subHeading\' ):
        $text = get_sub_field(\'text\');
        $additionalPreparedMeta[\'text\'] = $text . \' \';
    endif;
endwhile;
endif;
$newPreparedMeta = array_merge( $oldPreparedMeta, $additionalPreparedMeta );
$post_args[ \'post_meta\' ] = $newPreparedMeta;
return $post_args;
}
add_filter( \'ep_post_sync_args\', \'update_ep_sync_args\', 10, 2 );
This issue on gitHub 参考文献ep_config_mapping. 我也需要做些什么吗?

有没有人能用ElasticPress为我指出正确的方向?

更新

1 个回复
最合适的回答,由SO网友:Nicolai Grossherr 整理而成

让我们来分析一下,高级自定义字段(ACF)确实会将数据保存为自定义字段/post meta,我想这似乎很明显,但最好是确认它,ElasticPress会自动设置自定义字段以将其包含到搜索索引中。ElasticPress执行此操作,除非meta data is hidden, 如果自定义字段名的前缀是下划线-_.

根据实际情况,这正是ACF所做的,它在字段前面加上前缀_ 把它们藏起来。例如,在文档页中解释update_field(), 你在那里读到的简短摘要field_key_ + field_name.实际上没有,或者至少没有。我不知道原因是什么,因为我无法查看设置。无论如何,元数据得到了正确的索引,但搜索不起作用,这将在另一个链接中得到解决。所有这些仍然适用于添加额外的、非自动索引的搜索数据,如隐藏的自定义字段。

反过来,导致ACF字段未被ElasticPress索引。我们可以看到EP_API 班post meta确实included to the index 像这样:

\'post_meta\' => $this->prepare_meta( $post ),
所以我们仔细看看prepare_meta() 方法,我们可以看到:

if ( ! is_protected_meta( $key ) ) {
  $prepared_meta[$key] = maybe_unserialize( $value );
}
证实了可疑情况。

您已经找到了添加数据的正确位置/挂钩,即ep_post_sync_args 滤器但您并没有正确地执行此操作,尤其是,您试图将字符串附加到数组中-请参阅上面的代码块和源代码。(注意:如果启用了调试,则可能会出现错误的错误。)这当然行不通,您需要添加到$prepared_meta 大堆我对ACF了解不多,所以我省略了这一部分,但如果您知道如何获取数据,那么下面的示例代码应该让您非常清楚,如何向搜索索引添加额外字段。

add_filter( \'ep_post_sync_args\', \'wpse194785_ep_post_sync_args\', 10, 2 );  
function wpse194785_ep_post_sync_args( $post_args, $post_id ) {
  $old_prepared_meta = $post_args[ \'post_meta\' ];
  $additional_prepared_meta = array();
  // code to get up additional meta
  // set up data like this:
  // $additional_prepared_meta[ $key ] = array( $value );
  // note that the value is enclosed into an array
  // you can add one or multiple new elements by key => value association to the array
  // afterwards merge new and old data
  $new_prepared_meta = array_merge( $old_prepared_meta, $additional_prepared_meta );
  $post_args[ \'post_meta\' ] = $new_prepared_meta;
  return $post_args;
}