web-dev-qa-db-fra.com

Comment ajouter des champs personnalisés/méta avancés à Elasticsearch?

J'utilise le plugin ElasticPress . J'aimerais qu'il indexe des champs supplémentaires (personnalisation avancée). La seule information que je peux trouver est ce commentaire de l’un des développeurs :

[...] si vous souhaitez ajouter des champs supplémentaires qui ne sont pas déjà importés (ElasticPress apporte nativement tous les champs méta non protégés, c'est-à-dire les préfixes non soulignés), vous devez simplement filtrer le filtre ep_post_sync_args et les ajouter vous-même.

J'ai augmenté mon code conformément aux instructions de ialocin . Maintenant, les champs standard sont indexés, pas de message d'erreur, mais les champs personnalisés n'apparaissent toujours pas dans l'index 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 );

Ce numéro sur gitHub references ep_config_mapping . Dois-je faire quelque chose avec ça aussi?

Est-ce que quelqu'un qui a plus d'expérience avec ElasticPress peut me diriger dans la bonne direction?

Mettre à jour!

les instructions d'ialocin sont en fait correctes. C'est le moyen d'ajouter des éléments à l'index de recherche. Mon problème est ailleurs.

2
Florian

Décomposons cela, ACF (Advanced Custom Fields) enregistre les données en tant que méta de champ/post personnalisé, je suppose que cela semble évident, mais il est préférable de le confirmer, et ElasticPress configure automatiquement les champs personnalisés pour les inclure. l'index de recherche. ElasticPress ne le fait que si les métadonnées sont masquées , ce qui est le cas si le nom du champ personnalisé est préfixé par un trait de soulignement - _.

Comme c’est le cas, c’est exactement ce que fait ACF: il préfixe ses champs avec _, ce qui les rend masqués. Expliqué par exemple sur la page de documentation pour update_field() , vous résumez brièvement ici le field_key est _ + field_name. En fait, ce n'est pas ou du moins pas pour tous. Je ne sais pas quelle est la raison, parce que je ne peux pas jeter un coup d'œil à la configuration. Quoi qu'il en soit, les métadonnées sont correctement indexées, mais la recherche ne fonctionne pas, ce qui sera résolu dans une autre question - le lien est la suite. Tout cela consiste encore à ajouter des données de recherche supplémentaires, non indexées automatiquement, telles que des champs personnalisés masqués.

En sens inverse, les champs ACF ne sont pas indexés par ElasticPress. Comme nous pouvons le voir si nous jetons un coup d’œil au EP_API class. La méta de poste obtient inclus dans l'index comme ceci:

'post_meta' => $this->prepare_meta( $post ),

Nous examinons donc de plus près la méthode prepare_meta() , où nous voyons:

if ( ! is_protected_meta( $key ) ) {
  $prepared_meta[$key] = maybe_unserialize( $value );
}

Ce qui confirme la circonstance suspectée.

Vous avez néanmoins trouvé le bon endroit/point d’accès pour ajouter les données, à savoir le filtre ep_post_sync_args . Mais vous ne l'avez pas fait correctement, en particulier, vous essayez d'ajouter une chaîne à un tableau - voir ci-dessus bloc de code et source. (Remarque: si le débogage avait été activé, vous auriez été bogué pour faire quelque chose de mal.) Cela ne fonctionnera pas, bien sûr, vous devez ajouter des éléments au tableau $prepared_meta. Je ne connais pas grand chose à propos d'ACF, je laisse donc cette partie de côté, mais si vous savez comment obtenir les données, un code exemple ci-dessous devrait vous expliquer comment ajouter des champs supplémentaires à l'index de recherche.

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