Interceptar Pesquisas de Campo de Relacionamento do Advanced Custom Fields (ACF)
Advanced Custom Fields tem a opção de adicionar um campo de pesquisa aos campos de Relacionamento:
Por padrão, o SearchWP não interceptará essas pesquisas, mas usando este trecho você pode fazer isso acontecer:
| <?php | |
| function my_searchwp_acf_relationship_field_search( $args, $field, $post_id ) { | |
| if ( empty( $args['s'] ) || ! class_exists( 'SWP_Query' ) ) { | |
| return $args; | |
| } | |
| // Assume that the SearchWP engine to use is the defined admin search engine | |
| // from SearchWP's engine settings. | |
| $admin_engine = \SearchWP\Settings::get_admin_engine(); | |
| $engine_name = ! empty( $admin_engine ) ? $admin_engine : 'default'; | |
| $engine = new \SearchWP\Engine( $engine_name ); | |
| $engine_sources = $engine->get_sources(); | |
| if ( empty( $engine_sources ) ) { | |
| return array( 0 ); | |
| } | |
| // Get Source post types | |
| $engine_sources = array_map( | |
| function( $source ) { | |
| $source_name = $source->get_name(); | |
| $source_name_parts = explode( SEARCHWP_SEPARATOR, $source_name ); | |
| return $source_name_parts[1] ?? false; | |
| }, | |
| $engine_sources | |
| ); | |
| $engine_sources = array_filter( | |
| $engine_sources, | |
| function( $source ) { | |
| return false !== strpos( $source, 'post' . SEARCHWP_SEPARATOR ); | |
| }, | |
| ARRAY_FILTER_USE_KEY | |
| ); | |
| if ( empty( $engine_sources ) ) { | |
| return array( 0 ); | |
| } | |
| $searchwp_args = array( | |
| 'engine' => $engine_name, // The SearchWP engine to use. | |
| 's' => $args['s'], // Pass along the search query. | |
| 'fields' => 'ids', // Return only post IDs. | |
| ); | |
| if ( ! empty( $args['taxonomy' ] ) ) { | |
| $tax_arg = explode( ':', $args['taxonomy'] ); | |
| $searchwp_args['tax_query'] = array( | |
| array( | |
| 'taxonomy' => $tax_arg[0], | |
| 'field' => 'slug', | |
| 'terms' => $tax_arg[1], | |
| ), | |
| ); | |
| } | |
| if ( ! empty( $args['post_type'] ) ) { | |
| $searchwp_args['post_type'] = array_intersect( $args['post_type'], array_values( $engine_sources ) ); | |
| } | |
| // Tell SearchWP to NOT log this search. | |
| add_filter( 'searchwp\statistics\log', '__return_false' ); | |
| // Retrieve SearchWP results. | |
| $results = new SWP_Query( $searchwp_args ); | |
| // If there are no results, we need to force ACF to reflect that. | |
| if ( empty( $results->posts ) ) { | |
| $results->posts = array( 0 ); | |
| } | |
| // We're going to use SearchWP's results to handle the restrictions as outlined. | |
| $args['s'] = ''; | |
| $args['order'] = ''; | |
| $args['orderby'] = 'post__in'; | |
| $args['post__in'] = $results->posts; | |
| return $args; | |
| } | |
| // Tell SearchWP to intercept all ACF Relationship field searches. | |
| add_filter( 'acf/fields/relationship/query', 'my_searchwp_acf_relationship_field_search', 10, 3 ); | |
| // Tell SearchWP to intercept a single ACF Relationship field search. | |
| // add_filter( 'acf/fields/relationship/query/name=my_acf_relationship_field_name', 'my_searchwp_acf_relationship_field_search', 10, 3 ); |
Há algumas coisas a serem observadas com este trecho:
Você pode controlar quais campos de Relacionamento utilizam o SearchWP para pesquisas. A linha 85 usa o hook do ACF para aplicar os resultados do SearchWP a todas as pesquisas de campos de Relacionamento.
Se, em vez disso, você quiser escolher quais campos de Relacionamento você gostaria que o SearchWP funcionasse, comente a linha 85 e descomente a linha 88, certificando-se de atualizar my_acf_relationship_field_name com o nome de um dos seus campos de Relacionamento. Você também pode repetir o hook (atualizando o nome do campo de Relacionamento) para cada campo adicional.
A segunda coisa a notar é que a função de callback my_searchwp_acf_relationship_field_search (que é o que realmente modifica os resultados da pesquisa do ACF para este caso de uso) usa o motor SearchWP que você definiu como o motor de pesquisa Admin na aba Avançado da tela de configurações do SearchWP.
Se você quiser substituir isso, pode fornecer o nome do motor SearchWP a ser usado na linha 13 do trecho.
Uma vez que este hook esteja em vigor, o SearchWP interceptará as pesquisas aplicáveis de Campos de Relacionamento do Advanced Custom Fields, retornando resultados do próprio SearchWP.


