Domyślne wyszukiwanie produktów w interfejsie WooCommerce zwraca wyniki na podstawie tego, czy wyszukiwane hasło znajduje się w tytule, krótkim i długim opisie produktu.
Aby zmienić wyszukiwarkę WooCommerce, aby korzystała tylko z tytułu, będziesz musiał zmodyfikować zapytanie SQL, które WooCommerce generuje, gdy użytkownik wprowadza frazę w wyszukiwarce. Możesz to zrobić, dodając filtr do twojego pliku funkcji motywu.
function search_by_title_only( $search, $wp_query ) { if ( ! empty( $search ) && ! empty( $wp_query->query_vars['s'] ) ) { global $wpdb; $q = $wp_query->query_vars; $n = ! empty( $q['exact'] ) ? '' : '%'; $search = ''; $searchand = ''; foreach ( (array) $q['search_terms'] as $term ) { $term = $wpdb->esc_like( $term ); $search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')"; $searchand = ' AND '; } if ( ! empty( $search ) ) { $search = " AND ({$search}) "; if ( ! is_user_logged_in() ) $search .= " AND ($wpdb->posts.post_password = '') "; } } return $search; } add_filter( 'posts_search', 'search_by_title_only', 10, 2 );
Ten kod zmodyfikuje zapytanie SQL generowane przez WooCommerce, tak aby wyszukiwanie odbywało się tylko na podstawie tytułów produktów. Pamiętaj, że ten kod powinien być dodany do pliku functions.php w twoim motywie dziecka, aby uniknąć utraty zmian podczas aktualizacji motywu.
Jeśli chcesz modyfikować zapytanie tylko dla produktów WooCommerce a zostawiając normalne wyszukiwanie np w postach, możesz to zrobić dodając dodatkowe warunki do funkcji filtrującej. Poniżej znajduje się zmodyfikowany kod:
function search_by_title_only( $search, $wp_query ) { if ( ! empty( $search ) && ! empty( $wp_query->query_vars['s'] ) ) { global $wpdb; // Dodajemy warunek, który sprawdza, czy zapytanie dotyczy produktów if ($wp_query->query_vars['post_type'] != 'product') { return $search; // Jeśli to nie jest produkt, zwracamy oryginalne zapytanie } $q = $wp_query->query_vars; $n = ! empty( $q['exact'] ) ? '' : '%'; $search = ''; $searchand = ''; foreach ( (array) $q['search_terms'] as $term ) { $term = $wpdb->esc_like( $term ); $search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')"; $searchand = ' AND '; } if ( ! empty( $search ) ) { $search = " AND ({$search}) "; if ( ! is_user_logged_in() ) $search .= " AND ($wpdb->posts.post_password = '') "; } } return $search; } add_filter( 'posts_search', 'search_by_title_only', 10, 2 );
Ten kod sprawdzi, czy zapytanie dotyczy produktów, a jeśli nie, zwróci oryginalne zapytanie. Jeśli zapytanie dotyczy produktu, zostanie zmodyfikowane tak, aby wyszukiwanie odbywało się tylko na podstawie tytułu.
Podobnie jak poprzednio, ten kod powinien być dodany do pliku functions.php w twoim motywie potomnym, aby uniknąć utraty zmian podczas aktualizacji motywu. I zawsze warto zrobić kopię zapasową plików i bazy danych przed wprowadzaniem takich zmian, a także przetestować zmiany na stronie testowej lub w środowisku rozwojowym, zanim wprowadzisz je na stronę na żywo.