Domyślnie wyszukiwarka produktów WooCommerce przeszukuje tylko tytuły i treść opisu produktu. Aby w wyszukiwaniu uwzględnić również kategorię produktu należy w pliku functions.php
motywu dodać dwa poniższe fragmenty kodu. Pierwszy z nich tworzy klasę, która implementuje metody odpowiedzialne za wyszukiwanie wg taksonomii. Drugi fragment tworzy obiekt klasy, dla kategorii produktu.
taxonomy = $taxonomy;
$this->slug = str_replace( '-', '_', $this->taxonomy );
add_filter( 'posts_join', array( $this, 'posts_join' ) , 10, 2 );
add_filter( 'posts_where', array( $this, 'posts_where' ), 10, 2 );
add_filter( 'posts_groupby', array( $this, 'posts_groupby' ), 10, 2 );
}
public function posts_join( $join, $query ) {
global $wpdb;
if ( is_main_query() && is_search() ) {
$join .= "
LEFT JOIN
(
{$wpdb->term_relationships} AS term_relationship_search_by_taxonomy_{$this->slug}
INNER JOIN
{$wpdb->term_taxonomy} AS term_taxonomy_search_by_taxonomy_{$this->slug}
ON term_taxonomy_search_by_taxonomy_{$this->slug}.term_taxonomy_id = term_relationship_search_by_taxonomy_{$this->slug}.term_taxonomy_id
INNER JOIN
{$wpdb->terms} terms_search_by_taxonomy_{$this->slug}
ON terms_search_by_taxonomy_{$this->slug}.term_id = term_taxonomy_search_by_taxonomy_{$this->slug}.term_id
)
ON {$wpdb->posts}.ID = term_relationship_search_by_taxonomy_{$this->slug}.object_id
";
}
return $join;
}
public function posts_where( $where, $query ) {
global $wpdb;
if ( is_main_query() && is_search() ) {
$where .= " OR (
term_taxonomy_search_by_taxonomy_{$this->slug}.taxonomy = '{$this->taxonomy}'
AND (
terms_search_by_taxonomy_{$this->slug}.name LIKE '%" . $wpdb->esc_like( get_query_var( 's' ) ) . "%'
)
)";
}
return $where;
}
public function posts_groupby( $groupby, $query ) {
global $wpdb;
if ( is_main_query() && is_search() ) {
$groupby = "{$wpdb->posts}.ID";
}
return $groupby;
}
}
View the code on Gist.
Kopiując kod pomiń znacznik
<?php
- w większości przypadków nie ma potrzeby dodawania go do pliku
functions.php
.
Jeżeli nie używasz motywu potomnego pamiętaj o tym, że zmiany wprowadzone do pliku
functions.php
zostaną nadpisane podczas aktualizacji motywu.