Interceptar Búsquedas del Campo de Relación de Advanced Custom Fields (ACF)
Advanced Custom Fields tiene la opción de añadir un campo de búsqueda a los campos de relación:
Por defecto, SearchWP no interceptará estas búsquedas, pero con este fragmento puedes hacer que suceda:
| <?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 ); |
Hay un par de cosas a tener en cuenta con este fragmento:
Puedes controlar qué campo(s) de relación utiliza SearchWP para las búsquedas. La línea 85 utiliza el hook de ACF para aplicar los resultados de SearchWP a todas las búsquedas de campos de relación.
Si en su lugar quieres elegir qué campos de relación quieres que SearchWP utilice, comenta la línea 85 y descomenta la línea 88, asegurándote de actualizar my_acf_relationship_field_name con el nombre de uno de tus campos de relación. Puedes repetir el hook (actualizando el nombre del campo de relación) para cada campo adicional.
La segunda cosa a tener en cuenta es que la función de devolución de llamada my_searchwp_acf_relationship_field_search (que es lo que realmente modifica los resultados de búsqueda de ACF para este caso de uso) utiliza el motor de SearchWP que has definido como motor de búsqueda de administración en la pestaña Avanzado de la pantalla de configuración de SearchWP.
Si deseas anular esto, puedes proporcionar el nombre del motor de SearchWP a utilizar en la línea 13 del fragmento.
Una vez que este hook esté en su lugar, SearchWP interceptará las búsquedas aplicables de campos de relación de Advanced Custom Fields, devolviendo resultados del propio SearchWP.


