web-dev-qa-db-ja.com

Elasticsearchに高度なカスタムフィールド/メタフィールドを追加する方法

プラグインElasticPress を使用しています。私はそれがいくつかの余分な(高度なカスタム)フィールドを索引付けしたいのですが。私が見つけることができる唯一の情報は 開発者の1人によるこのコメント

[...]まだ追加されていないフィールドを追加したい場合(ElasticPressが保護されていない、つまりアンダースコアが付いていないメタフィールドをネイティブに追加する場合)、ep_post_sync_argsフィルターをフィルタリングして追加します。

iialocinの指示に従ってコードを拡張しました 。標準フィールドはインデックスされ、エラーメッセージは表示されなくなりましたが、カスタムフィールドは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 );

このgitHubの問題 references ep_config_mapping 。私もそれで何かをする必要がありますか?

ElasticPressの経験が豊富な人なら誰でも正しい方向に向けることができますか?

更新!

ialocinの指示は、実際には正しいです。これは、検索インデックスにものを追加する方法です。私の問題は他にあります。

2
Florian

これを分解するために、Advanced Custom Fields(ACF)はデータをカスタムフィールド/ポストメタとして保存します。それは明らかに思われますが、確認することをお勧めします。検索インデックス メタデータが隠されていない限り、ElasticPressはこれを行います - カスタムフィールド名の前にアンダースコア - _が付いている場合がこれに該当します。

それがそうであるように、それはまさにACFがすることである、それはそれらを非表示にする_でそのフィールドを前に置く。説明済み update_field() のドキュメントページで、要約すると、field_key_ + field_nameです。 実際にはそうではありません。その理由がよくわからない。セットアップを見れないからだ。とにかく、メタデータは正しくインデックス付けされますが、検索は機能しません。隠されたカスタムフィールドのように、自動的に索引付けされていない追加の検索データを追加することには、まだ十分に役立ちます。

逆に言えば、ACFフィールドはElasticPressによってインデックスされていないという結果になります。ご覧のとおり、 EP_API クラスを見ればわかります。投稿メタは インデックスに含められます のようになります:

'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;
}
2
Nicolai