SearchWP Documentation

Consultez le guide d’installation, parcourez la base de connaissances, découvrez les nombreux hooks de SearchWP

Ajouter des variations de produits WooCommerce aux produits

WooCommerce traite les variations de produits différemment des produits ; ce sont des types de publication distincts. Les produits sont publics et peuvent être utilisés de la manière habituelle avec les types de publication, mais les variations de produits sont différentes en ce sens qu'elles sont configurées comme des enfants de produits, mais avec un type de publication différent.

C'est une façon élégante de configurer les choses, mais nous avons besoin d'un petit bout de code personnalisé pour rendre les variations de produits consultables.

La configuration impliquera d'enseigner à SearchWP les variations de produits, et de faire indexer les variations de produits par SearchWP comme il indexe les produits parents eux-mêmes. Nous stockerons les données des variations de produits comme métadonnées « supplémentaires » pour les produits, de sorte que lorsque vous recherchez des données de variations de produits, le produit approprié sera renvoyé.

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 );

Notez que l'extrait indexe ce qui suit pour chaque variation de produit :

  • Titre
  • Contenu
  • SKU

Vous pouvez ajouter/supprimer/personnaliser cette liste d'attributs pour indexer le contenu que vous souhaitez pour chaque variation de produit, cela dépend de ce que vous souhaitez rendre consultable.

Avec cet extrait en place, nous pouvons ajouter des variations de produits aux champs personnalisés de notre moteur :

Variations de produits WooCommerce SearchWP

Une fois que vous avez enregistré vos moteurs, SearchWP vous informera que l'index doit être reconstruit en raison de ce changement. L'index peut être reconstruit en utilisant le bouton Reconstruire l'index dans l'onglet Moteurs de l'écran des paramètres de SearchWP.

Pendant la reconstruction de l'index, SearchWP récupérera toutes les variations de produits lors de l'indexation des produits, rendant toutes ces données de variations de produits consultables et renvoyant le produit parent lorsqu'une correspondance de variation de produit est trouvée.

Nous pouvons aller plus loin si vous le souhaitez. Compte tenu de la configuration ci-dessus, la recherche de données de variations de produits renverra le produit lui-même comme résultat. Avec ce résultat, il y aura un permalien vers le produit parent, ce qui, dans de nombreux cas, est souhaitable.

Il arrive que les visiteurs du site soient très bien informés sur vos produits et recherchent des données spécifiques de variations de produits que vous avez appris à SearchWP à indexer.

Par exemple : si vous vendez des téléviseurs et que vous avez un produit parent « TV OLED » avec un certain nombre de variations de produits pour chaque taille d'écran, par exemple 60 pouces. Si un client recherche TV OLED 60 pouces, le résultat serait le produit parent TV OLED.

Ne serait-il pas formidable de lier automatiquement la variation de produit 60 pouces lorsque cela se produit ? Ce serait le cas, et nous pouvons faire exactement cela !

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 );

Avec cet extrait en place, nous vérifierons les attributs de variation de produit qui correspondent à la chaîne de recherche, et lorsque nous obtiendrons une correspondance, nous ajusterons le permalien pour prendre en compte automatiquement cet attribut de variation.

Créez dès aujourd'hui une meilleure expérience de recherche WordPress

Ne perdez plus jamais de visiteurs à cause de résultats de recherche inutiles. SearchWP rend la création de votre propre recherche WordPress intelligente rapide et facile.

Get SearchWP Now
Icône de moteurs de recherche multiples