SearchWP Documentation

Veja o guia de instalação, navegue pela Base de Conhecimento, descubra os muitos hooks do SearchWP

Adicionar Variações de Produtos WooCommerce a Produtos

WooCommerce trata Variações de Produto de forma diferente de Produtos; eles são tipos de postagem separados. Produtos são públicos e podem ser utilizados da maneira que estamos acostumados a trabalhar com tipos de postagem, mas Variações de Produto são diferentes no sentido de que são configuradas como filhas de Produtos, mas com um tipo de postagem diferente.

É uma maneira inteligente de configurar as coisas, mas precisamos usar um pequeno trecho de código personalizado para tornar as Variações de Produto pesquisáveis.

A configuração envolverá ensinar o SearchWP sobre Variações de Produto e fazer com que o SearchWP indexe as Variações de Produto, assim como ele está indexando os Produtos pais. Armazenaremos os dados da Variação de Produto como metadados 'extras' para os Produtos, para que, quando você pesquisar por dados de Variação de Produto, o Produto correto seja retornado.

All hooks should be added to your custom SearchWP Customizations Plugin.

<?php
// Add WooCommerce Product Variation data to parent Products in SearchWP.
add_filter( 'searchwp\entry\data', function( $data, \SearchWP\Entry $entry ) {
// If this is not a Product, there's nothing to do.
if ( 'product' !== get_post_type( $entry->get_id() ) ) {
return $data;
}
$my_extra_meta_key = 'searchwp_product_variations';
// Retrieve all Variations.
$product_variations = get_posts( [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'post_parent' => $entry->get_id(),
] );
if ( empty( $product_variations ) ) {
return $data;
}
// Customize the data indexed for each Variation.
$data['meta'][ $my_extra_meta_key ] = array_filter( $product_variations, function( $variation ) {
$variation->searchwp_variation_data = [
'title' => get_the_title( $variation->ID ),
'content' => $variation->post_content,
'sku' => get_post_meta( $variation->ID, '_sku', true ),
];
return $variation;
} );
return $data;
}, 20, 2 );
// Add our Extra Meta entry to SearchWP's UI.
add_filter( 'searchwp\source\attribute\options\special', function( $keys, $args ) {
if ( $args['attribute'] !== 'meta' ) {
return $keys;
}
// This key is the same as the one used in the searchwp\entry\data hook above, they must be the same.
$my_extra_meta_key = 'searchwp_product_variations';
$option = new \SearchWP\Option( $my_extra_meta_key, 'Product Variations' );
// If there's already a match, remove it because we want ours there.
$keys = array_filter( $keys, function( $option ) use ( $my_extra_meta_key ) {
return $my_extra_meta_key !== $option->get_value();
} );
// Add "Product Variations" Option
$keys[] = $option;
return $keys;
}, 20, 2 );

Observe que o trecho indexa o seguinte para cada Variação de Produto:

  • Título
  • Conteúdo
  • SKU

Você pode adicionar/remover/personalizar esta lista de atributos para indexar qualquer conteúdo que desejar para cada Variação de Produto, depende do que você gostaria de tornar pesquisável.

Com esse trecho implementado, podemos adicionar Variações de Produto aos Campos Personalizados do nosso Motor:

Variações de produto do WooCommerce SearchWP

Depois de salvar seus Motores, o SearchWP informará que o índice precisa ser reconstruído devido a essa alteração. O índice pode ser reconstruído usando o botão Reconstruir Índice na aba Motores da tela de configurações do SearchWP.

À medida que o índice é reconstruído, o SearchWP puxará todas as Variações de Produto enquanto indexa os Produtos, tornando todos esses dados de Variação de Produto pesquisáveis e retornando o Produto pai quando uma correspondência de Variação de Produto é encontrada.

Podemos ir um pouco mais longe, se desejar. Dada a configuração acima, pesquisar por dados de Variação de Produto retornará o próprio Produto como resultado. Com esse resultado, haverá um permalink para o Produto pai, o que em muitos casos é desejável.

Há momentos em que os visitantes do site conhecem bem seus Produtos e podem estar procurando por dados específicos de Variação de Produto que você ensinou o SearchWP a indexar.

Por exemplo: se você vende TVs e tem um Produto pai "TV OLED" com várias Variações de Produto para cada tamanho de tela, por exemplo, 60". Se um cliente pesquisar por TV OLED de 60", o resultado será o Produto pai TV OLED.

Não seria ótimo vincular automaticamente à Variação de Produto de 60" quando isso acontecer? Seria, e podemos fazer exatamente isso!

All hooks should be added to your custom SearchWP Customizations Plugin.

<?php
// @link https://searchwp.com/documentation/knowledge-base/add-woocommerce-product-variations-to-products/
// When using SearchWP it's necessary to disable WooCommerce's insistance on
// automatically redirecting to a single search result without showing the
// search results page, when that happens this hook doesn't run!
// Willing to bet this can be edited to accommodate, tips are welcome!
add_filter( 'woocommerce_redirect_single_search_result', '__return_false' );
add_filter( 'post_type_link', function( $permalink, $post ) {
if ( ! is_search() || 'product' !== get_post_type( $post ) ) {
return $permalink;
}
$search_query = \SearchWP\Utils::get_string_from( get_search_query() );
// If this is a search for a Variation SKU we can bail out early.
$variation_from_sku = get_posts( [
'post_type' => 'product_variation',
'posts_per_page' => 1,
'fields' => 'ids',
'meta_query' => [ [
'key' => '_sku',
'value' => $search_query,
], ]
] );
// Make sure (if there is one) the Variation is for the parent Product.
if ( ! empty( $variation_from_sku ) ) {
// This is a Variation SKU.
$variation_id = absint( $variation_from_sku[0] );
$variation_obj = new WC_Product_Variation( $variation_id );
$attributes = $variation_obj->get_variation_attributes();
if ( empty( $attributes ) ) {
return $permalink;
}
return add_query_arg( $attributes, $permalink );
}
// Determine if this Product has any Variations.
$product_variations = get_posts( [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'fields' => 'ids',
'post_parent' => $post->ID,
] );
if ( empty( $product_variations ) || ! class_exists( 'WC_Product_Variation' ) ) {
return $permalink;
}
// Check to see if any search terms match any Variation Attributes.
foreach ( $product_variations as $variation_id ) {
$variation_obj = new \WC_Product_Variation( $variation_id );
$attributes = $variation_obj->get_variation_attributes();
if ( empty( $attributes ) ) {
continue;
}
$search_query = \SearchWP\Utils::clean_string( $search_query );
foreach ( $attributes as $attribute_tax => $attribute_value ) {
foreach ( explode( ' ', $attribute_value ) as $value ) {
$value = \SearchWP\Utils::clean_string( \SearchWP\Utils::get_string_from( $value ) );
if ( false !== strpos( $search_query, $value ) ) {
$permalink = add_query_arg( [ $attribute_tax => urlencode( $attribute_value ) ], $permalink );
continue;
}
}
}
}
return $permalink;
}, 99, 2 );

Com este trecho implementado, verificaremos quaisquer Atributos de Variação de Produto que correspondam à string de pesquisa e, quando obtivermos uma correspondência, ajustaremos o permalink para considerar automaticamente essa Variação de Atributo.

Crie uma Experiência de Pesquisa WordPress Melhor Hoje

Nunca mais perca visitantes para resultados de pesquisa inúteis. O SearchWP torna a criação de sua própria pesquisa inteligente do WordPress rápida e fácil.

Get SearchWP Now
Ícone de Múltiplos Mecanismos de Busca