Processar Campos ACF para Indexar Dados Esperados
Às vezes, depois de adicionar campos de Campos Personalizados Avançados à configuração do seu Motor SearchWP, os resultados esperados ainda não aparecem.
Isso provavelmente se deve à forma como o ACF armazenou os dados. Por exemplo, vamos revisar como os campos de Campos de Relacionamento funcionam. Após configurar o campo, você pode escolher qualquer número de entradas para selecionar e salvar junto com sua postagem.
Com base na interface do ACF, faz sentido esperar que todos os títulos das entradas escolhidas se tornem pesquisáveis, mas esse não é o caso!
O ACF armazena apenas os IDs das postagens das entradas escolhidas e é *isso* que o SearchWP está indexando. No entanto, isso não é muito útil para os visitantes do seu site.
Felizmente, o SearchWP torna extremamente fácil alterar a forma como esses dados são indexados e, em vez de armazenar os IDs das postagens como aparecem no registro de dados do ACF, podemos dizer ao SearchWP para indexar o Título (ou qualquer outra coisa, aliás!).
Veja como isso se parece na prática:
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 seu índice for reconstruído usando o botão Reconstruir Índice na aba Motores da tela de configurações do SearchWP, o indexador do SearchWP executará o hook acima ao indexar o campo ACF e, em vez de indexar os IDs das postagens como o ACF armazenou os dados, ele substituirá esses IDs pelo Título de cada entrada.
Você pode ajustar o hook para indexar quaisquer dados que desejar, não apenas o Título!
Outro exemplo seria personalizar o que o SearchWP indexa para um Campo de Seleção ACF. Por padrão, o ACF armazena/recupera apenas o valor do campo de Seleção, mas você pode querer permitir que seus visitantes pesquisem também pelo rótulo do campo. Podemos usar o mesmo hook para fazer exatamente isso:
| <?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 ); |


