Elabora i campi ACF per indicizzare i dati previsti
A volte, dopo aver aggiunto campi Advanced Custom Fields alla configurazione del tuo Motore SearchWP, i risultati attesi non vengono ancora visualizzati.
Ciò è probabilmente dovuto al modo in cui ACF ha memorizzato i dati. Ad esempio, esaminiamo come funzionano i campi Relazione. Dopo aver configurato il campo, puoi scegliere un numero qualsiasi di voci da selezionare e salvare insieme al tuo post.
Basandosi sull'interfaccia di ACF, è logico aspettarsi che tutti i titoli delle voci scelte diventino ricercabili, ma non è così!
ACF memorizza solo gli ID dei post delle voci scelte ed è *questo* ciò che SearchWP indicizza. Tuttavia, questo non è molto utile per i visitatori del tuo sito.
Fortunatamente, SearchWP rende estremamente facile cambiare il modo in cui questi dati vengono indicizzati e, invece di memorizzare gli ID dei post come appaiono nel record dei dati ACF, possiamo dire a SearchWP di indicizzare il Titolo (o qualsiasi altra cosa, a dire il vero!).
Ecco come appare in pratica:
All hooks should be added to your custom SearchWP Customizations Plugin.
| <?php | |
| /** | |
| * Tell SearchWP to index the Title from a Relationship ACF field instead of the post ID | |
| */ | |
| add_filter( 'searchwp\source\post\attributes\meta', function( $meta_value, $args ) { | |
| $acf_field_name = 'read_next'; // The ACF Relationship field name. | |
| // If we're not indexing the Read Next field, return the existing meta value. | |
| // This logic also works for sub-fields of an ACF field as well. | |
| if ( $acf_field_name !== substr( $args['meta_key'], strlen( $args['meta_key'] ) - strlen( $acf_field_name ) ) ) { | |
| return $meta_value; | |
| } | |
| // We're going to store all of our Titles together as one string for SearchWP to index. | |
| $content_to_index = ''; | |
| if ( is_array( $meta_value ) && ! empty( $meta_value ) ) { | |
| foreach ( $meta_value[0] as $acf_relationship_item ) { | |
| if ( is_numeric( $acf_relationship_item ) ) { | |
| // ACF stores only the post ID but we want the Title. | |
| $content_to_index .= ' ' . get_the_title( absint( $acf_relationship_item ) ); | |
| // If you want to index anything else, you can append it to $content_to_index. | |
| } | |
| } | |
| } | |
| // Return the string of content we want to index instead of the data stored by ACF. | |
| return $content_to_index; | |
| }, 20, 2 ); |
Quando il tuo indice viene ricostruito utilizzando il pulsante Ricostruisci Indice nella scheda Motori della schermata delle impostazioni di SearchWP, l'indicizzatore di SearchWP eseguirà l'hook sopra durante l'indicizzazione del campo ACF e, invece di indicizzare gli ID dei post come memorizzati da ACF, sostituirà tali ID con il Titolo di ciascuna voce.
Puoi modificare l'hook per indicizzare qualsiasi dato desideri, non solo il Titolo!
Un altro esempio sarebbe personalizzare ciò che SearchWP indicizza per un Campo Selettore ACF. Per impostazione predefinita, ACF memorizza/recupera solo il valore del campo Selettore, ma potresti voler consentire ai tuoi visitatori di cercare anche per etichetta del campo. Possiamo usare lo stesso hook per fare proprio questo:
| <?php | |
| // Tell SearchWP to index both value and label from ACF Select field. | |
| add_filter( 'searchwp\source\post\attributes\meta', function( $meta_value, $args ) { | |
| $acf_field_name = 'state'; // ACF Select field name. | |
| if ( $acf_field_name !== substr( $args['meta_key'], strlen( $args['meta_key'] ) - strlen( $acf_field_name ) ) ) { | |
| return $meta_value; | |
| } | |
| if ( ! is_array( $meta_value ) ) { | |
| $meta_value = [ $meta_value ]; | |
| } | |
| $acf_field_object = get_field_object( $acf_field_name, $args['post_id'] ); | |
| // Append the Select label to the Select value. | |
| if ( isset( $acf_field_object['choices'] ) ) { | |
| foreach ( $meta_value as $key => $val ) { | |
| if ( isset( $acf_field_object['choices'][ $val ] ) ) { | |
| $meta_value[ $key ] .= ' ' . (string) $acf_field_object['choices'][ $val ]; | |
| } | |
| } | |
| } | |
| return $meta_value; | |
| }, 20, 2 ); |


