Procesar Campos ACF para Indexar Datos Esperados
A veces, después de agregar campos de Campos Personalizados Avanzados a la configuración de su Motor de SearchWP, los resultados esperados aún no aparecen.
Esto se debe probablemente a la forma en que ACF ha almacenado los datos. Por ejemplo, revisemos cómo funcionan los campos de Campos de Relación. Después de configurar el campo, puedes elegir cualquier número de entradas para seleccionar y guardar junto con tu publicación.
Basándonos en la interfaz de ACF, tiene sentido esperar que todos los títulos de las entradas elegidas se vuelvan buscables, ¡pero ese no es el caso!
ACF almacena solo los IDs de las publicaciones de las entradas elegidas y *eso* es lo que SearchWP está indexando. Sin embargo, eso no es muy útil para los visitantes de tu sitio.
Afortunadamente, SearchWP hace que sea extremadamente fácil cambiar la forma en que se indexan estos datos, y en lugar de almacenar los IDs de las publicaciones tal como aparecen en el registro de datos de ACF, podemos decirle a SearchWP que indexe el Título (¡o cualquier otra cosa)!
Así es como se ve en la práctica:
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 ); |
Cuando tu índice se reconstruye usando el botón Reconstruir Índice en la pestaña Motores de la pantalla de configuración de SearchWP, el indexador de SearchWP ejecutará el hook anterior al indexar el campo ACF y, en lugar de indexar los IDs de las publicaciones tal como ACF ha almacenado los datos, reemplazará esos IDs con el Título de cada entrada.
¡Puedes ajustar el hook para indexar cualquier dato que desees, no solo el Título!
Otro ejemplo sería personalizar lo que SearchWP indexa para un Campo de Selección de ACF. Por defecto, ACF almacena/recupera solo el valor del campo value, pero es posible que desees permitir que tus visitantes también busquen por la etiqueta del campo label. Podemos usar el mismo hook para hacer precisamente eso:
| <?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 ); |


