Añadir variaciones de productos de WooCommerce a los productos
Tabla de contenidos
WooCommerce trata las variaciones de producto de forma diferente a los productos; son tipos de publicación separados. Los productos son públicos y se pueden utilizar de la manera a la que estamos acostumbrados a trabajar con tipos de publicación, pero las variaciones de producto son diferentes en que se configuran como hijos de los productos, pero de un tipo de publicación diferente.
Es una forma ingeniosa de configurar las cosas, pero necesitamos usar un pequeño fragmento de código personalizado para que las variaciones de producto sean buscables.
La configuración implicará enseñar a SearchWP sobre las variaciones de producto y hacer que SearchWP indexe las variaciones de producto mientras indexa los propios productos principales. Almacenaremos los datos de las variaciones de producto como metadatos 'adicionales' para los productos, de modo que cuando busque datos de variaciones de producto, se devolverá el producto adecuado.
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 ); |
Tenga en cuenta que el fragmento indexa lo siguiente para cada variación de producto:
- Título
- Contenido
- SKU
Puede añadir/eliminar/personalizar esta lista de atributos para indexar cualquier contenido que desee para cada variación de producto, depende de lo que quiera hacer buscable.
Con ese fragmento en su lugar, podemos añadir variaciones de producto a los campos personalizados de nuestro motor:
Una vez que guarde sus motores, SearchWP le informará que el índice necesita ser reconstruido debido a este cambio. El índice se puede reconstruir utilizando el botón Reconstruir índice en la pestaña Motores de la pantalla de configuración de SearchWP.
A medida que el índice se reconstruye, SearchWP extraerá todas las variaciones de producto mientras indexa los productos, haciendo que todos esos datos de variaciones de producto sean buscables y devolviendo el producto principal cuando se encuentra una coincidencia de variación de producto.
Permalinks automáticos de variaciones de producto
Podemos llevar las cosas un paso más allá si lo desea. Dada la configuración anterior, la búsqueda de datos de variaciones de producto devolverá el propio producto como resultado. Con ese resultado habrá un permalink al producto principal, lo cual en muchos casos es deseable.
Hay momentos en que los visitantes del sitio conocen bien sus productos y pueden estar buscando datos específicos de variaciones de producto que usted ha enseñado a SearchWP a indexar.
Por ejemplo: si vende televisores y tiene un producto principal "TV OLED" con una serie de variaciones de producto para cada tamaño de pantalla, por ejemplo 60". Si un cliente busca TV OLED de 60", el resultado sería el producto principal TV OLED.
¿No sería genial enlazar automáticamente a la variación de producto 60" cuando eso suceda? ¡Lo sería, y podemos hacer exactamente eso!
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 ); |
Con este fragmento en su lugar, comprobaremos si hay algún atributo de variación de producto que coincida con la cadena de búsqueda y, cuando obtengamos un acierto, ajustaremos el permalink para considerar automáticamente ese atributo de variación.


