it-swarm.com.de

Wie füge ich Elasticsearch erweiterte benutzerdefinierte Felder/Metafelder hinzu?

Ich benutze das Plugin ElasticPress . Ich möchte, dass es einige zusätzliche (erweiterte benutzerdefinierte) Felder indiziert. Die einzige Information, die ich finden kann, ist dieser Kommentar von einem der Entwickler :

[...] Wenn Sie zusätzliche Felder hinzufügen möchten, die noch nicht übertragen wurden (ElasticPress überträgt standardmäßig alle nicht geschützten, d. h. nicht unterstrichenen Metafelder), müssen Sie nur den Filter ep_post_sync_args filtern und selbst hinzufügen.

Ich habe meinen Code gemäß den Anweisungen von ialocin erweitert. Jetzt werden die Standardfelder indiziert, es werden keine Fehlermeldungen angezeigt, die benutzerdefinierten Felder werden jedoch weiterhin nicht im ElasticSearch-Index angezeigt.

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 );

Dieses Problem auf gitHub Referenzen ep_config_mapping . Muss ich auch damit etwas anfangen?

Kann mich jemand mit mehr Erfahrung mit ElasticPress in die richtige Richtung weisen?

Aktualisieren!

die Anweisungen von ialocin sind in der Tat richtig. Auf diese Weise können Sie dem Suchindex Inhalte hinzufügen. Mein Problem liegt woanders.

2
Florian

Lassen Sie uns dies aufschlüsseln. Advanced Custom Fields (ACF) speichert die Daten als benutzerdefiniertes Feld/Post-Meta. Ich denke, es ist alles offensichtlich, aber es ist besser, es zu bestätigen, und ElasticPress richtet benutzerdefinierte Felder automatisch ein, um sie einzuschließen der Suchindex. ElasticPress tut dies, es sei denn, die Metadaten sind ausgeblendet , was der Fall ist, wenn dem benutzerdefinierten Feldnamen ein Unterstrich vorangestellt wird - _.

Wie es der Fall ist, stellt ACF seinen Feldern _ voran, wodurch sie ausgeblendet werden. Erklärt z.B. Auf der Dokumentationsseite für update_field() haben Sie kurz zusammengefasst gelesen, dass der field_key_ + field_name ist. Eigentlich nicht oder zumindest nicht für alle. Ich bin mir nicht sicher, was der Grund ist, weil ich mir das Setup nicht ansehen kann. Wie auch immer, die Metadaten werden korrekt indiziert, aber die Suche funktioniert nicht, was in einer anderen Frage behoben wird. All dies gilt weiterhin für das Hinzufügen zusätzlicher, nicht automatisch indizierter Suchdaten, z. B. ausgeblendeter benutzerdefinierter Felder.

Umgekehrt mit der Folge, dass ACF-Felder von ElasticPress nicht indiziert werden. Wie wir sehen können, wenn wir einen Blick auf die Klasse EP_API werfen. Das Post-Meta erhält in den Index aufgenommen wie folgt:

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

Also schauen wir uns die prepare_meta() -Methode genauer an, wo wir sehen:

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

Was den vermuteten Umstand bestätigt.

Sie haben den richtigen Ort/Haken gefunden, um die Daten trotzdem hinzuzufügen, nämlich den ep_post_sync_args Filter. Aber Sie haben es nicht richtig gemacht, insbesondere, Sie haben versucht, eine Zeichenfolge an ein Array anzuhängen - siehe oben Codeblock und Quelle. (Hinweis: Wenn Sie das Debuggen aktiviert hätten, wäre es Ihnen nicht gelungen, etwas Falsches zu tun.) Dies funktioniert natürlich nicht, Sie müssen es dem $prepared_meta-Array hinzufügen. Ich weiß nicht so viel über ACF, also lasse ich diesen Teil weg, aber wenn Sie wissen, wie Sie die Daten erhalten, sollte Ihnen der folgende Beispielcode ziemlich klar machen, wie Sie die zusätzlichen Felder zum Suchindex hinzufügen.

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