Abfangen von Suchanfragen f\"ur Advanced Custom Fields (ACF) Relationship-Felder
Erweiterte benutzerdefinierte Felder bieten die Möglichkeit, ein Suchfeld zu Beziehungsfeldern hinzuzufügen:
Standardmäßig fängt SearchWP diese Suchen nicht ab, aber mit diesem Snippet können Sie das erreichen:
| <?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 ); |
Es gibt ein paar Dinge, die bei diesem Snippet zu beachten sind:
Sie können steuern, welches/welche Beziehungsfeld(er) SearchWP für Suchen verwendet. Zeile 85 verwendet den Hook von ACF, um die Ergebnisse von SearchWP auf alle Beziehungsfeld-Suchen anzuwenden.
Wenn Sie stattdessen auswählen möchten, mit welchen Beziehungsfeldern SearchWP funktionieren soll, kommentieren Sie Zeile 85 aus und kommentieren Sie Zeile 88 ein. Stellen Sie sicher, dass Sie my_acf_relationship_field_name mit dem Namen eines Ihrer Beziehungsfelder aktualisieren. Sie können den Hook (mit Aktualisierung des Beziehungsfeldnamens) für jedes zusätzliche Feld wiederholen.
Das zweite zu beachtende ist, dass der Callback my_searchwp_acf_relationship_field_search (der die ACF-Suchergebnisse für diesen Anwendungsfall tatsächlich modifiziert) die SearchWP-Engine verwendet, die Sie als Admin-Such-Engine auf der Registerkarte „Erweitert“ der SearchWP-Einstellungen definiert haben.
Wenn Sie dies überschreiben möchten, können Sie den Namen der zu verwendenden SearchWP-Engine in Zeile 13 des Snippets angeben.
Sobald dieser Hook eingerichtet ist, fängt SearchWP die zutreffenden erweiterten benutzerdefinierten Feld-Beziehungsfeld-Suchen ab und liefert Ergebnisse von SearchWP selbst.


