让我们来分析一下,高级自定义字段(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;
}