function include_product_variations_in_search($query) {
if (!is_admin() && $query->is_main_query() && $query->is_search()) {
$query->set('post_type', array('product', 'product_variation'));
add_filter('posts_clauses', 'handle_product_variation_search_clauses', 10, 2);
}
return $query;
}
add_action('pre_get_posts', 'include_product_variations_in_search');
function handle_product_variation_search_clauses($clauses, $query) {
global $wpdb;
if (is_array($query->get('post_type')) && in_array('product_variation', $query->get('post_type'))) {
$clauses['join'] .= " LEFT JOIN {$wpdb->postmeta} as variation_meta ON ({$wpdb->posts}.ID = variation_meta.post_id AND variation_meta.meta_key LIKE 'attribute_%')";
$search_term = $query->get('s');
if (!empty($search_term)) {
$like = '%' . $wpdb->esc_like($search_term) . '%';
$clauses['where'] = str_replace(
"AND (((({$wpdb->posts}.post_title LIKE",
"AND ((({$wpdb->posts}.post_title LIKE '$like') OR (variation_meta.meta_value LIKE '$like')) OR (({$wpdb->posts}.post_title LIKE",
$clauses['where']
);
}
$clauses['groupby'] = "{$wpdb->posts}.ID";
}
return $clauses;
}
function display_variation_attributes_in_title($title, $id = null) {
if (is_search() && get_post_type($id) === 'product_variation') {
$variation = wc_get_product($id);
if ($variation) {
$attributes = $variation->get_variation_attributes();
$attr_display = array();
foreach ($attributes as $name => $value) {
$taxonomy = str_replace('attribute_', '', $name);
if (taxonomy_exists($taxonomy)) {
$term = get_term_by('slug', $value, $taxonomy);
if ($term && !is_wp_error($term)) {
$value = $term->name;
}
}
$attr_display[] = wc_attribute_label($taxonomy) . ': ' . $value;
}
if (!empty($attr_display)) {
$parent = wc_get_product($variation->get_parent_id());
$parent_title = $parent ? $parent->get_title() : '';
$title = $parent_title . ' - ' . implode(', ', $attr_display);
}
}
}
return $title;
}
add_filter('the_title', 'display_variation_attributes_in_title', 10, 2);